The patch titled Subject: mm/compaction: use proper zoneid for compaction_suitable() has been added to the -mm tree. Its filename is mm-compaction-use-proper-zoneid-for-compaction_suitable.patch This patch should soon appear at http://ozlabs.org/~akpm/mmots/broken-out/mm-compaction-use-proper-zoneid-for-compaction_suitable.patch and later at http://ozlabs.org/~akpm/mmotm/broken-out/mm-compaction-use-proper-zoneid-for-compaction_suitable.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/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: Yafang Shao <laoar.shao@xxxxxxxxx> Subject: mm/compaction: use proper zoneid for compaction_suitable() There are presently three compaction paths: - direct compaction - kcompactd compcation - proc triggered compaction When we do compaction in all these paths, we use compaction_suitable() to check whether a zone is suitable to do compaction. There're some issues around the usage of compaction_suitable(). We don't use the proper zoneid in kcompactd_node_suitable() when try to wakeup kcompactd. In the kcompactd compaction paths, we call compaction_suitable() twice and the zoneid isn't proper in the second call. For proc triggered compaction, the classzone_idx is always zero. In order to fix these issues, I change the type of classzone_idx in the struct compact_control from const int to int and assign the proper zoneid before calling compact_zone(). This patch also fixes some comments in struct compact_control, as these fields are not only for direct compactor but also for all other compactors. Link: http://lkml.kernel.org/r/1564062621-8105-1-git-send-email-laoar.shao@xxxxxxxxx Fixes: ebff398017c6("mm, compaction: pass classzone_idx and alloc_flags to watermark checking") Fixes: 698b1b30642f("mm, compaction: introduce kcompactd") Signed-off-by: Yafang Shao <laoar.shao@xxxxxxxxx> Cc: Vlastimil Babka <vbabka@xxxxxxx> Cc: Arnd Bergmann <arnd@xxxxxxxx> Cc: Paul Gortmaker <paul.gortmaker@xxxxxxxxxxxxx> Cc: Rik van Riel <riel@xxxxxxxxxx> Cc: Yafang Shao <shaoyafang@xxxxxxxxxxxxxx> Cc: Mel Gorman <mgorman@xxxxxxxxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- mm/compaction.c | 12 +++++------- mm/internal.h | 10 +++++----- 2 files changed, 10 insertions(+), 12 deletions(-) --- a/mm/compaction.c~mm-compaction-use-proper-zoneid-for-compaction_suitable +++ a/mm/compaction.c @@ -2427,6 +2427,7 @@ static void compact_node(int nid) continue; cc.zone = zone; + cc.classzone_idx = zoneid; compact_zone(&cc, NULL); @@ -2510,7 +2511,7 @@ static bool kcompactd_node_suitable(pg_d continue; if (compaction_suitable(zone, pgdat->kcompactd_max_order, 0, - classzone_idx) == COMPACT_CONTINUE) + zoneid) == COMPACT_CONTINUE) return true; } @@ -2528,7 +2529,6 @@ static void kcompactd_do_work(pg_data_t struct compact_control cc = { .order = pgdat->kcompactd_max_order, .search_order = pgdat->kcompactd_max_order, - .classzone_idx = pgdat->kcompactd_classzone_idx, .mode = MIGRATE_SYNC_LIGHT, .ignore_skip_hint = false, .gfp_mask = GFP_KERNEL, @@ -2537,7 +2537,7 @@ static void kcompactd_do_work(pg_data_t cc.classzone_idx); count_compact_event(KCOMPACTD_WAKE); - for (zoneid = 0; zoneid <= cc.classzone_idx; zoneid++) { + for (zoneid = 0; zoneid <= pgdat->kcompactd_classzone_idx; zoneid++) { int status; zone = &pgdat->node_zones[zoneid]; @@ -2547,14 +2547,12 @@ static void kcompactd_do_work(pg_data_t if (compaction_deferred(zone, cc.order)) continue; - if (compaction_suitable(zone, cc.order, 0, zoneid) != - COMPACT_CONTINUE) - continue; - if (kthread_should_stop()) return; cc.zone = zone; + cc.classzone_idx = zoneid; + status = compact_zone(&cc, NULL); if (status == COMPACT_SUCCESS) { --- a/mm/internal.h~mm-compaction-use-proper-zoneid-for-compaction_suitable +++ a/mm/internal.h @@ -190,11 +190,11 @@ struct compact_control { unsigned long total_free_scanned; unsigned short fast_search_fail;/* failures to use free list searches */ short search_order; /* order to start a fast search at */ - const gfp_t gfp_mask; /* gfp mask of a direct compactor */ - int order; /* order a direct compactor needs */ - int migratetype; /* migratetype of direct compactor */ - const unsigned int alloc_flags; /* alloc flags of a direct compactor */ - const int classzone_idx; /* zone index of a direct compactor */ + const gfp_t gfp_mask; /* gfp mask of a compactor */ + int order; /* order a compactor needs */ + int migratetype; /* migratetype of a compactor */ + const unsigned int alloc_flags; /* alloc flags of a compactor */ + int classzone_idx; /* zone index of a compactor */ enum migrate_mode mode; /* Async or sync migration mode */ bool ignore_skip_hint; /* Scan blocks even if marked skip */ bool no_set_skip_hint; /* Don't mark blocks for skipping */ _ Patches currently in -mm which might be from laoar.shao@xxxxxxxxx are mm-vmscan-expose-cgroup_ino-for-memcg-reclaim-tracepoints.patch mm-compaction-clear-total_migratefree_scanned-before-scanning-a-new-zone.patch mm-compaction-clear-total_migratefree_scanned-before-scanning-a-new-zone-fix.patch mm-compaction-use-proper-zoneid-for-compaction_suitable.patch