softirq和tasklet在哪个上下文中?

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

我看到一些人使用“下半部分”这个词,如果有这个词,与其他人有什么不同。

softirq和tasklet的另一个问题是,为什么在执行过程中不允许进入睡眠?

任何人都可以帮助我确定这些问题,谢谢!

Solutions Collecting From Web of "softirq和tasklet在哪个上下文中?"

softirq和tasklet都是一种下半部分的机制。 不允许睡眠,因为他们运行在中断上下文而不是进程上下文中。 如果允许睡眠,那么linux不能调度它们,并最终导致出现dequeue_task错误的内核恐慌。 中断上下文甚至没有描述寄存器信息的数据结构,所以它们永远不能被linux调度。 如果它被设计成具有这样的结构并且可以被安排,中断处理过程的执行将会受到影响。

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

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

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

in_interrupt:是| in_irq:no | in_softirq:是| in_serving_softirq:是的

但要注意(注意!!!):“所有适用于中断处理程序的限制也适用于下半部分,因此,下半部分无法进入睡眠状态,无法访问用户空间,也无法调用调度程序。 – LDD3。

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

[更新]另外,我想指出的是,可以定义简单而优雅的宏,以便在需要时帮助打印调试信息。 多年来,我把这些宏和便利程序放到一个头文件中; 您可以查看并下载:“方便的标题” 。

有宏/函数来:

  • 使调试打印与funcname /行#信息(通常通过printk()或trace_printk()),只有在DEBUG模式是开
    • 转储内核模式堆栈
    • 打印当前上下文(进程或中断与ftrace使用的形式的标志一起)
    • 一个简单的assert()宏(!)
    • 一个cpu密集型DELAY_LOOP(对于必须在处理器上旋转的测试设备很有用)
    • 相当于用户模式的睡眠功能
    • 计算给定两个时间戳(timeval结构)的时间增量的函数
    • 转换十进制到二进制,和
    • 多一些。

Whe 🙂

我同意接受的答案和Kaiwan的回答,但他们没有提到ksoftirqd。 如果CPU处于softirqs和/或tasklets负载较重的状态,则调度它的ksfotirqd线程,它在进程上下文中处理引发的softirqs和tasklet。

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