|
@@ -133,6 +133,27 @@ static void cpu_hotplug_done(void)
|
|
|
mutex_unlock(&cpu_hotplug.lock);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Wait for currently running CPU hotplug operations to complete (if any) and
|
|
|
+ * disable future CPU hotplug (from sysfs). The 'cpu_add_remove_lock' protects
|
|
|
+ * the 'cpu_hotplug_disabled' flag. The same lock is also acquired by the
|
|
|
+ * hotplug path before performing hotplug operations. So acquiring that lock
|
|
|
+ * guarantees mutual exclusion from any currently running hotplug operations.
|
|
|
+ */
|
|
|
+void cpu_hotplug_disable(void)
|
|
|
+{
|
|
|
+ cpu_maps_update_begin();
|
|
|
+ cpu_hotplug_disabled = 1;
|
|
|
+ cpu_maps_update_done();
|
|
|
+}
|
|
|
+
|
|
|
+void cpu_hotplug_enable(void)
|
|
|
+{
|
|
|
+ cpu_maps_update_begin();
|
|
|
+ cpu_hotplug_disabled = 0;
|
|
|
+ cpu_maps_update_done();
|
|
|
+}
|
|
|
+
|
|
|
#else /* #if CONFIG_HOTPLUG_CPU */
|
|
|
static void cpu_hotplug_begin(void) {}
|
|
|
static void cpu_hotplug_done(void) {}
|
|
@@ -540,36 +561,6 @@ static int __init alloc_frozen_cpus(void)
|
|
|
}
|
|
|
core_initcall(alloc_frozen_cpus);
|
|
|
|
|
|
-/*
|
|
|
- * Prevent regular CPU hotplug from racing with the freezer, by disabling CPU
|
|
|
- * hotplug when tasks are about to be frozen. Also, don't allow the freezer
|
|
|
- * to continue until any currently running CPU hotplug operation gets
|
|
|
- * completed.
|
|
|
- * To modify the 'cpu_hotplug_disabled' flag, we need to acquire the
|
|
|
- * 'cpu_add_remove_lock'. And this same lock is also taken by the regular
|
|
|
- * CPU hotplug path and released only after it is complete. Thus, we
|
|
|
- * (and hence the freezer) will block here until any currently running CPU
|
|
|
- * hotplug operation gets completed.
|
|
|
- */
|
|
|
-void cpu_hotplug_disable_before_freeze(void)
|
|
|
-{
|
|
|
- cpu_maps_update_begin();
|
|
|
- cpu_hotplug_disabled = 1;
|
|
|
- cpu_maps_update_done();
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-/*
|
|
|
- * When tasks have been thawed, re-enable regular CPU hotplug (which had been
|
|
|
- * disabled while beginning to freeze tasks).
|
|
|
- */
|
|
|
-void cpu_hotplug_enable_after_thaw(void)
|
|
|
-{
|
|
|
- cpu_maps_update_begin();
|
|
|
- cpu_hotplug_disabled = 0;
|
|
|
- cpu_maps_update_done();
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* When callbacks for CPU hotplug notifications are being executed, we must
|
|
|
* ensure that the state of the system with respect to the tasks being frozen
|
|
@@ -589,12 +580,12 @@ cpu_hotplug_pm_callback(struct notifier_block *nb,
|
|
|
|
|
|
case PM_SUSPEND_PREPARE:
|
|
|
case PM_HIBERNATION_PREPARE:
|
|
|
- cpu_hotplug_disable_before_freeze();
|
|
|
+ cpu_hotplug_disable();
|
|
|
break;
|
|
|
|
|
|
case PM_POST_SUSPEND:
|
|
|
case PM_POST_HIBERNATION:
|
|
|
- cpu_hotplug_enable_after_thaw();
|
|
|
+ cpu_hotplug_enable();
|
|
|
break;
|
|
|
|
|
|
default:
|