]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
quicklists: Only consider memory that can be used with GFP_KERNEL
authorChristoph Lameter <clameter@sgi.com>
Sun, 17 Feb 2008 17:18:24 +0000 (18:18 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 25 Feb 2008 23:59:21 +0000 (15:59 -0800)
patch 96990a4ae979df9e235d01097d6175759331e88c in mainline.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Oliver Pinter <oliver.pntr@gmail.com>
mm/quicklist.c

index ae8189c2799e99d936c01b76330b607593980a73..3f703f7cb398056547af212577909a3d6c46b116 100644 (file)
@@ -26,9 +26,17 @@ DEFINE_PER_CPU(struct quicklist, quicklist)[CONFIG_NR_QUICK];
 static unsigned long max_pages(unsigned long min_pages)
 {
        unsigned long node_free_pages, max;
+       struct zone *zones = NODE_DATA(numa_node_id())->node_zones;
+
+       node_free_pages =
+#ifdef CONFIG_ZONE_DMA
+               zone_page_state(&zones[ZONE_DMA], NR_FREE_PAGES) +
+#endif
+#ifdef CONFIG_ZONE_DMA32
+               zone_page_state(&zones[ZONE_DMA32], NR_FREE_PAGES) +
+#endif
+               zone_page_state(&zones[ZONE_NORMAL], NR_FREE_PAGES);
 
-       node_free_pages = node_page_state(numa_node_id(),
-                       NR_FREE_PAGES);
        max = node_free_pages / FRACTION_OF_NODE_MEM;
        return max(max, min_pages);
 }