Linux kernel 为什么有些代码调用request\u threaded\u irq,并将NULL作为irq\u处理程序的参数?

Linux kernel 为什么有些代码调用request\u threaded\u irq,并将NULL作为irq\u处理程序的参数?,linux-kernel,kernel,linux-device-driver,interrupt,Linux Kernel,Kernel,Linux Device Driver,Interrupt,根据内核文档,request\u threaded\u irq用于将其分成两部分,irq\u处理程序检查中断是否源自设备。如果是,它需要禁用设备上的中断并返回IRQ\u WAKE\u THREAD,这将唤醒处理程序线程并运行@THREAD\u fn 但是我发现了一些代码寄存器中断,使用request\u threaded\u irq将NULL传递为irq\u handler,它们在thread\u fn中保持完整的功能 因此,我的疑问是,为什么我们在这种情况下使用request\u-thread

根据内核文档,
request\u threaded\u irq
用于将其分成两部分,irq\u处理程序检查中断是否源自设备。如果是,它需要禁用设备上的中断并返回
IRQ\u WAKE\u THREAD
,这将唤醒处理程序线程并运行
@THREAD\u fn

但是我发现了一些代码寄存器中断,使用
request\u threaded\u irq
NULL
传递为
irq\u handler
,它们在
thread\u fn
中保持完整的功能

因此,我的疑问是,为什么我们在这种情况下使用
request\u-threaded\u-irq()
,而我们可以轻松地使用
request\u-irq
,这与上述场景的行为相同。

说明:

如果为NULL且线程为_fn!=如果安装了默认的主处理程序,则为NULL

默认主处理程序未记录,但其源应该是自解释的:

static irqreturn\u t irq\u default\u primary\u处理程序(int-irq,void*dev\u id)
{
返回IRQ_WAKE_线程;
}

在这种情况下,它与请求irq不是一回事吗?由于中断是启用的,所以只有您要求线程\u fn运行。@Rahul,至少,实际处理程序运行的上下文(进程与硬IRQ)存在差异,这是线程化IRQ处理程序的要点。
request\u IRQ
首先创建,然后
request\u threaded\u IRQ
。而现代内核中的
request\u irq
request\u threaded\u irq
包装成
thread\u fn
作为
NULL
以实现兼容性。看见