Base linux5.0
CPU-up CPU-down
BP AP BP AP
OFFLINE OFFLINE
| ^
v |
BRINGUP_CPU->AP_OFFLINE BRINGUP_CPU <- AP_IDLE_DEAD (idle thread/play_dead)
| AP_OFFLINE
v (IRQ-off) ,---------------^
AP_ONLNE | (stop_machine)
| TEARDOWN_CPU <- AP_ONLINE_IDLE
| ^
v |
AP_ACTIVE AP_ACTIVE
cpu_down
cpu_down()
|
do_cpu_down
|
cpu_down_maps_locked(cpu, offline)
|
_cpu_down ##set target offline ,cpuhp_hp_states cb will use
|
onlinecpus=1 or !present cpu--> return ##only one cpu or not setup cpu will return
|
cpus_write_lock---percpu_down_write smpboot_register_percpu_thread
| |
cpuhp_tasks_frozen = tasks_frozen = 0 ------------------------------------
| |
st->state > CPUHP_TEARDOWN_CPU |
| |
cpuhp_kick_ap_work ## target CPUHP_TEARDOWN_CPU |
|------------ |
| | |
| __cpuhp_kick_ap |
| | |
| wake_up_process ----------------------------------------->st->thread
| | |
| | cpuhp_thread_fun
| | |
| wait_for_ap_thread DONE cpuhp_invoke_callback
| |
cpuhp_down_callbacks ##target offline cb(cpu)
| |
cpuhp_invoke_callback ##CPUHP_TEARDOWN_CPU -> CPUHP_OFFLINE cpuhp_hp_states.teardown----------> CPUHP_ONLINE---->CPUHP_TEARDOWN_CPU
------------| \ ---------------------------- |
| \ -------------- \
| ##CPUHP_TEARDOWN_CPU -> CPUHP_OFFLINE | | sched_cpu_deactivat
cpus_write_unlock ------------------------------------------------ takedown_cpu | rcutree_offline_cpue
| | (takedown_cpu function)-------------/ | workqueue_offline_cpu
cleanup | | | lockup_detector_offline_cpu
| | kthread_park ##ark the smpboot threads | perf_event_exit_cpu
arch smt update | | | smpboot_park_threads
| | stop_machine_cpuslocked(take_cpu_down) | DONE
DONE | | | --------------- /
| | |
| | __cpu_disable---------------------------|----------\
timers_dead_cpu | | | platform_cpu_disable------#check(support hotplug and tos is run on this cpu)
| | cpuhp_invoke_callback -------------\ | set_cpu_online(cpu, false);
rcutree_dead_cpu | | | | |
| | tick_handover_do_timer | | irq_migrate_all_off_this_cpu
slab_dead_cpu | | | | |
| | stop_machine_park | | flush_cache_louis
relay_prepare_cpu | | | | local_flush_tlb_all
| | DONE | |----------/ DONE
smpcfd_dead_cpu | |
| | ------------|--\####CPUHP_TEARDOWN_CPU -> CPUHP_AP_OFFLINE
hrtimers_dead_cpu | | smpcfd_dying_cpu
| | | rcutree_dying_cpu
perf_event_exit_cpu | | sched_cpu_dying
| | |--------------/DONE
DONE |
|
wait_for_ap_thread
|
hotplug_cpu__broadcast_tick_pull
|
__cpu_die------wait_for_completion_timeout <----------------------------------------- idle thread
|
tick_cleanup_dead_cpu
|
rcutree_migrate_callbacks
|
DONE