457475451 发表于 2015-10-11 14:58:18

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]
查看完整版本: Xen的idle domain到底在干啥