软中断调度时机
  LEe7oAzCxFwr 19天前 42 0

软中断处理流程

软中断处理的时机

标准linux内核关抢占的情况下,软中断只在下面两个时机调度

  1. 中断退出时(中断上下文)
  2. 软中断线程处理

中断退出时软中断调度机制

  1. 判断是否属于中断上下文以及是否有软中断处与pending状态
  2. 判断软中断线程是否处于runing状态(4.9内核引入)
  3. 进行软中断处理
  4. 最多restart 10次或者累计运行2ms
  5. 判断是否还有软中断处于pending状态

image

//kernel/softirq.c
#define MAX_SOFTIRQ_TIME  msecs_to_jiffies(2)
#define MAX_SOFTIRQ_RESTART 10

void irq_exit(void)
{
... ...
    if (!in_interrupt() && local_softirq_pending())  //如果不在中断上下文并且软中断处于pending状态
        invoke_softirq();  
... ...
}

static inline void invoke_softirq(void)
{
... ...
        __do_softirq();   //执行软中断处理
... ...
}
asmlinkage __visible void __do_softirq(void)
{
unsigned long end = jiffies + MAX_SOFTIRQ_TIME; //__do_softirq最大运行时间2ms
int max_restart = MAX_SOFTIRQ_RESTART; //最大软中断处理次数
... ...
restart:
    local_irq_enable(); //使能中断,使能后软中断可以被硬中断抢占
... ...
      h->action(h);  //执行软中断处理函数
... ...
      local_irq_disable(); //禁用中断
... ...
      pending = local_softirq_pending();
      if (pending) {
            if (time_before(jiffies, end) && !need_resched() &&
            --max_restart)  //如果软中断处理次数或处理时间未达到
                goto restart; 
            wakeup_softirqd(); //唤醒软中断线程进行软中断处理
... ...
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 19天前 0

暂无评论

推荐阅读
  XkHDHG7Y62UM   2天前   6   0   0 Linux
  XkHDHG7Y62UM   2天前   4   0   0 Linux
  tAaiqedz71Vf   2天前   7   0   0 Linux
  2sqDzWaoi9Ck   2天前   6   0   0 Linux
LEe7oAzCxFwr