You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
cpu-hotplug: convert cpu_hotplug_disabled to a counter
As a prerequisite to exporting cpu_hotplug_enable/cpu_hotplug_disable functions to modules we need to convert cpu_hotplug_disabled to a counter to properly support disable -> disable -> enable call sequences. E.g. after Hyper-V vmbus module (which is supposed to be the first user of exported cpu_hotplug_enable/cpu_hotplug_disable) did cpu_hotplug_disable() hibernate path calls disable_nonboot_cpus() and if we hit an error in _cpu_down() enable_nonboot_cpus() will be called on the failure path (thus making cpu_hotplug_disabled = 0 and leaving cpu hotplug in 'enabled' state). Same problem is possible if more than 1 module use cpu_hotplug_disable/cpu_hotplug_enable on their load/unload paths. When one of these modules is been unloaded it is logical to leave cpu hotplug in 'disabled' state. To support the change we need to increse cpu_hotplug_disabled counter in disable_nonboot_cpus() unconditionally as all users of disable_nonboot_cpus() are supposed to do enable_nonboot_cpus() in case an error was returned. Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
54bf725e5d
commit
89af7ba574
+13
-8
@@ -191,14 +191,14 @@ void cpu_hotplug_done(void)
|
||||
void cpu_hotplug_disable(void)
|
||||
{
|
||||
cpu_maps_update_begin();
|
||||
cpu_hotplug_disabled = 1;
|
||||
cpu_hotplug_disabled++;
|
||||
cpu_maps_update_done();
|
||||
}
|
||||
|
||||
void cpu_hotplug_enable(void)
|
||||
{
|
||||
cpu_maps_update_begin();
|
||||
cpu_hotplug_disabled = 0;
|
||||
WARN_ON(--cpu_hotplug_disabled < 0);
|
||||
cpu_maps_update_done();
|
||||
}
|
||||
|
||||
@@ -608,13 +608,18 @@ int disable_nonboot_cpus(void)
|
||||
}
|
||||
}
|
||||
|
||||
if (!error) {
|
||||
if (!error)
|
||||
BUG_ON(num_online_cpus() > 1);
|
||||
/* Make sure the CPUs won't be enabled by someone else */
|
||||
cpu_hotplug_disabled = 1;
|
||||
} else {
|
||||
else
|
||||
pr_err("Non-boot CPUs are not disabled\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure the CPUs won't be enabled by someone else. We need to do
|
||||
* this even in case of failure as all disable_nonboot_cpus() users are
|
||||
* supposed to do enable_nonboot_cpus() on the failure path.
|
||||
*/
|
||||
cpu_hotplug_disabled++;
|
||||
|
||||
cpu_maps_update_done();
|
||||
return error;
|
||||
}
|
||||
@@ -633,7 +638,7 @@ void __ref enable_nonboot_cpus(void)
|
||||
|
||||
/* Allow everyone to use the CPU hotplug again */
|
||||
cpu_maps_update_begin();
|
||||
cpu_hotplug_disabled = 0;
|
||||
WARN_ON(--cpu_hotplug_disabled < 0);
|
||||
if (cpumask_empty(frozen_cpus))
|
||||
goto out;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user