Hi Johannes, On Wed, Oct 08, 2014 at 09:26:04AM -0400, Johannes Weiner wrote: > Hi Greg, > > the following should apply all the way back to 3.12. Thanks! > I see your backport has never made its way into the 3.16 kernel. Does it still make sense to apply it, or was there a reason for not applying it? Cheers, -- Luís > --- > > 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; > } > /* > @@ -5607,9 +5607,8 @@ static void __setup_per_zone_wmarks(void) > zone->watermark[WMARK_HIGH] = min_wmark_pages(zone) + (tmp >> 1); > > __mod_zone_page_state(zone, NR_ALLOC_BATCH, > - high_wmark_pages(zone) - > - low_wmark_pages(zone) - > - zone_page_state(zone, NR_ALLOC_BATCH)); > + high_wmark_pages(zone) - low_wmark_pages(zone) - > + atomic_long_read(&zone->vm_stat[NR_ALLOC_BATCH])); > > setup_zone_migrate_reserve(zone); > spin_unlock_irqrestore(&zone->lock, flags); > -- > 2.1.2 > -- > 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 -- 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