zsmalloc: Fix CPU hotplug callback registration
authorSrivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Mon, 10 Mar 2014 20:39:59 +0000 (02:09 +0530)
committerAlex Shi <alex.shi@linaro.org>
Mon, 11 May 2015 12:40:31 +0000 (20:40 +0800)
commitcda631acb964bb521add32cd60db08f43a23835c
treeaee55551dbd2cb8c6d11c8d857b1d11214145b86
parent30e87174bf64cdce17005dc7fe031ea1aab98161
zsmalloc: 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 zsmalloc code by using this latter form of callback registration.

Cc: Nitin Gupta <ngupta@vflare.org>
Cc: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Acked-by: Minchan Kim <minchan@kernel.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
(cherry picked from commit f0e71fcd0fa6f3f5495cd9ad3f1e4acd94446a55)
Signed-off-by: Alex Shi <alex.shi@linaro.org>
mm/zsmalloc.c