softirq和tasklet在哪个上下文中?

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

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

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

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


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


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

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

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

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

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

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

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

有宏/函数可以:

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


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

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

    链接地址: http://www.djcxy.com/p/84787.html

    上一篇: Which context are softirq and tasklet in?

    下一篇: What module is the i/o scheduler