diff mbox

xive: Don't double EOI interrupts that have an EOI override

Message ID 1492689640.25766.147.camel@kernel.crashing.org
State Accepted
Headers show

Commit Message

Benjamin Herrenschmidt April 20, 2017, noon UTC
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>
---

This fixes the hangs on w18. It doesn't fix the massive slowdowns caused
by runaway mbox interrupts which I will look into separately.
 hw/xive.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Michael Neuling April 21, 2017, 1:59 a.m. UTC | #1
This is upstream as of 50e1921f98

On Thu, 2017-04-20 at 22:00 +1000, Benjamin Herrenschmidt wrote:
> 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>
> ---
> 
> This fixes the hangs on w18. It doesn't fix the massive slowdowns caused
> by runaway mbox interrupts which I will look into separately.
>  hw/xive.c | 4 ++--
>  1 file 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)
> 
> _______________________________________________
> Skiboot mailing list
> Skiboot@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/skiboot
diff mbox

Patch

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)