我有一个 IRQ 正在使用handle_level_irq()
. 大多数时候,ISR 要求安排下半部分,但偶尔,它能够确定它是虚假的,并且不想安排下半部分(出于性能原因)。问题是,在后一种情况下,存在竞争条件。如果 ISR 确定它是虚假的,它将取消屏蔽中断并准备退出(注意——此时 ISR 不受保护desc->lock
)。但是随后,在第二个 CPU 上触发了中断,根据handle_level_irq()
,抓取desc->lock
,屏蔽 IRQ,确定 ISR 正在第一个 CPU 上进行,因此它解锁desc->lock
并退出。然后第一个 CPU 上的原始 ISR 也将退出,使中断一直被屏蔽。
除非我需要,否则我希望能够不安排下半部分,那么 ISR 是否有某种方法可以在避免上述竞争条件的同时揭露自身?