Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

quicklists: Only consider memory that can be used with GFP_KERNEL

Quicklists calculates the size of the quicklists based on the number of
free pages. This must be the number of free pages that can be allocated
with GFP_KERNEL. node_page_state() includes the pages in ZONE_HIGHMEM and
ZONE_MOVABLE which may lead the quicklists to become too large causing OOM.

Signed-off-by: Christoph Lameter <clameter@sgi.com>
Tested-by: Dhaval Giani <dhaval@linux.vnet.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Christoph Lameter and committed by
Linus Torvalds
96990a4a 8f4c79ce

+10 -2
+10 -2
mm/quicklist.c
··· 26 26 static unsigned long max_pages(unsigned long min_pages) 27 27 { 28 28 unsigned long node_free_pages, max; 29 + struct zone *zones = NODE_DATA(numa_node_id())->node_zones; 29 30 30 - node_free_pages = node_page_state(numa_node_id(), 31 - NR_FREE_PAGES); 31 + node_free_pages = 32 + #ifdef CONFIG_ZONE_DMA 33 + zone_page_state(&zones[ZONE_DMA], NR_FREE_PAGES) + 34 + #endif 35 + #ifdef CONFIG_ZONE_DMA32 36 + zone_page_state(&zones[ZONE_DMA32], NR_FREE_PAGES) + 37 + #endif 38 + zone_page_state(&zones[ZONE_NORMAL], NR_FREE_PAGES); 39 + 32 40 max = node_free_pages / FRACTION_OF_NODE_MEM; 33 41 return max(max, min_pages); 34 42 }