簡體   English   中英

Linux IRQ:在ISR中取消屏蔽IRQ

[英]Linux IRQ: unmasking IRQ within ISR

我有一個使用handle_level_irq()的IRQ。 大多數時候,ISR要求安排下半部分,但偶爾,它可以確定它是虛假的,並且不希望安排下半部分(出於性能原因)。 問題是,在后一種情況下,存在競爭條件。 如果ISR確定它是虛假的,它將取消屏蔽該中斷並准備退出(請注意–此時ISR不受desc->lock保護)。 但是隨后,在第二個CPU上觸發了中斷,根據handle_level_irq() ,它desc->lock ,屏蔽了IRQ,確定ISR正在第一個CPU上進行,因此它解鎖了desc->lock並退出。 然后,第一個CPU上的原始ISR也將退出,並始終屏蔽該中斷。

我希望除非有必要,否則就不能安排下半場比賽,因此,ISR是否有某種方法可以在避免上述競爭情況的同時掩蓋自身?

問題是IRQ是電平觸發器,您有一個虛假的值。 如果級別值正在接收虛假中斷,應該如何解決呢? 即,由於雜散的性質,中斷當前處於活動級別。 這就是Linux屏蔽中斷以防止CPU因虛假中斷而死鎖的原因。

您可以將中斷級別更改為邊沿觸發,然后在下一個邊沿上更改回觸發電平。 這將消除雜散電平,直到硬件將其置為無效為止。 當硬件重新聲明中斷時,將發生邊沿,並且此時可以重新安裝觸發。

因此,除非共享中斷線,否則大多數外設都是邊沿觸發的。 這個問題可能在您的中斷控制器中,而不是handle_level_irq()代碼中。 您尚未提供版本或未提供您使用的驅動程序。

如果未共享該行,並且您的控制器支持邊緣觸發,那么我將轉換您的代碼以使用邊緣。 Wikipedia上查看更多內容

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM