我想问是否有办法注册中断处理程序,以便只有一个 cpu 将处理这条中断线。问题是我们有一个可以在正常上下文和中断上下文中调用的函数。在这个函数中,我们irqs_disabled()
用来检查调用者上下文。如果调用者上下文是中断,我们将处理切换到轮询模式(不断检查中断状态寄存器)。虽然irqs_disabled()
告诉当前 CPU 的本地中断被禁用,但中断处理程序仍然被其他 CPU 调用,因此中断处理程序中的中断状态寄存器被清除。轮询代码现在检查中断状态寄存器的错误值并进行错误处理。
2 回答
你这样做是错的。不要将中断限制为由单个 CPU 处理 - 而是使用 spin_lock_irqsave 来保护代码路径。这将在同一个 CPU 和跨 CPU 上工作。
有关相关 API,请参见http://www.mjmwired.net/kernel/Documentation/spinlocks.txt,这里有一篇来自 Linux Journal 的精彩文章,解释了用法:http ://www.linuxjournal.com/article/5833
我没有使用 ARM 的经验,但在 x86 上,您可以通过 /proc/irq/<number>/smp_affinity 安排仅在一个处理器上调用特定中断 - 从用户空间设置 - 用你关心的 irq 替换数字about - 这看起来好像它本质上是通用的。请注意,您设置的值是位掩码,以十六进制表示,没有前导 0x。即,如果你想要cpu 0,将其设置为1,对于cpu 1,将其设置为2,等等。当心一个名为irqbalance 的进程,它使用这种机制,并且很可能会覆盖你所做的任何事情。
但是你为什么要这样做?如果你想知道你是否被中断调用,可以使用一个名为 in_interrupt() 的接口。我用它来避免尝试从可能从中断上下文调用的代码中调用阻塞函数。