x86/numa: Allow specifying node_distance() for numa=fake
authorPeter Zijlstra <a.p.zijlstra@chello.nl>
Wed, 18 Apr 2012 17:04:17 +0000 (19:04 +0200)
committerIngo Molnar <mingo@kernel.org>
Wed, 9 May 2012 11:28:59 +0000 (13:28 +0200)
Allows emulating more interesting NUMA configurations like a quad
socket AMD Magny-Cour:

 "numa=fake=8:10,16,16,22,16,22,16,22,
              16,10,22,16,22,16,22,16,
              16,22,10,16,16,22,16,22,
              22,16,16,10,22,16,22,16,
              16,22,16,22,10,16,16,22,
              22,16,22,16,16,10,22,16,
              16,22,16,22,16,22,10,16,
              22,16,22,16,22,16,16,10"

Which has a non-fully-connected topology.

Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Tejun Heo <tj@kernel.org>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: x86@kernel.org
Link: http://lkml.kernel.org/n/tip-e1136ef7kdffj7yf9tjhydln@git.kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/mm/numa_emulation.c

index 53489ff6bf82319e0dc2c44a788e1430df4f4352..871dd886817014597fadfb273a895dd0893c9595 100644 (file)
@@ -339,9 +339,11 @@ void __init numa_emulation(struct numa_meminfo *numa_meminfo, int numa_dist_cnt)
        } else {
                unsigned long n;
 
-               n = simple_strtoul(emu_cmdline, NULL, 0);
+               n = simple_strtoul(emu_cmdline, &emu_cmdline, 0);
                ret = split_nodes_interleave(&ei, &pi, 0, max_addr, n);
        }
+       if (*emu_cmdline == ':')
+               emu_cmdline++;
 
        if (ret < 0)
                goto no_emu;
@@ -418,7 +420,9 @@ void __init numa_emulation(struct numa_meminfo *numa_meminfo, int numa_dist_cnt)
                        int physj = emu_nid_to_phys[j];
                        int dist;
 
-                       if (physi >= numa_dist_cnt || physj >= numa_dist_cnt)
+                       if (get_option(&emu_cmdline, &dist) == 2)
+                               ;
+                       else if (physi >= numa_dist_cnt || physj >= numa_dist_cnt)
                                dist = physi == physj ?
                                        LOCAL_DISTANCE : REMOTE_DISTANCE;
                        else