lkml.org 
[lkml]   [2012]   [Nov]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Subject[PATCH] x86/irq,io_apic: Fix wrong unmask_ioapic calling when the irq is masked
From
Date

There is one typical case will cause this issue, that is:
One io-apic interrupt with ONE_SHOT and threaded, when interrupt is coming:
handle_fasteoi_irq()
--> mask_irq(desc)
...
desc->irq_data.chip->irq_eoi(&desc->irq_data)[ack_apic_level]
--> ioapic_irqd_mask()
...
ioapic_irqd_unmask()

After that, the irq will be in unmasked state.

It will break the ONE_SHOT and threaded irq, and brings some unwanted issues.
Here adding the irqd_irq_masked() condition to know if unmasking action is
needed.

Signed-off-by: liu chuansheng <chuansheng.liu@intel.com>
---
arch/x86/kernel/apic/io_apic.c | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 1817fa9..d963e76 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -2479,7 +2479,8 @@ static inline void ioapic_irqd_unmask(struct irq_data *data,
*/
if (!io_apic_level_ack_pending(cfg))
irq_move_masked_irq(data);
- unmask_ioapic(cfg);
+ if (!irqd_irq_masked(data))
+ unmask_ioapic(cfg);
}
}
#else
--
1.7.0.4




\
 
 \ /
  Last update: 2012-11-14 10:01    [W:0.041 / U:0.360 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site