翼度科技»论坛 云主机 LINUX 查看内容

软中断调度时机

11

主题

11

帖子

33

积分

新手上路

Rank: 1

积分
33
软中断处理流程


目录

软中断处理的时机

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

  • 中断退出时(中断上下文)
  • 软中断线程处理
中断退出时软中断调度机制


  • 判断是否属于中断上下文以及是否有软中断处与pending状态
  • 判断软中断线程是否处于runing状态(4.9内核引入)
  • 进行软中断处理
  • 最多restart 10次或者累计运行2ms
  • 判断是否还有软中断处于pending状态
  1. //kernel/softirq.c
  2. #define MAX_SOFTIRQ_TIME  msecs_to_jiffies(2)
  3. #define MAX_SOFTIRQ_RESTART 10
  4. void irq_exit(void)
  5. {
  6. ... ...
  7.     if (!in_interrupt() && local_softirq_pending())  //如果不在中断上下文并且软中断处于pending状态
  8.         invoke_softirq();  
  9. ... ...
  10. }
  11. static inline void invoke_softirq(void)
  12. {
  13. ... ...
  14.         __do_softirq();   //执行软中断处理
  15. ... ...
  16. }
  17. asmlinkage __visible void __do_softirq(void)
  18. {
  19. unsigned long end = jiffies + MAX_SOFTIRQ_TIME; //__do_softirq最大运行时间2ms
  20. int max_restart = MAX_SOFTIRQ_RESTART; //最大软中断处理次数
  21. ... ...
  22. restart:
  23.     local_irq_enable(); //使能中断,使能后软中断可以被硬中断抢占
  24. ... ...
  25.       h->action(h);  //执行软中断处理函数
  26. ... ...
  27.       local_irq_disable(); //禁用中断
  28. ... ...
  29.       pending = local_softirq_pending();
  30.       if (pending) {
  31.             if (time_before(jiffies, end) && !need_resched() &&
  32.             --max_restart)  //如果软中断处理次数或处理时间未达到
  33.                 goto restart;
  34.             wakeup_softirqd(); //唤醒软中断线程进行软中断处理
  35. ... ...
  36. }
复制代码
来源:https://www.cnblogs.com/forwards/p/18168307
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具