处理 tasklet 时何时保存状态?
When save states while dealing with tasklets?
我正在阅读 Linux 内核开发并在 tasklets 章节(https://doc.lagout.org/operating%20system%20/linux/Linux%20Kernel%20Development%2C%203rd%20Edition.pdf 第 143 页)中感到困惑。
在tasklet_schedule函数中,中断状态被保存,而在taslet_action中则没有。作者解释说 taslet_action 中没有保存上下文,因为该函数知道中断始终处于启用状态。我不明白中断集如何干扰保存上下文?谢谢!
作者指出 tasklet_schedule 可以在禁用或启用中断的情况下调用。由于它希望禁用它们,因此需要保存它们是否已被禁用。然后在工作完成后,它知道是否启用它们(如果它们在调用之前已启用,则启用它们,如果它们在调用之前被禁用,则使它们保持禁用状态)。相反,tasklet_action 仅在启用中断时调用,因此检查其状态没有意义。它们总是在 return.
被禁用和启用
在 tasklet_schedule 的情况下:
我们不希望中断在我们调度tasklet 时打扰我们,所以我们必须禁用它。但是我们也知道,当我们完成对 tasklet 的调度后,我们想要回到调用 schedule tasklet 之前的 IRQ 状态。为了实现这一点,我们在做任何事情之前保存 IRQ 寄存器的状态,然后根据我们的要求禁用 IRQ,进行调度,现在在返回之前恢复 IRQ 的状态,然后从函数 return 。
现在进入复杂的部分,为什么我们在执行 tasklet 时不需要保存 IRQ,即当处理程序调用 tasklet 函数时?
要理解我们需要看两个不同的段落:
第 141 页:
The softirq handlers run with interrupts enabled and cannot
sleep .While a handler runs, softirqs on the current processor are
disabled.Another processor, however, can exe-cute other softirqs. If
the same softirq is raised again while it is executing, another
processor can run it simultaneously.
所以这声明中断总是启用。
现在转到第 143 页:
- Disable local interrupt delivery (there is no need to first save their state because the code here is always called as a softirq
handler and interrupts are always enabled) and retrieve the
tasklet_vec or tasklet_hi_vec list for this processor
因此我们可以得出结论,我们不需要保存 IRQ 状态,因为我们已经知道它的状态,并且在所有情况下它都会保持不变,所以我们只需禁用 IRQ 并稍后启用它。
我正在阅读 Linux 内核开发并在 tasklets 章节(https://doc.lagout.org/operating%20system%20/linux/Linux%20Kernel%20Development%2C%203rd%20Edition.pdf 第 143 页)中感到困惑。 在tasklet_schedule函数中,中断状态被保存,而在taslet_action中则没有。作者解释说 taslet_action 中没有保存上下文,因为该函数知道中断始终处于启用状态。我不明白中断集如何干扰保存上下文?谢谢!
作者指出 tasklet_schedule 可以在禁用或启用中断的情况下调用。由于它希望禁用它们,因此需要保存它们是否已被禁用。然后在工作完成后,它知道是否启用它们(如果它们在调用之前已启用,则启用它们,如果它们在调用之前被禁用,则使它们保持禁用状态)。相反,tasklet_action 仅在启用中断时调用,因此检查其状态没有意义。它们总是在 return.
被禁用和启用在 tasklet_schedule 的情况下:
我们不希望中断在我们调度tasklet 时打扰我们,所以我们必须禁用它。但是我们也知道,当我们完成对 tasklet 的调度后,我们想要回到调用 schedule tasklet 之前的 IRQ 状态。为了实现这一点,我们在做任何事情之前保存 IRQ 寄存器的状态,然后根据我们的要求禁用 IRQ,进行调度,现在在返回之前恢复 IRQ 的状态,然后从函数 return 。
现在进入复杂的部分,为什么我们在执行 tasklet 时不需要保存 IRQ,即当处理程序调用 tasklet 函数时? 要理解我们需要看两个不同的段落:
第 141 页:
The softirq handlers run with interrupts enabled and cannot sleep .While a handler runs, softirqs on the current processor are disabled.Another processor, however, can exe-cute other softirqs. If the same softirq is raised again while it is executing, another processor can run it simultaneously.
所以这声明中断总是启用。
现在转到第 143 页:
- Disable local interrupt delivery (there is no need to first save their state because the code here is always called as a softirq handler and interrupts are always enabled) and retrieve the tasklet_vec or tasklet_hi_vec list for this processor
因此我们可以得出结论,我们不需要保存 IRQ 状态,因为我们已经知道它的状态,并且在所有情况下它都会保持不变,所以我们只需禁用 IRQ 并稍后启用它。