X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fi386%2Fkernel%2Ftopology.c;fp=arch%2Fi386%2Fkernel%2Ftopology.c;h=67a0e1baa28b2467a5a540772e6c0d88927c9ea8;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=e2e281d4bcc80ee7bc3b090e75914606231e6224;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/arch/i386/kernel/topology.c b/arch/i386/kernel/topology.c index e2e281d4b..67a0e1baa 100644 --- a/arch/i386/kernel/topology.c +++ b/arch/i386/kernel/topology.c @@ -32,24 +32,30 @@ static struct i386_cpu cpu_devices[NR_CPUS]; -int arch_register_cpu(int num) -{ - /* - * CPU0 cannot be offlined due to several - * restrictions and assumptions in kernel. This basically - * doesnt add a control file, one cannot attempt to offline - * BSP. - */ - if (!num) - cpu_devices[num].cpu.no_control = 1; - - return register_cpu(&cpu_devices[num].cpu, 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 */ + + 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 +65,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);