do_softirq中为什么要锁软中断
时间: 2023-12-06 21:42:07 浏览: 80
在 Linux 内核中,软中断是一种异步执行的机制,可以用来处理一些比较短暂、不需要立即处理的任务,例如网络数据包到达、定时器等。当软中断被触发时,内核会立即跳转到对应的软中断处理函数中执行。
在 do_softirq 函数中,内核会顺序执行所有已经被触发但还未执行的软中断处理函数。由于软中断是异步执行的,在执行软中断处理函数的过程中,可能会有新的软中断被触发,并且插入到软中断处理队列的头部。如果不加锁,那么在执行当前软中断处理函数时,可能会插入新的软中断,并且这些新的软中断会被立即执行,这样就可能导致当前软中断处理函数被打断,从而破坏了软中断处理函数的顺序性。
因此,在 do_softirq 中为了保持软中断处理函数的顺序性,需要对软中断队列进行加锁,以确保当前正在执行的软中断处理函数能够完整执行完毕,不会被其他新的软中断打断。
相关问题
do_softirq为什么不允许软中断嵌套
在 Linux 内核中,软中断是一种异步机制,用于处理一些延迟敏感的任务,例如网络数据包的接收和处理、磁盘 I/O 等。软中断由内核中的硬件中断触发,但是它们不会立即执行,而是在稍后的时间点被调度执行。
当一个软中断正在执行时,如果又有一个相同的软中断被触发了,那么这个新的软中断会被加入到软中断队列中等待执行,而不是立即执行。这是因为软中断的执行可能会涉及到共享的资源,例如内核数据结构、锁等,如果多个软中断同时操作这些资源,就会导致竞争和不一致的问题。
因此,为了保证软中断的正确执行,Linux 内核不允许软中断嵌套,即当一个软中断正在执行时,不允许其他软中断被触发和执行。这是通过在内核中维护一个软中断嵌套计数器来实现的。当一个软中断开始执行时,计数器加 1,当软中断执行完毕时,计数器减 1。如果计数器不为 0,说明当前正在执行的软中断被另一个软中断打断了,这时候需要等待上一个软中断执行完毕后再继续执行当前软中断。
总之,不允许软中断嵌套是为了保证软中断的正确性和可靠性,避免竞争和不一致的问题。
__do_softirq为什么要set_softirq_pending
在 Linux 内核中,__do_softirq 函数用于处理软中断。当一个软中断被触发后,它会被加入到软中断队列中,等待 __do_softirq 处理。而 set_softirq_pending 函数则用于将指定的软中断标记为待处理状态,并将其加入到软中断队列中。
set_softirq_pending 的作用是将软中断设置为待处理状态,从而确保 __do_softirq 能够及时处理这个软中断。如果没有将软中断设置为待处理状态,那么 __do_softirq 可能会错过这个软中断,从而导致系统出现问题。
因此,set_softirq_pending 是确保软中断能够被及时处理的重要函数。
阅读全文