运行中的xen(schedule方面)
运行中的dom可能会不断的调用某些schedule函数,使得pcpu与vcpu之间达到平衡
startup_cpu_idle_loop() -> continue_cpu_idle_loop() -> do_softirq()- softirq_handlers[]为静态变量,里面存放了与中断编号相对应的函数指针,该函数数组使用open_softirq()进行注册,下面列出xen(ia64)的中断对应的函数调用
- TIMER_SOFTIRQ -> timer_softirq_action()
- SCHEDULE_SOFTIRQ -> schedule()***待续
- NEW_TLBFLUSH_CLOCK_PERIOD_SOFTIRQ -> new_tlbflush_clock_period()
- PAGE_SCRUB_SOFTIRQ -> page_scrub_softirq()
- RCU_SOFTIRQ -> rcu_process_callbacks()
- STOPMACHINE_SOFTIRQ -> stopmachine_softirq()
- TASKLET_SOFTIRQ -> tasklet_action()
- CMC_DISABLE_SOFTIRQ -> ia64_mca_cmc_vector_disable()
- CMC_ENABLE_SOFTIRQ -> ia64_mca_cmc_vector_enable()
- NMI_MCE_SOFTIRQ -> nmi_mce_softirq()
- TIME_CALIBRATE_SOFTIRQ -> local_time_calibration()
- VCPU_KICK_SOFTIRQ -> vcpu_kick_softirq()
- ia64
- x86
|
|
|
schedule()
schedule()何时被调用?
在xen的大循环中,do_softirq()先通过下面的过程得到cpuiddo_softirq() -> smp_processor_id() -> raw_smp_processor_id() -> get_processor_id() -> get_cpu_info()
然后用softirq_pending()取出该cpu的pending值(64bitmap),
softirq_pending() -> cpu_data() -> per_cpu() -> RELOC_HIDE()
用find_first_set_bit()宏找到第一个设置为1的位i,用clear_bit()将i位置0,然后调用softirq_handlers[i],schedule()对应的是第1个位(从0开始)
bitmap的schedule位何时被设置?
在大循环函数中,raise_softirq(SCHEDULE_SOFTIRQ);会在每次do_softirq()之前执行.设置SCHEDULE_SOFTIRQ中断位schedule()解析
见下一章节