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);
}
要关中断的...汗...
版权声明:本文为博主原创文章,未经博主允许不得转载。
页:
[1]