aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSrivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>2014-03-10 16:35:46 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2014-03-20 08:43:41 -0400
commit6575080e671f3675a4c47b61c38556d54e028ca8 (patch)
treef178aaaf24d878c5295991bfe35916173203c42a
parent8146875de7d47c632921ea8284097a1ff0601ee7 (diff)
s390, cacheinfo: 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 cacheinfo code in s390 by using this latter form of callback registration. Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Heiko Carstens <heiko.carstens@de.ibm.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>
-rw-r--r--arch/s390/kernel/cache.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/arch/s390/kernel/cache.c b/arch/s390/kernel/cache.c
index 3a414c0f93ed..c0b03c28d157 100644
--- a/arch/s390/kernel/cache.c
+++ b/arch/s390/kernel/cache.c
@@ -378,9 +378,12 @@ static int __init cache_init(void)
378 if (!test_facility(34)) 378 if (!test_facility(34))
379 return 0; 379 return 0;
380 cache_build_info(); 380 cache_build_info();
381
382 cpu_notifier_register_begin();
381 for_each_online_cpu(cpu) 383 for_each_online_cpu(cpu)
382 cache_add_cpu(cpu); 384 cache_add_cpu(cpu);
383 hotcpu_notifier(cache_hotplug, 0); 385 __hotcpu_notifier(cache_hotplug, 0);
386 cpu_notifier_register_done();
384 return 0; 387 return 0;
385} 388}
386device_initcall(cache_init); 389device_initcall(cache_init);