Xen的idle domain到底在干啥

Xen的4.xxx之后,引入了tasklet的概念,以下以Xen-4.10为具体例子,分析Xen如何进入idle domain的:

 

 

raise_softirq(SCHEDULE_SOFTIRQ)

       |

schedule(void)

       |                                     // 注意,如果next是Idle domain的话,原来的sched timer是不被set的...坏了...

context_switch(prev, next);  // 这里的next是Idle domain

       |

schedule_tail(next);

       |

continue_idle_domain(next)

       |

reset_stack_and_jump(idle_loop);

       |

-----------------------------------------------------------------------------------------

void idle_loop(void)
{
    for ( ; ; )
    {
        if ( cpu_is_offline(smp_processor_id()) )
            play_dead();
        (*pm_idle)();
        do_tasklet(); //这里是Xen4之后引入的最邪恶的东东,以前没有的
        do_softirq();
    }
}

-------------------------------------------------------------------------------------------

 

Tasklet不是新东西,这个概念在Linux里面很早就已经出现。

下面看看在Xen4中,以credit scheduler为背景,看看tasklet的行为被如何定义 (tasklet.h, tasklet.c).

 

在credit scheduler中,tasklet被赋予最高的优先级。只要有tasklet任务,其他的VCPU都不会被schedule。任务必须在domain中执行,而tasklet就寄生在idle domain中。当有tasklet出现时,实际上是通过临时性的将idle domain的优先级提到最高,然后使tasklet寄托于idle domain来运行。

 

void do_tasklet(void)
{
... ...

    spin_lock_irq(&tasklet_lock);

... ...

    spin_unlock_irq(&tasklet_lock);

}

 

要关中断的...汗...

你可能感兴趣的:(Xen的idle domain到底在干啥)