From: Ma Wupeng <mawupeng1@xxxxxxxxxx> Since min_free_kbytes is based on gfp_zone(GFP_USER) which does not include zone movable. However zone movable will get its min share in __setup_per_zone_wmarks() which does not make any sense. And like highmem pages, __GFP_HIGH and PF_MEMALLOC allocations usually don't need movable pages, so there is no need to assign min pages for zone movable. Let's cap pages_min for zone movable to a small value here just link highmem pages. Signed-off-by: Ma Wupeng <mawupeng1@xxxxxxxxxx> --- mm/page_alloc.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index e5486d47406e..f1e4474879f1 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -8636,9 +8636,9 @@ static void __setup_per_zone_wmarks(void) struct zone *zone; unsigned long flags; - /* Calculate total number of !ZONE_HIGHMEM pages */ + /* Calculate total number of none highmem/movable pages */ for_each_zone(zone) { - if (!is_highmem(zone)) + if (!is_highmem(zone) && zone_idx(zone) != ZONE_MOVABLE) lowmem_pages += zone_managed_pages(zone); } @@ -8648,15 +8648,15 @@ static void __setup_per_zone_wmarks(void) spin_lock_irqsave(&zone->lock, flags); tmp = (u64)pages_min * zone_managed_pages(zone); do_div(tmp, lowmem_pages); - if (is_highmem(zone)) { + if (is_highmem(zone) || zone_idx(zone) == ZONE_MOVABLE) { /* * __GFP_HIGH and PF_MEMALLOC allocations usually don't - * need highmem pages, so cap pages_min to a small - * value here. + * need highmem/movable pages, so cap pages_min to a + * small value here. * * The WMARK_HIGH-WMARK_LOW and (WMARK_LOW-WMARK_MIN) * deltas control async page reclaim, and so should - * not be capped for highmem. + * not be capped for highmem/movable zone. */ unsigned long min_pages; -- 2.25.1