[PATCH] x86-64: split remaining fake nodes equally
authorDavid Rientjes <rientjes@google.com>
Wed, 2 May 2007 17:27:09 +0000 (19:27 +0200)
committerAndi Kleen <andi@basil.nowhere.org>
Wed, 2 May 2007 17:27:09 +0000 (19:27 +0200)
Extends the numa=fake x86_64 command-line option to split the remaining
system memory into equal-sized nodes.

For example:
numa=fake=2*512,4* gives two 512M nodes and the remaining system
memory is split into four approximately equal
chunks.

This is beneficial for systems where the exact size of RAM is unknown or not
necessarily relevant, but the granularity with which nodes shall be allocated
is known.

Cc: Andi Kleen <ak@suse.de>
Signed-off-by: David Rientjes <rientjes@google.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Cc: Paul Jackson <pj@sgi.com>
Cc: Christoph Lameter <clameter@engr.sgi.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Documentation/x86_64/boot-options.txt
arch/x86_64/mm/numa.c

index 7500aad95f3ceaf70a0d546488c9231751731f3c..12a9aacecaaeb65b0db9ff40e99b198b2c8fbba6 100644 (file)
@@ -155,7 +155,9 @@ NUMA
                depending on the sizes and coefficients listed.  For example:
                        numa=fake=2*512,1024,4*256
                gives two 512M nodes, a 1024M node, and four 256M nodes.  The
-               remaining system RAM is allocated to an additional node.
+               remaining system RAM is allocated to an additional node.  If
+               the last character of CMDLINE is a *, the remaining system RAM
+               is instead divided up equally among its coefficient.
 
   numa=hotadd=percent
                Only allow hotadd memory to preallocate page structures upto
index c55936bc6be64cf9dc8854e34edee4e55ca83d65..0ae2d9d5d7eae9c8ee0069429f5ffb4897887bca 100644 (file)
@@ -418,11 +418,25 @@ static int __init numa_emulation(unsigned long start_pfn, unsigned long end_pfn)
 done:
        if (!num_nodes)
                return -1;
-       /* Fill remainder of system RAM with a final node, if appropriate. */
+       /* Fill remainder of system RAM, if appropriate. */
        if (addr < max_addr) {
-               setup_node_range(num_nodes, nodes, &addr, max_addr - addr,
-                                max_addr);
-               num_nodes++;
+               switch (*(cmdline - 1)) {
+               case '*':
+                       /* Split remaining nodes into coeff chunks */
+                       if (coeff <= 0)
+                               break;
+                       num_nodes += split_nodes_equally(nodes, &addr, max_addr,
+                                                        num_nodes, coeff);
+                       break;
+               case ',':
+                       /* Do not allocate remaining system RAM */
+                       break;
+               default:
+                       /* Give one final node */
+                       setup_node_range(num_nodes, nodes, &addr,
+                                        max_addr - addr, max_addr);
+                       num_nodes++;
+               }
        }
 out:
        memnode_shift = compute_hash_shift(nodes, num_nodes);