• Tomasz Stanislawski's avatar
    mm/page_alloc.c: fix watermark check in __zone_watermark_ok() · 026b0814
    Tomasz Stanislawski authored
    The watermark check consists of two sub-checks.  The first one is:
    
    	if (free_pages <= min + lowmem_reserve)
    		return false;
    
    The check assures that there is minimal amount of RAM in the zone.  If
    CMA is used then the free_pages is reduced by the number of free pages
    in CMA prior to the over-mentioned check.
    
    	if (!(alloc_flags & ALLOC_CMA))
    		free_pages -= zone_page_state(z, NR_FREE_CMA_PAGES);
    
    This prevents the zone from being drained from pages available for
    non-movable allocations.
    
    The second check prevents the zone from getting too fragmented.
    
    	for (o = 0; o < order; o++) {
    		free_pages -= z->free_area[o].nr_free << o;
    		min >>= 1;
    		if (free_pages <= min)
    			return false;
    	}
    
    The field z->free_area[o].nr_free is equal to the number of free pages
    including free CMA pages.  Therefore the CMA pages are subtracted twice.
    This may cause a false positive fail of __zone_watermark_ok() if the CMA
    area gets strongly fragmented.  In such a case there are many 0-order
    free pages located in CMA.  Those pages are subtracted twice therefore
    they will quickly drain free_pages during the check against
    fragmentation.  The test fails even though there are many free non-cma
    pages in the zone.
    
    This patch fixes this issue by subtracting CMA pages only for a purpose of
    (free_pages <= min + lowmem_reserve) check.
    
    Laura said:
    
      We were observing allocation failures of higher order pages (order 5 =
      128K typically) under tight memory conditions resulting in driver
      failure.  The output from the page allocation failure showed plenty of
      free pages of the appropriate order/type/zone and mostly CMA pages in
      the lower orders.
    
      For full disclosure, we still observed some page allocation failures
      even after applying the patch but the number was drastically reduced and
      those failures were attributed to fragmentation/other system issues.
    Signed-off-by: default avatarTomasz Stanislawski <t.stanislaws@samsung.com>
    Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
    Tested-by: default avatarLaura Abbott <lauraa@codeaurora.org>
    Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Mel Gorman <mel@csn.ul.ie>
    Tested-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
    Cc: <stable@vger.kernel.org>	[3.7+]
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    026b0814
page_alloc.c 172 KB