[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <1352911962.15558.1676.camel@cliu38-desktop-build>
Date: Thu, 15 Nov 2012 00:52:42 +0800
From: Chuansheng Liu <chuansheng.liu@...el.com>
To: mingo@...hat.com, tglx@...utronix.de
Cc: x86@...nel.org, linux-kernel@...r.kernel.org,
chuansheng.liu@...el.com
Subject: [PATCH] x86/irq,io_apic: Fix wrong unmask_ioapic calling when the
irq is masked
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@...el.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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists