Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=1daa6d08d1257aa61f376c3cc4795660877fb9e3
Commit:     1daa6d08d1257aa61f376c3cc4795660877fb9e3
Parent:     7dbb922cea70897dd0e76c6cf8a300b061ca2531
Author:     Balbir Singh <[EMAIL PROTECTED]>
AuthorDate: Fri Feb 1 15:57:31 2008 +1100
Committer:  Paul Mackerras <[EMAIL PROTECTED]>
CommitDate: Thu Feb 7 11:40:19 2008 +1100

    [POWERPC] Fake NUMA emulation for PowerPC
    
    Here's a dumb simple implementation of fake NUMA nodes for PowerPC.
    Fake NUMA nodes can be specified using the following command line
    option
    
    numa=fake=<node range>
    
    node range is of the format <range1>,<range2>,...<rangeN>
    
    Each of the rangeX parameters is passed using memparse().  I find the
    patch useful for fake NUMA emulation on my simple PowerPC machine.
    I've tested it on a numa box with the following arguments
    
    numa=fake=512M
    numa=fake=512M,768M
    numa=fake=256M,512M mem=512M
    numa=fake=1G mem=768M
    numa=fake=
    without any numa= argument
    
    The other side-effect introduced by this patch is that; in the case
    where we don't have NUMA information, we now set a node online after
    adding each LMB.  This node could very well be node 0, but in the case
    that we enable fake NUMA nodes, when we cross node boundaries, we need
    to set the new node online.
    
    Signed-off-by: Balbir Singh <[EMAIL PROTECTED]>
    Signed-off-by: Paul Mackerras <[EMAIL PROTECTED]>
---
 arch/powerpc/mm/numa.c |   66 +++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 63 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
index c12adc3..e9139d2 100644
--- a/arch/powerpc/mm/numa.c
+++ b/arch/powerpc/mm/numa.c
@@ -24,6 +24,8 @@
 
 static int numa_enabled = 1;
 
+static char *cmdline __initdata;
+
 static int numa_debug;
 #define dbg(args...) if (numa_debug) { printk(KERN_INFO args); }
 
@@ -39,6 +41,53 @@ static bootmem_data_t __initdata 
plat_node_bdata[MAX_NUMNODES];
 static int min_common_depth;
 static int n_mem_addr_cells, n_mem_size_cells;
 
+static int __cpuinit fake_numa_create_new_node(unsigned long end_pfn,
+                                               unsigned int *nid)
+{
+       unsigned long long mem;
+       char *p = cmdline;
+       static unsigned int fake_nid;
+       static unsigned long long curr_boundary;
+
+       /*
+        * Modify node id, iff we started creating NUMA nodes
+        * We want to continue from where we left of the last time
+        */
+       if (fake_nid)
+               *nid = fake_nid;
+       /*
+        * In case there are no more arguments to parse, the
+        * node_id should be the same as the last fake node id
+        * (we've handled this above).
+        */
+       if (!p)
+               return 0;
+
+       mem = memparse(p, &p);
+       if (!mem)
+               return 0;
+
+       if (mem < curr_boundary)
+               return 0;
+
+       curr_boundary = mem;
+
+       if ((end_pfn << PAGE_SHIFT) > mem) {
+               /*
+                * Skip commas and spaces
+                */
+               while (*p == ',' || *p == ' ' || *p == '\t')
+                       p++;
+
+               cmdline = p;
+               fake_nid++;
+               *nid = fake_nid;
+               dbg("created new fake_node with id %d\n", fake_nid);
+               return 1;
+       }
+       return 0;
+}
+
 static void __cpuinit map_cpu_to_node(int cpu, int node)
 {
        numa_cpu_lookup_table[cpu] = node;
@@ -344,6 +393,9 @@ static void __init parse_drconf_memory(struct device_node 
*memory)
                        if (nid == 0xffff || nid >= MAX_NUMNODES)
                                nid = default_nid;
                }
+
+               fake_numa_create_new_node(((start + lmb_size) >> PAGE_SHIFT),
+                                               &nid);
                node_set_online(nid);
 
                size = numa_enforce_memory_limit(start, lmb_size);
@@ -429,6 +481,8 @@ new_range:
                nid = of_node_to_nid_single(memory);
                if (nid < 0)
                        nid = default_nid;
+
+               fake_numa_create_new_node(((start + size) >> PAGE_SHIFT), &nid);
                node_set_online(nid);
 
                if (!(size = numa_enforce_memory_limit(start, size))) {
@@ -461,7 +515,7 @@ static void __init setup_nonnuma(void)
        unsigned long top_of_ram = lmb_end_of_DRAM();
        unsigned long total_ram = lmb_phys_mem_size();
        unsigned long start_pfn, end_pfn;
-       unsigned int i;
+       unsigned int i, nid = 0;
 
        printk(KERN_DEBUG "Top of RAM: 0x%lx, Total RAM: 0x%lx\n",
               top_of_ram, total_ram);
@@ -471,9 +525,11 @@ static void __init setup_nonnuma(void)
        for (i = 0; i < lmb.memory.cnt; ++i) {
                start_pfn = lmb.memory.region[i].base >> PAGE_SHIFT;
                end_pfn = start_pfn + lmb_size_pages(&lmb.memory, i);
-               add_active_range(0, start_pfn, end_pfn);
+
+               fake_numa_create_new_node(end_pfn, &nid);
+               add_active_range(nid, start_pfn, end_pfn);
+               node_set_online(nid);
        }
-       node_set_online(0);
 }
 
 void __init dump_numa_cpu_topology(void)
@@ -702,6 +758,10 @@ static int __init early_numa(char *p)
        if (strstr(p, "debug"))
                numa_debug = 1;
 
+       p = strstr(p, "fake=");
+       if (p)
+               cmdline = p + strlen("fake=");
+
        return 0;
 }
 early_param("numa", early_numa);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to