软中断调度时机

  • 软中断调度时机已关闭评论
  • 28 次浏览
  • A+
所属分类:linux技术
摘要

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


软中断处理流程

软中断处理的时机

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

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

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

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

软中断调度时机

//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(); //唤醒软中断线程进行软中断处理 ... ... }