为什么do_softirq要Reset active bitmask before enabling irqs
时间: 2023-12-06 07:41:47 浏览: 30
在Linux内核中,软中断是一种异步的事件处理机制,用于在内核中执行延迟的、非关键性的任务,比如网络数据包处理、定时器等。当需要处理软中断时,内核会在适当的时间点调用`do_softirq()`函数来执行软中断处理程序。
在执行软中断处理程序之前,内核需要禁用硬件中断(IRQ),以防止软中断处理程序和硬中断处理程序之间的竞争条件。因此,在调用`do_softirq()`函数之前,内核会先调用`local_irq_disable()`函数来禁用IRQ。
但是,禁用IRQ并不意味着所有的软中断都会被立即执行。有些软中断可能在禁用IRQ期间被触发,但是由于IRQ被禁用,它们无法立即执行。因此,内核需要在启用IRQ之前重新检查哪些软中断已经被触发,并将这些软中断的标志位从“激活的”状态重置为“未激活的”状态。
这就是为什么`do_softirq()`函数在启用IRQ之前会重置“激活的”软中断标志位的原因。这样做可以确保在启用IRQ之前不会执行任何未处理的软中断,并且所有的软中断都将以正确的顺序被执行。
相关问题
__do_softirq为什么要set_softirq_pending
在 Linux 内核中,__do_softirq 函数用于处理软中断。当一个软中断被触发后,它会被加入到软中断队列中,等待 __do_softirq 处理。而 set_softirq_pending 函数则用于将指定的软中断标记为待处理状态,并将其加入到软中断队列中。
set_softirq_pending 的作用是将软中断设置为待处理状态,从而确保 __do_softirq 能够及时处理这个软中断。如果没有将软中断设置为待处理状态,那么 __do_softirq 可能会错过这个软中断,从而导致系统出现问题。
因此,set_softirq_pending 是确保软中断能够被及时处理的重要函数。
do_softirq中为什么要锁软中断
在 Linux 内核中,软中断是一种异步执行的机制,可以用来处理一些比较短暂、不需要立即处理的任务,例如网络数据包到达、定时器等。当软中断被触发时,内核会立即跳转到对应的软中断处理函数中执行。
在 do_softirq 函数中,内核会顺序执行所有已经被触发但还未执行的软中断处理函数。由于软中断是异步执行的,在执行软中断处理函数的过程中,可能会有新的软中断被触发,并且插入到软中断处理队列的头部。如果不加锁,那么在执行当前软中断处理函数时,可能会插入新的软中断,并且这些新的软中断会被立即执行,这样就可能导致当前软中断处理函数被打断,从而破坏了软中断处理函数的顺序性。
因此,在 do_softirq 中为了保持软中断处理函数的顺序性,需要对软中断队列进行加锁,以确保当前正在执行的软中断处理函数能够完整执行完毕,不会被其他新的软中断打断。