request_irq由单个CPU处理

时间:2013-05-23 03:17:19

标签: linux linux-kernel linux-device-driver

我想问一下是否有办法注册中断处理程序,这样只有一个cpu会处理这个中断线。 问题是我们有一个可以在普通上下文和中断上下文中调用的函数。在此函数中,我们使用irqs_disabled()来检查调用者上下文。如果调用者上下文是中断,我们将处理切换到轮询模式(连续检查中断状态寄存器)。虽然irqs_disabled()表示当前CPU的本地中断被禁用,但中断处理程序仍被其他CPU调用,因此中断状态寄存器在中断处理程序中被清除。轮询代码现在检查中断状态寄存器的错误值并执行错误的处理。

2 个答案:

答案 0 :(得分:4)

你做错了。不要将中断限制为由单个CPU处理 - 而是使用spin_lock_irqsave来保护代码路径。这将在同一CPU和跨CPU上工作。

有关相关API的信息,请参阅http://www.mjmwired.net/kernel/Documentation/spinlocks.txt,这是Linux Journal上的一篇很好的文章,解释了用法:http://www.linuxjournal.com/article/5833

答案 1 :(得分:1)

我没有使用ARM的经验,但是在x86上你可以安排通过/ proc / irq /< number> / smp_affinity在一个处理器上调用一个特定的中断 - 从用户空间设置 - 替换数字与你关心的irq - 这看起来好像它本质上是通用的。请注意,您设置的值是一个位掩码,以十六进制表示,没有前导0x。即如果你想要cpu 0,将它设置为1,对于cpu 1,将它设置为2,等等。请注意一个名为irqbalance的进程,它使用这种机制,并且可能会覆盖你所做的任何事情。

但你为什么要这样做?如果你想知道是否从一个中断调用,那么就有一个名为in_interrupt()的接口。我已经用它来避免尝试从可能从中断上下文调用的代码中调用阻塞函数。