On Fri, Oct 31, 2014 at 11:43:01AM +0100, Jiri Slaby wrote: > 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)) { Mel's missing patches were the original source of conflict why this backport didn't apply to 3.12. Now that they went in, my modified backport no longer applies, but the original patch does again :-) You can just cherry-pick abe5f972912d086c080be4bde67750630b6fb38b without any conflicts now: $ git describe v3.12.31 $ git cherry-pick abe5f972912d086c080be4bde67750630b6fb38b [linux-3.12.y dc39abfd895a] mm: page_alloc: fix zone allocation fairness on UP Date: Thu Oct 2 16:21:10 2014 -0700 1 file changed, 3 insertions(+), 4 deletions(-) Thanks! -- 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