|
软中断处理流程
目录
软中断处理的时机
标准linux内核关抢占的情况下,软中断只在下面两个时机调度
中断退出时软中断调度机制
- 判断是否属于中断上下文以及是否有软中断处与pending状态
- 判断软中断线程是否处于runing状态(4.9内核引入)
- 进行软中断处理
- 最多restart 10次或者累计运行2ms
- 判断是否还有软中断处于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(); //唤醒软中断线程进行软中断处理
- ... ...
- }
复制代码 来源:https://www.cnblogs.com/forwards/p/18168307
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|