Linux kernel 当我们使用irq_set_chained_处理程序时,irq行是否将被禁用?

Linux kernel 当我们使用irq_set_chained_处理程序时,irq行是否将被禁用?,linux-kernel,linux-device-driver,embedded-linux,interrupt-handling,irq,Linux Kernel,Linux Device Driver,Embedded Linux,Interrupt Handling,Irq,当我们使用irq_set_chained_处理程序时,当我们为相关处理程序提供服务时,irq行不会被禁用或不被禁用,就像在请求_irq的情况下一样 参考 这意味着GPIO irqchip是使用 irq_set_chained_handler()或相应的 gpiochip_set_chained_irqchip()辅助函数和GPIO irqchip 将立即从父irqchip调用处理程序,而 保持IRQ处于禁用状态。然后GPIO irqchip将结束调用 在其中断处理程序中类似于以下序列: 中断是如

当我们使用irq_set_chained_处理程序时,当我们为相关处理程序提供服务时,irq行不会被禁用或不被禁用,就像在请求_irq的情况下一样

参考

这意味着GPIO irqchip是使用 irq_set_chained_handler()或相应的 gpiochip_set_chained_irqchip()辅助函数和GPIO irqchip 将立即从父irqchip调用处理程序,而 保持IRQ处于禁用状态。然后GPIO irqchip将结束调用 在其中断处理程序中类似于以下序列:


中断是如何设置的并不重要。当发生任何中断时,在中断处理程序期间,所有中断(针对该CPU)都将被禁用。例如,在ARM体系结构上,在C代码中找到中断处理的第一位是
asm\u do\u IRQ()
函数(在
arch/ARM/kernel/IRQ.C
中定义)。它是从汇编代码中调用的。对于任何中断(无论是由
request\u irq()
irq\u set\u chained\u handler()
请求的),都会调用相同的
asm\u do\u irq()
函数,并且ARM CPU会自动禁用中断。有关详细信息,请参阅

历史笔记 另外,值得一提的是,不久前Linux内核提供了两种类型的中断:“快”和“慢”中断。快速中断(使用
IRQF_DISABLED
SA_INTERRUPT
标志时)是在禁用中断的情况下运行的,这些处理程序应该非常短且快速。另一方面,慢速中断是在重新启用中断的情况下运行的,因为处理慢速中断的处理程序可能需要花费很多时间

在现代版本的Linux内核上,所有中断都被认为是“快速”的,并且在禁用中断的情况下运行。具有大型处理程序的中断必须作为线程实现(或使用
local\u irq\u enable\u in_hardirq()
在ISR中手动启用中断)

在Linux内核v2.6.35中,提交更改了该行为。你可以找到更多的细节。

这是问题的继续。