X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fi386%2Fkernel%2Ftopology.c;h=296355292c7c56433df1c849e93851985a7798d3;hb=9464c7cf61b9433057924c36e6e02f303a00e768;hp=e2e281d4bcc80ee7bc3b090e75914606231e6224;hpb=41689045f6a3cbe0550e1d34e9cc20d2e8c432ba;p=linux-2.6.git diff --git a/arch/i386/kernel/topology.c b/arch/i386/kernel/topology.c index e2e281d4b..296355292 100644 --- a/arch/i386/kernel/topology.c +++ b/arch/i386/kernel/topology.c @@ -32,8 +32,15 @@ static struct i386_cpu cpu_devices[NR_CPUS]; -int arch_register_cpu(int num) -{ +int arch_register_cpu(int num){ + struct node *parent = NULL; + +#ifdef CONFIG_NUMA + int node = cpu_to_node(num); + if (node_online(node)) + parent = &node_devices[node].node; +#endif /* CONFIG_NUMA */ + /* * CPU0 cannot be offlined due to several * restrictions and assumptions in kernel. This basically @@ -43,13 +50,21 @@ int arch_register_cpu(int num) if (!num) cpu_devices[num].cpu.no_control = 1; - return register_cpu(&cpu_devices[num].cpu, num); + return register_cpu(&cpu_devices[num].cpu, num, parent); } #ifdef CONFIG_HOTPLUG_CPU void arch_unregister_cpu(int num) { - return unregister_cpu(&cpu_devices[num].cpu); + struct node *parent = NULL; + +#ifdef CONFIG_NUMA + int node = cpu_to_node(num); + if (node_online(node)) + parent = &node_devices[node].node; +#endif /* CONFIG_NUMA */ + + return unregister_cpu(&cpu_devices[num].cpu, parent); } EXPORT_SYMBOL(arch_register_cpu); EXPORT_SYMBOL(arch_unregister_cpu); @@ -59,13 +74,16 @@ EXPORT_SYMBOL(arch_unregister_cpu); #ifdef CONFIG_NUMA #include +#include + +struct i386_node node_devices[MAX_NUMNODES]; static int __init topology_init(void) { int i; for_each_online_node(i) - register_one_node(i); + arch_register_node(i); for_each_present_cpu(i) arch_register_cpu(i);