aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64
diff options
context:
space:
mode:
authorSrivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>2014-03-10 16:34:58 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2014-03-20 08:43:40 -0400
commitf5a7d445ffb6b251dc41942ffe41f515e8d639a4 (patch)
tree821f3304e880e4cd48fef4793ea5a02a7185d07b /arch/ia64
parent9f37bca9a9e97fcd7589492aba7b8a5310026c47 (diff)
ia64, topology: Fix CPU hotplug callback registration
Subsystems that want to register CPU hotplug callbacks, as well as perform initialization for the CPUs that are already online, often do it as shown below: get_online_cpus(); for_each_online_cpu(cpu) init_cpu(cpu); register_cpu_notifier(&foobar_cpu_notifier); put_online_cpus(); This is wrong, since it is prone to ABBA deadlocks involving the cpu_add_remove_lock and the cpu_hotplug.lock (when running concurrently with CPU hotplug operations). Instead, the correct and race-free way of performing the callback registration is: cpu_notifier_register_begin(); for_each_online_cpu(cpu) init_cpu(cpu); /* Note the use of the double underscored version of the API */ __register_cpu_notifier(&foobar_cpu_notifier); cpu_notifier_register_done(); Fix the topology code in ia64 by using this latter form of callback registration. Cc: Tony Luck <tony.luck@intel.com> Cc: Fenghua Yu <fenghua.yu@intel.com> Cc: Ingo Molnar <mingo@kernel.org> Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'arch/ia64')
-rw-r--r--arch/ia64/kernel/topology.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/arch/ia64/kernel/topology.c b/arch/ia64/kernel/topology.c
index ca69a5a96dcc..f295f9abba4b 100644
--- a/arch/ia64/kernel/topology.c
+++ b/arch/ia64/kernel/topology.c
@@ -454,12 +454,16 @@ static int __init cache_sysfs_init(void)
454{ 454{
455 int i; 455 int i;
456 456
457 cpu_notifier_register_begin();
458
457 for_each_online_cpu(i) { 459 for_each_online_cpu(i) {
458 struct device *sys_dev = get_cpu_device((unsigned int)i); 460 struct device *sys_dev = get_cpu_device((unsigned int)i);
459 cache_add_dev(sys_dev); 461 cache_add_dev(sys_dev);
460 } 462 }
461 463
462 register_hotcpu_notifier(&cache_cpu_notifier); 464 __register_hotcpu_notifier(&cache_cpu_notifier);
465
466 cpu_notifier_register_done();
463 467
464 return 0; 468 return 0;
465} 469}