[Linux]cpu_down代碼閱讀記錄

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章