aboutsummaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2017-04-20 22:00:40 +1000
committerMichael Neuling <mikey@neuling.org>2017-04-21 11:35:27 +1000
commite780f230b141e5ba5b0098faf0a9e9d7c1482efe (patch)
treee0cfb640dd75b5610dfde722e6b9bdaa58077773 /hw
parent86d4bcbdcbf91717a62797494be40a18d1e43d6d (diff)
downloadskiboot-e780f230b141e5ba5b0098faf0a9e9d7c1482efe.zip
skiboot-e780f230b141e5ba5b0098faf0a9e9d7c1482efe.tar.gz
skiboot-e780f230b141e5ba5b0098faf0a9e9d7c1482efe.tar.bz2
xive: Don't double EOI interrupts that have an EOI override
Some interrupts source such as PSI serirq have a special EOI override. That override will perform the PQ bit EOI operation, so we must not do a second one in xive_source_eoi(). This bug can cause queue overflows, especially when dealing with runaway level interrupts. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Michael Neuling <mikey@neuling.org>
Diffstat (limited to 'hw')
-rw-r--r--hw/xive.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/hw/xive.c b/hw/xive.c
index 530e0df..1e2648c 100644
--- a/hw/xive.c
+++ b/hw/xive.c
@@ -2531,8 +2531,8 @@ static void xive_source_eoi(struct irq_source *is, uint32_t isn)
if (s->orig_ops && s->orig_ops->eoi)
s->orig_ops->eoi(is, isn);
-
- __xive_source_eoi(is, isn);
+ else
+ __xive_source_eoi(is, isn);
}
static void xive_source_interrupt(struct irq_source *is, uint32_t isn)