The patch titled Subject: mm-compaction-pass-classzone_idx-and-alloc_flags-to-watermark-checking-fix has been added to the -mm tree. Its filename is mm-compaction-pass-classzone_idx-and-alloc_flags-to-watermark-checking-fix.patch This patch should soon appear at http://ozlabs.org/~akpm/mmots/broken-out/mm-compaction-pass-classzone_idx-and-alloc_flags-to-watermark-checking-fix.patch echo and later at echo http://ozlabs.org/~akpm/mmotm/broken-out/mm-compaction-pass-classzone_idx-and-alloc_flags-to-watermark-checking-fix.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/SubmitChecklist when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: Vlastimil Babka <vbabka@xxxxxxx> Subject: mm-compaction-pass-classzone_idx-and-alloc_flags-to-watermark-checking-fix This patch-fix changes zone watermark checking in compaction_suitable() as we discussed with Joonsoo Kim. First, it moves up the watermark check for answering the question "does the zone need compaction at all?". Before this change, the check is preceded by a check that answers the question "does the zone have enough free pages to succeed compaction". So it might happen that there is already a high-order page available, but not enough pages for performing the compaction (which assumes extra pages for the migrations). Before the patch, compaction_suitable() would return COMPACT_SKIPPED which means "compaction cannot succeed, reclaim more", after this change it returns COMPACT_PARTIAL which means "compaction not needed, try allocating". Second, the check for answering "can the compaction succeed?" now also includes classzone_idx and alloc_flags parameters. This prevents starting compaction that would not lead to successful allocation due to not having enough free pages. The addition of extra pages for migration is left in the check. Although these are temporary allocations and thus should not be affected by alloc_flags and classzone_idx, it only matters when we are close to the watermark, where it does not hurt to be a bit pessimistic. Signed-off-by: Vlastimil Babka <vbabka@xxxxxxx> Cc: Minchan Kim <minchan@xxxxxxxxxx> Cc: Mel Gorman <mgorman@xxxxxxx> Cc: Joonsoo Kim <iamjoonsoo.kim@xxxxxxx> Cc: Michal Nazarewicz <mina86@xxxxxxxxxx> Cc: Naoya Horiguchi <n-horiguchi@xxxxxxxxxxxxx> Cc: Christoph Lameter <cl@xxxxxxxxx> Cc: Rik van Riel <riel@xxxxxxxxxx> Cc: David Rientjes <rientjes@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- mm/compaction.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff -puN mm/compaction.c~mm-compaction-pass-classzone_idx-and-alloc_flags-to-watermark-checking-fix mm/compaction.c --- a/mm/compaction.c~mm-compaction-pass-classzone_idx-and-alloc_flags-to-watermark-checking-fix +++ a/mm/compaction.c @@ -1127,21 +1127,30 @@ unsigned long compaction_suitable(struct if (order == -1) return COMPACT_CONTINUE; + watermark = low_wmark_pages(zone); + /* + * If watermarks for high-order allocation are already met, there + * should be no need for compaction at all. + */ + if (zone_watermark_ok(zone, order, watermark, classzone_idx, + alloc_flags)) + return COMPACT_PARTIAL; + /* * Watermarks for order-0 must be met for compaction. Note the 2UL. * This is because during migration, copies of pages need to be * allocated and for a short time, the footprint is higher */ - watermark = low_wmark_pages(zone) + (2UL << order); - if (!zone_watermark_ok(zone, 0, watermark, 0, 0)) + watermark += (2UL << order); + if (!zone_watermark_ok(zone, 0, watermark, classzone_idx, alloc_flags)) return COMPACT_SKIPPED; /* * fragmentation index determines if allocation failures are due to * low memory or external fragmentation * - * index of -1000 implies allocations might succeed depending on - * watermarks + * index of -1000 would imply allocations might succeed depending on + * watermarks, but we already failed the high-order watermark check * index towards 0 implies failure is due to lack of memory * index towards 1000 implies failure is due to fragmentation * @@ -1151,10 +1160,6 @@ unsigned long compaction_suitable(struct if (fragindex >= 0 && fragindex <= sysctl_extfrag_threshold) return COMPACT_SKIPPED; - if (fragindex == -1000 && zone_watermark_ok(zone, order, watermark, - classzone_idx, alloc_flags)) - return COMPACT_PARTIAL; - return COMPACT_CONTINUE; } _ Patches currently in -mm which might be from vbabka@xxxxxxx are mm-introduce-single-zone-pcplists-drain.patch mm-page_isolation-drain-single-zone-pcplists.patch mm-cma-drain-single-zone-pcplists.patch mm-memory_hotplug-failure-drain-single-zone-pcplists.patch mm-compaction-pass-classzone_idx-and-alloc_flags-to-watermark-checking.patch mm-compaction-pass-classzone_idx-and-alloc_flags-to-watermark-checking-fix.patch mm-compaction-simplify-deferred-compaction.patch mm-compaction-simplify-deferred-compaction-fix.patch mm-compaction-defer-only-on-compact_complete.patch mm-compaction-always-update-cached-scanner-positions.patch mm-compaction-always-update-cached-scanner-positions-fix.patch mm-compaction-always-update-cached-scanner-positions-fix-checkpatch-fixes.patch mm-compaction-more-focused-lru-and-pcplists-draining.patch mm-debug-pagealloc-cleanup-page-guard-code.patch mm-page_alloc-store-updated-page-migratetype-to-avoid-misusing-stale-value.patch mm-page_alloc-store-updated-page-migratetype-to-avoid-misusing-stale-value-fix.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html