[PATCH] Profiling: require buffer allocation on the correct node
Christoph Lameter [Tue, 26 Sep 2006 06:31:45 +0000 (23:31 -0700)]
Profiling really suffers with off node buffers.  Fail if no memory is
available on the nodes.  The profiling code can deal with these failures
should they occur.

Signed-off-by: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

kernel/profile.c

index d5bd75e..fb660c7 100644 (file)
@@ -309,13 +309,17 @@ static int __devinit profile_cpu_callback(struct notifier_block *info,
                node = cpu_to_node(cpu);
                per_cpu(cpu_profile_flip, cpu) = 0;
                if (!per_cpu(cpu_profile_hits, cpu)[1]) {
-                       page = alloc_pages_node(node, GFP_KERNEL | __GFP_ZERO, 0);
+                       page = alloc_pages_node(node,
+                                       GFP_KERNEL | __GFP_ZERO | GFP_THISNODE,
+                                       0);
                        if (!page)
                                return NOTIFY_BAD;
                        per_cpu(cpu_profile_hits, cpu)[1] = page_address(page);
                }
                if (!per_cpu(cpu_profile_hits, cpu)[0]) {
-                       page = alloc_pages_node(node, GFP_KERNEL | __GFP_ZERO, 0);
+                       page = alloc_pages_node(node,
+                                       GFP_KERNEL | __GFP_ZERO | GFP_THISNODE,
+                                       0);
                        if (!page)
                                goto out_free;
                        per_cpu(cpu_profile_hits, cpu)[0] = page_address(page);
@@ -491,12 +495,16 @@ static int __init create_hash_tables(void)
                int node = cpu_to_node(cpu);
                struct page *page;
 
-               page = alloc_pages_node(node, GFP_KERNEL | __GFP_ZERO, 0);
+               page = alloc_pages_node(node,
+                               GFP_KERNEL | __GFP_ZERO | GFP_THISNODE,
+                               0);
                if (!page)
                        goto out_cleanup;
                per_cpu(cpu_profile_hits, cpu)[1]
                                = (struct profile_hit *)page_address(page);
-               page = alloc_pages_node(node, GFP_KERNEL | __GFP_ZERO, 0);
+               page = alloc_pages_node(node,
+                               GFP_KERNEL | __GFP_ZERO | GFP_THISNODE,
+                               0);
                if (!page)
                        goto out_cleanup;
                per_cpu(cpu_profile_hits, cpu)[0]