Messages in this thread Patches in this message | | | Date | Fri, 5 Sep 2014 11:14:51 +0100 | From | Mel Gorman <> | Subject | [PATCH] mm: page_alloc: Fix setting of ZONE_FAIR_DEPLETED on UP |
| |
Commit 4ffeaf35 (mm: page_alloc: reduce cost of the fair zone allocation policy) broke the fair zone allocation policy on UP with these hunks.
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 6e5e8f7..fb99081 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1612,6 +1612,9 @@ again: }
__mod_zone_page_state(zone, NR_ALLOC_BATCH, -(1 << order)); + if (zone_page_state(zone, NR_ALLOC_BATCH) == 0 && + !zone_is_fair_depleted(zone)) + zone_set_flag(zone, ZONE_FAIR_DEPLETED);
__count_zone_vm_events(PGALLOC, zone, 1 << order); zone_statistics(preferred_zone, zone, gfp_flags); @@ -1966,8 +1985,10 @@ zonelist_scan: if (alloc_flags & ALLOC_FAIR) { if (!zone_local(preferred_zone, zone)) break; - if (zone_page_state(zone, NR_ALLOC_BATCH) <= 0) + if (zone_is_fair_depleted(zone)) { + nr_fair_skipped++; continue; + } }
The problem is that a <= check was replaced with a ==. On SMP it doesn't matter because negative values are returned as zero due to per-CPU drift which is not possible in the UP case. Vlastimil Babka correctly pointed out that this can be negative due to high-order allocations. This patch fixes the problem.
Reported-by: Vlastimil Babka <vbabka@suse.cz> Signed-off-by: Mel Gorman <mgorman@suse.de> --- mm/page_alloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 18cee0d..cd4c05c 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1612,7 +1612,7 @@ again: } __mod_zone_page_state(zone, NR_ALLOC_BATCH, -(1 << order)); - if (zone_page_state(zone, NR_ALLOC_BATCH) == 0 && + if (zone_page_state(zone, NR_ALLOC_BATCH) <= 0 && !zone_is_fair_depleted(zone)) zone_set_flag(zone, ZONE_FAIR_DEPLETED);
| |