diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2017-04-20 22:00:40 +1000 |
---|---|---|
committer | Michael Neuling <mikey@neuling.org> | 2017-04-21 11:35:27 +1000 |
commit | e780f230b141e5ba5b0098faf0a9e9d7c1482efe (patch) | |
tree | e0cfb640dd75b5610dfde722e6b9bdaa58077773 /hw | |
parent | 86d4bcbdcbf91717a62797494be40a18d1e43d6d (diff) | |
download | skiboot-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.c | 4 |
1 files changed, 2 insertions, 2 deletions
@@ -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) |