On 10/08/2014, 03:26 PM, Johannes Weiner wrote: > Hi Greg, > > the following should apply all the way back to 3.12. Thanks! > > --- > > From 1eedd7e702d68d9cb364ca32264dce26f675969b Mon Sep 17 00:00:00 2001 > From: Johannes Weiner <hannes@xxxxxxxxxxx> > Date: Thu, 2 Oct 2014 00:00:41 +0000 > Subject: [patch] mm: page_alloc: fix zone allocation fairness on UP > > commit abe5f972912d086c080be4bde67750630b6fb38b upstream. > > The zone allocation batches can easily underflow due to higher-order > allocations or spills to remote nodes. On SMP that's fine, because > underflows are expected from concurrency and dealt with by returning 0. > But on UP, zone_page_state will just return a wrapped unsigned long, which > will get past the <= 0 check and then consider the zone eligible until its > watermarks are hit. > > 3a025760fc15 ("mm: page_alloc: spill to remote nodes before waking > kswapd") already made the counter-resetting use atomic_long_read() to > accomodate underflows from remote spills, but it didn't go all the way > with it. Make it clear that these batches are expected to go negative > regardless of concurrency, and use atomic_long_read() everywhere. > > Fixes: 81c0a2bb515f ("mm: page_alloc: fair zone allocator policy") > Reported-by: Vlastimil Babka <vbabka@xxxxxxx> > Reported-by: Leon Romanovsky <leon@xxxxxxx> > Signed-off-by: Johannes Weiner <hannes@xxxxxxxxxxx> > Acked-by: Mel Gorman <mgorman@xxxxxxx> > Cc: <stable@xxxxxxxxxxxxxxx> [3.12+] > Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> > --- > mm/page_alloc.c | 7 +++---- > 1 file changed, 3 insertions(+), 4 deletions(-) > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index a280f772bc66..eccad8b618fc 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -1938,7 +1938,7 @@ zonelist_scan: > if (alloc_flags & ALLOC_FAIR) { > if (!zone_local(preferred_zone, zone)) > continue; > - if (zone_page_state(zone, NR_ALLOC_BATCH) <= 0) > + if (atomic_long_read(&zone->vm_stat[NR_ALLOC_BATCH]) <= 0) > continue; > } > /* Hi, this does not apply to 3.12. It looks like this in there: if (alloc_flags & ALLOC_FAIR) { if (!zone_local(preferred_zone, zone)) break; if (zone_is_fair_depleted(zone)) { nr_fair_skipped++; continue; } } How should I resolve that conflict? thanks, -- js suse labs -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html