|
@@ -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;
|
|
|
|