softirq和tasklet在哪个上下文中?

时间:2011-08-21 02:13:51

标签: linux linux-kernel interrupt softirq

我知道有进程上下文和中断上下文但我不明白在执行softirq或tasklet时,它在哪个上下文中运行。

我看到有些人使用“下半部分上下文”一词,如果有这样的术语,与其他人相比有什么不同。

softirq和tasklet的另一个问题是为什么在执行期间不允许睡眠?

任何人都可以帮我识别这些问题,谢谢!!

3 个答案:

答案 0 :(得分:16)

softirq和tasklet都是下半部分机制。不允许睡眠,因为它们在中断上下文而不是进程上下文中运行。如果允许sleep,则linux无法安排它们,最终导致内核崩溃并出现dequeue_task错误。中断上下文甚至没有描述寄存器信息的数据结构,因此它们永远不会被linux调度。如果它被设计为具有该结构并且可以被调度,则将实现中断处理过程的性能。

答案 1 :(得分:12)

@kai:你的qs reg哪个上下文执行了?

从技术上讲,softirq的在中断上下文中运行 - “softirq”上下文;它只是它不是“hard-irq”上下文(这是发生硬件中断时的上下文)。

因此,在softirq处理程序中,就Linux提供的“查找”宏而言:

in_interrupt:是| in_irq:没有| in_softirq:是的in_serving_softirq:是的

但要注意(小心!!! :): “适用于中断处理程序的所有限制也适用于下半部分。因此,下半部分无法休眠,无法访问用户空间,也无法调用调度程序。” - LDD3。

杰梅因回答了你的其余问题。

[更新] 另外,我想指出一个人可以定义简单而优雅的宏,以便在需要时帮助打印调试信息。多年来,我已将这些宏和便利例程放入头文件中;你可以看一下download it here: "A Header of Convenience"

有以下宏/函数:

  • 使用funcname / line #info进行调试打印(通过常规方式 printk()或trace_printk())并且仅当DEBUG模式为On时
    • 转储内核模式堆栈
    • 打印当前上下文(进程或中断以及ftrace使用的格式中的标记)
    • 一个简单的assert()宏(!)
    • cpu密集型DELAY_LOOP(对于必须在处理器上旋转的测试装备非常有用)
    • 等同于usermode睡眠功能
    • 给出两个时间戳(timeval structs)计算时间增量的函数
    • 将十进制转换为二进制,
    • 还有一些。

哇: - )

答案 2 :(得分:6)

我同意接受的答案和Kaiwan的回答,但他们没有提到ksoftirqd。如果CPU负载很多softirqs和/或tasklet,它会调度其ksfotirqd线程,该线程在进程上下文中处理引发的softirqs和tasklet。

所以我猜OP的问题的答案是:softirqs可以在中断或进程上下文中运行。