|
@@ -66,6 +66,12 @@ struct cpuhp_cpu_state {
|
|
|
|
|
|
static DEFINE_PER_CPU(struct cpuhp_cpu_state, cpuhp_state);
|
|
|
|
|
|
+#if defined(CONFIG_LOCKDEP) && defined(CONFIG_SMP)
|
|
|
+static struct lock_class_key cpuhp_state_key;
|
|
|
+static struct lockdep_map cpuhp_state_lock_map =
|
|
|
+ STATIC_LOCKDEP_MAP_INIT("cpuhp_state", &cpuhp_state_key);
|
|
|
+#endif
|
|
|
+
|
|
|
/**
|
|
|
* cpuhp_step - Hotplug state machine step
|
|
|
* @name: Name of the step
|
|
@@ -403,6 +409,7 @@ static void cpuhp_thread_fun(unsigned int cpu)
|
|
|
|
|
|
st->should_run = false;
|
|
|
|
|
|
+ lock_map_acquire(&cpuhp_state_lock_map);
|
|
|
/* Single callback invocation for [un]install ? */
|
|
|
if (st->single) {
|
|
|
if (st->cb_state < CPUHP_AP_ONLINE) {
|
|
@@ -429,6 +436,7 @@ static void cpuhp_thread_fun(unsigned int cpu)
|
|
|
else if (st->state > st->target)
|
|
|
ret = cpuhp_ap_offline(cpu, st);
|
|
|
}
|
|
|
+ lock_map_release(&cpuhp_state_lock_map);
|
|
|
st->result = ret;
|
|
|
complete(&st->done);
|
|
|
}
|
|
@@ -443,6 +451,9 @@ cpuhp_invoke_ap_callback(int cpu, enum cpuhp_state state, bool bringup,
|
|
|
if (!cpu_online(cpu))
|
|
|
return 0;
|
|
|
|
|
|
+ lock_map_acquire(&cpuhp_state_lock_map);
|
|
|
+ lock_map_release(&cpuhp_state_lock_map);
|
|
|
+
|
|
|
/*
|
|
|
* If we are up and running, use the hotplug thread. For early calls
|
|
|
* we invoke the thread function directly.
|
|
@@ -486,6 +497,8 @@ static int cpuhp_kick_ap_work(unsigned int cpu)
|
|
|
enum cpuhp_state state = st->state;
|
|
|
|
|
|
trace_cpuhp_enter(cpu, st->target, state, cpuhp_kick_ap_work);
|
|
|
+ lock_map_acquire(&cpuhp_state_lock_map);
|
|
|
+ lock_map_release(&cpuhp_state_lock_map);
|
|
|
__cpuhp_kick_ap_work(st);
|
|
|
wait_for_completion(&st->done);
|
|
|
trace_cpuhp_exit(cpu, st->state, state, st->result);
|