关于内核软中断的细节

问题:内核里面的软中断能被中断打断,软中断被打断之后,如果有在相同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内核版本里面是直接退出没有管当前的软中断了,而是退出到上个软中断的执行逻辑中,逻辑中会检测有没有新的软中断到来,如果有的话就再处理刚来的软中断,不会丢掉软中断。

   

关于内核软中断的细节