|
@@ -1459,7 +1459,7 @@ unlock:
|
|
|
EXPORT_SYMBOL_GPL(__cpuhp_state_add_instance);
|
|
|
|
|
|
/**
|
|
|
- * __cpuhp_setup_state - Setup the callbacks for an hotplug machine state
|
|
|
+ * __cpuhp_setup_state_cpuslocked - Setup the callbacks for an hotplug machine state
|
|
|
* @state: The state to setup
|
|
|
* @invoke: If true, the startup function is invoked for cpus where
|
|
|
* cpu state >= @state
|
|
@@ -1468,25 +1468,27 @@ EXPORT_SYMBOL_GPL(__cpuhp_state_add_instance);
|
|
|
* @multi_instance: State is set up for multiple instances which get
|
|
|
* added afterwards.
|
|
|
*
|
|
|
+ * The caller needs to hold cpus read locked while calling this function.
|
|
|
* Returns:
|
|
|
* On success:
|
|
|
* Positive state number if @state is CPUHP_AP_ONLINE_DYN
|
|
|
* 0 for all other states
|
|
|
* On failure: proper (negative) error code
|
|
|
*/
|
|
|
-int __cpuhp_setup_state(enum cpuhp_state state,
|
|
|
- const char *name, bool invoke,
|
|
|
- int (*startup)(unsigned int cpu),
|
|
|
- int (*teardown)(unsigned int cpu),
|
|
|
- bool multi_instance)
|
|
|
+int __cpuhp_setup_state_cpuslocked(enum cpuhp_state state,
|
|
|
+ const char *name, bool invoke,
|
|
|
+ int (*startup)(unsigned int cpu),
|
|
|
+ int (*teardown)(unsigned int cpu),
|
|
|
+ bool multi_instance)
|
|
|
{
|
|
|
int cpu, ret = 0;
|
|
|
bool dynstate;
|
|
|
|
|
|
+ lockdep_assert_cpus_held();
|
|
|
+
|
|
|
if (cpuhp_cb_check(state) || !name)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- cpus_read_lock();
|
|
|
mutex_lock(&cpuhp_state_mutex);
|
|
|
|
|
|
ret = cpuhp_store_callbacks(state, name, startup, teardown,
|
|
@@ -1522,7 +1524,6 @@ int __cpuhp_setup_state(enum cpuhp_state state,
|
|
|
}
|
|
|
out:
|
|
|
mutex_unlock(&cpuhp_state_mutex);
|
|
|
- cpus_read_unlock();
|
|
|
/*
|
|
|
* If the requested state is CPUHP_AP_ONLINE_DYN, return the
|
|
|
* dynamically allocated state in case of success.
|
|
@@ -1531,6 +1532,22 @@ out:
|
|
|
return state;
|
|
|
return ret;
|
|
|
}
|
|
|
+EXPORT_SYMBOL(__cpuhp_setup_state_cpuslocked);
|
|
|
+
|
|
|
+int __cpuhp_setup_state(enum cpuhp_state state,
|
|
|
+ const char *name, bool invoke,
|
|
|
+ int (*startup)(unsigned int cpu),
|
|
|
+ int (*teardown)(unsigned int cpu),
|
|
|
+ bool multi_instance)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ cpus_read_lock();
|
|
|
+ ret = __cpuhp_setup_state_cpuslocked(state, name, invoke, startup,
|
|
|
+ teardown, multi_instance);
|
|
|
+ cpus_read_unlock();
|
|
|
+ return ret;
|
|
|
+}
|
|
|
EXPORT_SYMBOL(__cpuhp_setup_state);
|
|
|
|
|
|
int __cpuhp_state_remove_instance(enum cpuhp_state state,
|
|
@@ -1572,22 +1589,23 @@ remove:
|
|
|
EXPORT_SYMBOL_GPL(__cpuhp_state_remove_instance);
|
|
|
|
|
|
/**
|
|
|
- * __cpuhp_remove_state - Remove the callbacks for an hotplug machine state
|
|
|
+ * __cpuhp_remove_state_cpuslocked - Remove the callbacks for an hotplug machine state
|
|
|
* @state: The state to remove
|
|
|
* @invoke: If true, the teardown function is invoked for cpus where
|
|
|
* cpu state >= @state
|
|
|
*
|
|
|
+ * The caller needs to hold cpus read locked while calling this function.
|
|
|
* The teardown callback is currently not allowed to fail. Think
|
|
|
* about module removal!
|
|
|
*/
|
|
|
-void __cpuhp_remove_state(enum cpuhp_state state, bool invoke)
|
|
|
+void __cpuhp_remove_state_cpuslocked(enum cpuhp_state state, bool invoke)
|
|
|
{
|
|
|
struct cpuhp_step *sp = cpuhp_get_step(state);
|
|
|
int cpu;
|
|
|
|
|
|
BUG_ON(cpuhp_cb_check(state));
|
|
|
|
|
|
- cpus_read_lock();
|
|
|
+ lockdep_assert_cpus_held();
|
|
|
|
|
|
mutex_lock(&cpuhp_state_mutex);
|
|
|
if (sp->multi_instance) {
|
|
@@ -1615,6 +1633,13 @@ void __cpuhp_remove_state(enum cpuhp_state state, bool invoke)
|
|
|
remove:
|
|
|
cpuhp_store_callbacks(state, NULL, NULL, NULL, false);
|
|
|
mutex_unlock(&cpuhp_state_mutex);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(__cpuhp_remove_state_cpuslocked);
|
|
|
+
|
|
|
+void __cpuhp_remove_state(enum cpuhp_state state, bool invoke)
|
|
|
+{
|
|
|
+ cpus_read_lock();
|
|
|
+ __cpuhp_remove_state_cpuslocked(state, invoke);
|
|
|
cpus_read_unlock();
|
|
|
}
|
|
|
EXPORT_SYMBOL(__cpuhp_remove_state);
|