X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=drivers%2Fbase%2Ftopology.c;h=e1d3ad4db2f04355631efd8120946c07313789c8;hb=160acc2e899f26356bde92bc257253b7ca78f0c3;hp=28dccb730af99032a9bf653990b604df35ff29b9;hpb=752c58a471c108d64da1676b2925dfbd83eb177e;p=linux-2.6 diff --git a/drivers/base/topology.c b/drivers/base/topology.c index 28dccb730a..e1d3ad4db2 100644 --- a/drivers/base/topology.c +++ b/drivers/base/topology.c @@ -95,53 +95,54 @@ static struct attribute_group topology_attr_group = { }; /* Add/Remove cpu_topology interface for CPU device */ -static int __cpuinit topology_add_dev(struct sys_device * sys_dev) +static int __cpuinit topology_add_dev(unsigned int cpu) { + struct sys_device *sys_dev = get_cpu_sysdev(cpu); + return sysfs_create_group(&sys_dev->kobj, &topology_attr_group); } -static int __cpuinit topology_remove_dev(struct sys_device * sys_dev) +static void __cpuinit topology_remove_dev(unsigned int cpu) { + struct sys_device *sys_dev = get_cpu_sysdev(cpu); + sysfs_remove_group(&sys_dev->kobj, &topology_attr_group); - return 0; } static int __cpuinit topology_cpu_callback(struct notifier_block *nfb, - unsigned long action, void *hcpu) + unsigned long action, void *hcpu) { unsigned int cpu = (unsigned long)hcpu; - struct sys_device *sys_dev; + int rc = 0; - sys_dev = get_cpu_sysdev(cpu); switch (action) { - case CPU_ONLINE: - topology_add_dev(sys_dev); + case CPU_UP_PREPARE: + case CPU_UP_PREPARE_FROZEN: + rc = topology_add_dev(cpu); break; + case CPU_UP_CANCELED: + case CPU_UP_CANCELED_FROZEN: case CPU_DEAD: - topology_remove_dev(sys_dev); + case CPU_DEAD_FROZEN: + topology_remove_dev(cpu); break; } - return NOTIFY_OK; + return rc ? NOTIFY_BAD : NOTIFY_OK; } -static struct notifier_block __cpuinitdata topology_cpu_notifier = -{ - .notifier_call = topology_cpu_callback, -}; - static int __cpuinit topology_sysfs_init(void) { - int i; + int cpu; + int rc; - for_each_online_cpu(i) { - topology_cpu_callback(&topology_cpu_notifier, CPU_ONLINE, - (void *)(long)i); + for_each_online_cpu(cpu) { + rc = topology_add_dev(cpu); + if (rc) + return rc; } - - register_hotcpu_notifier(&topology_cpu_notifier); + hotcpu_notifier(topology_cpu_callback, 0); return 0; } device_initcall(topology_sysfs_init); -