关于内核软中断的细节
问题:内核里面的软中断能被中断打断,软中断被打断之后,如果有在相同cpu上产生同样的软
中断怎么办,会丢掉吗?还是会怎么处理?
参照Linux5.0的代码:
#define in_interrupt() (irq_count())
#define irq_count() (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK \
| NMI_MASK))
(include/linux/preempt_mask.h)
#define preempt_count() (current_thread_info()->preempt_count)
(include/linux/preempt.h)
可以看到,中断退出以后,如果当前进程不在中断上下文(软中断也是中断上下文)或者说是没有禁止软中断,而且当前软中断有pedding位,才会调用invoke_softirq()去处理软中断。
如果这样说的话,因为在执行上一个软中断函数之前禁止了软中断,并打开了硬中断,如果硬中断来的时候正好打断了软中断函数的执行逻辑,那下一个软中断来的时候就不会执行了吗?不是这样的,当下一个软中断来的时候会检车软中断的pedding位(见下图)则会唤醒softirqd处理刚来的软中断,其实在早期的linux内核版本里面是直接退出没有管当前的软中断了,而是退出到上个软中断的执行逻辑中,逻辑中会检测有没有新的软中断到来,如果有的话就再处理刚来的软中断,不会丢掉软中断。