Re: [PATCH 8/9] mm: compaction: Cache if a pageblock was scanned and no pages were isolated
From: Andrew Morton <akpm@linux-foundation.org>
Date: 2012-09-25 20:03:56
Also in:
kvm, lkml, qemu-devel
On Tue, 25 Sep 2012 10:12:07 +0100 Mel Gorman [off-list ref] wrote:
First, we'd introduce a variant of get_pageblock_migratetype() that returns all the bits for the pageblock flags and then helpers to extract either the migratetype or the PG_migrate_skip. We already are incurring the cost of get_pageblock_migratetype() so it will not be much more expensive than what is already there. If there is an allocation or free within a pageblock that as the PG_migrate_skip bit set then we increment a counter. When the counter reaches some to-be-decided "threshold" then compaction may clear all the bits. This would match the criteria of the clearing being based on activity. There are four potential problems with this 1. The logic to retrieve all the bits and split them up will be a little convulated but maybe it would not be that bad. 2. The counter is a shared-writable cache line but obviously it could be moved to vmstat and incremented with inc_zone_page_state to offset the cost a little. 3. The biggested weakness is that there is not way to know if the counter is incremented based on activity in a small subset of blocks. 4. What should the threshold be? The first problem is minor but the other three are potentially a mess. Adding another vmstat counter is bad enough in itself but if the counter is incremented based on a small subsets of pageblocks, the hint becomes is potentially useless. However, does this match what you have in mind or am I over-complicating things?
Sounds complicated. Using wall time really does suck. Are you sure you can't think of something more logical? How would we demonstrate the suckage? What would be the observeable downside of switching that 5 seconds to 5 hours?
quoted
quoted
quoted
quoted
+ for (pfn = start_pfn; pfn < end_pfn; pfn += pageblock_nr_pages) { + struct page *page; + if (!pfn_valid(pfn)) + continue; + + page = pfn_to_page(pfn); + if (zone != page_zone(page)) + continue; + + clear_pageblock_skip(page); + }What's the worst-case loop count here?zone->spanned_pages >> pageblock_orderWhat's the worst-case value of (zone->spanned_pages >> pageblock_order) :)Lets take an unlikely case - 128G single-node machine. That loop count on x86-64 would be 65536. It'll be fast enough, particularly in this path.
That could easily exceed a millisecond. Can/should we stick a cond_resched() in there? -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>