diff options
Diffstat (limited to 'kernel/cpu.c')
-rw-r--r-- | kernel/cpu.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/kernel/cpu.c b/kernel/cpu.c index 7b61887f7ccd..341bf80f80bd 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c | |||
@@ -517,6 +517,13 @@ static int cpuhp_invoke_ap_callback(int cpu, enum cpuhp_state state, | |||
517 | if (!cpu_online(cpu)) | 517 | if (!cpu_online(cpu)) |
518 | return 0; | 518 | return 0; |
519 | 519 | ||
520 | /* | ||
521 | * If we are up and running, use the hotplug thread. For early calls | ||
522 | * we invoke the thread function directly. | ||
523 | */ | ||
524 | if (!st->thread) | ||
525 | return cpuhp_invoke_callback(cpu, state, cb); | ||
526 | |||
520 | st->cb_state = state; | 527 | st->cb_state = state; |
521 | st->cb = cb; | 528 | st->cb = cb; |
522 | /* | 529 | /* |
@@ -1173,6 +1180,31 @@ static struct cpuhp_step cpuhp_bp_states[] = { | |||
1173 | .teardown = NULL, | 1180 | .teardown = NULL, |
1174 | .cant_stop = true, | 1181 | .cant_stop = true, |
1175 | }, | 1182 | }, |
1183 | [CPUHP_PERF_PREPARE] = { | ||
1184 | .name = "perf prepare", | ||
1185 | .startup = perf_event_init_cpu, | ||
1186 | .teardown = perf_event_exit_cpu, | ||
1187 | }, | ||
1188 | [CPUHP_WORKQUEUE_PREP] = { | ||
1189 | .name = "workqueue prepare", | ||
1190 | .startup = workqueue_prepare_cpu, | ||
1191 | .teardown = NULL, | ||
1192 | }, | ||
1193 | [CPUHP_HRTIMERS_PREPARE] = { | ||
1194 | .name = "hrtimers prepare", | ||
1195 | .startup = hrtimers_prepare_cpu, | ||
1196 | .teardown = hrtimers_dead_cpu, | ||
1197 | }, | ||
1198 | [CPUHP_SMPCFD_PREPARE] = { | ||
1199 | .name = "SMPCFD prepare", | ||
1200 | .startup = smpcfd_prepare_cpu, | ||
1201 | .teardown = smpcfd_dead_cpu, | ||
1202 | }, | ||
1203 | [CPUHP_RCUTREE_PREP] = { | ||
1204 | .name = "RCU-tree prepare", | ||
1205 | .startup = rcutree_prepare_cpu, | ||
1206 | .teardown = rcutree_dead_cpu, | ||
1207 | }, | ||
1176 | /* | 1208 | /* |
1177 | * Preparatory and dead notifiers. Will be replaced once the notifiers | 1209 | * Preparatory and dead notifiers. Will be replaced once the notifiers |
1178 | * are converted to states. | 1210 | * are converted to states. |
@@ -1184,6 +1216,16 @@ static struct cpuhp_step cpuhp_bp_states[] = { | |||
1184 | .skip_onerr = true, | 1216 | .skip_onerr = true, |
1185 | .cant_stop = true, | 1217 | .cant_stop = true, |
1186 | }, | 1218 | }, |
1219 | /* | ||
1220 | * On the tear-down path, timers_dead_cpu() must be invoked | ||
1221 | * before blk_mq_queue_reinit_notify() from notify_dead(), | ||
1222 | * otherwise a RCU stall occurs. | ||
1223 | */ | ||
1224 | [CPUHP_TIMERS_DEAD] = { | ||
1225 | .name = "timers dead", | ||
1226 | .startup = NULL, | ||
1227 | .teardown = timers_dead_cpu, | ||
1228 | }, | ||
1187 | /* Kicks the plugged cpu into life */ | 1229 | /* Kicks the plugged cpu into life */ |
1188 | [CPUHP_BRINGUP_CPU] = { | 1230 | [CPUHP_BRINGUP_CPU] = { |
1189 | .name = "cpu:bringup", | 1231 | .name = "cpu:bringup", |
@@ -1191,6 +1233,10 @@ static struct cpuhp_step cpuhp_bp_states[] = { | |||
1191 | .teardown = NULL, | 1233 | .teardown = NULL, |
1192 | .cant_stop = true, | 1234 | .cant_stop = true, |
1193 | }, | 1235 | }, |
1236 | [CPUHP_AP_SMPCFD_DYING] = { | ||
1237 | .startup = NULL, | ||
1238 | .teardown = smpcfd_dying_cpu, | ||
1239 | }, | ||
1194 | /* | 1240 | /* |
1195 | * Handled on controll processor until the plugged processor manages | 1241 | * Handled on controll processor until the plugged processor manages |
1196 | * this itself. | 1242 | * this itself. |
@@ -1227,6 +1273,10 @@ static struct cpuhp_step cpuhp_ap_states[] = { | |||
1227 | .startup = sched_cpu_starting, | 1273 | .startup = sched_cpu_starting, |
1228 | .teardown = sched_cpu_dying, | 1274 | .teardown = sched_cpu_dying, |
1229 | }, | 1275 | }, |
1276 | [CPUHP_AP_RCUTREE_DYING] = { | ||
1277 | .startup = NULL, | ||
1278 | .teardown = rcutree_dying_cpu, | ||
1279 | }, | ||
1230 | /* | 1280 | /* |
1231 | * Low level startup/teardown notifiers. Run with interrupts | 1281 | * Low level startup/teardown notifiers. Run with interrupts |
1232 | * disabled. Will be removed once the notifiers are converted to | 1282 | * disabled. Will be removed once the notifiers are converted to |
@@ -1250,6 +1300,22 @@ static struct cpuhp_step cpuhp_ap_states[] = { | |||
1250 | .startup = smpboot_unpark_threads, | 1300 | .startup = smpboot_unpark_threads, |
1251 | .teardown = NULL, | 1301 | .teardown = NULL, |
1252 | }, | 1302 | }, |
1303 | [CPUHP_AP_PERF_ONLINE] = { | ||
1304 | .name = "perf online", | ||
1305 | .startup = perf_event_init_cpu, | ||
1306 | .teardown = perf_event_exit_cpu, | ||
1307 | }, | ||
1308 | [CPUHP_AP_WORKQUEUE_ONLINE] = { | ||
1309 | .name = "workqueue online", | ||
1310 | .startup = workqueue_online_cpu, | ||
1311 | .teardown = workqueue_offline_cpu, | ||
1312 | }, | ||
1313 | [CPUHP_AP_RCUTREE_ONLINE] = { | ||
1314 | .name = "RCU-tree online", | ||
1315 | .startup = rcutree_online_cpu, | ||
1316 | .teardown = rcutree_offline_cpu, | ||
1317 | }, | ||
1318 | |||
1253 | /* | 1319 | /* |
1254 | * Online/down_prepare notifiers. Will be removed once the notifiers | 1320 | * Online/down_prepare notifiers. Will be removed once the notifiers |
1255 | * are converted to states. | 1321 | * are converted to states. |