Subject: Re: eeh-powernv.c: Unbalanced IRQ warning

From: Daniel Axtens <[email-masked]>
Date: Tue, 28 Jul 2015 11:56:31 +1000

Hi Alistair and Gavin,

The patch from Alistair fixes my issue. Thanks heaps!

Alistair, are you right to post that formally?

Regards,
Daniel

On Tue, 2015-07-28 at 11:28 +1000, Gavin Shan wrote:
> On Tue, Jul 28, 2015 at 11:14:51AM +1000, Alistair Popple wrote:
> >Hi Daniel,
> >
> >I see the problem - pnv_eeh_next_error() re-enables the interrupt but it gets 
> >called from a loop if there are more outstanding events to process. The most 
> >obvious solution would be to do this check before enabling interrupts:
> >
> >        if (ret == EEH_NEXT_ERR_NONE && eeh_enabled())
> >
> >instead of:
> >
> >        if (eeh_enabled())
> >
> >This should work fine so long as pnv_eeh_next_error() is called continuously 
> >until is returns either EEH_NEXT_ERR_NONE or another value which signals that 
> >pnv_eeh_next_error() should never be called again. As far as I can tell this 
> >looks to be true (perhaps Gavin can confirm?)
> >
> 
> Yeah, I confirmed. The way that Alistair fixes the issue is simple and more
> precise. Please try his fix and ignore the one I sent couple of minutes
> before.
> 
> Thanks,
> Gavin
> 
> >Would you mind trying the below patch and seeing if it fixes the problem? 
> >Thanks!
> >
> >-- >8 --
> >>From 6eeed1d6dd25e8cf6bfe3423dc50ff855d1cbc42 Mon Sep 17 00:00:00 2001
> >From: Alistair Popple <[email-masked]>
> >
> >---
> > arch/powerpc/platforms/powernv/eeh-powernv.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> >diff --git a/arch/powerpc/platforms/powernv/eeh-powernv.c b/arch/powerpc/platforms/powernv/eeh-powernv.c
> >index ca825ec..ff41c03 100644
> >--- a/arch/powerpc/platforms/powernv/eeh-powernv.c
> >+++ b/arch/powerpc/platforms/powernv/eeh-powernv.c
> >@@ -1478,7 +1478,7 @@ static int pnv_eeh_next_error(struct eeh_pe **pe)
> > 	}
> >
> > 	/* Unmask the event */
> >-	if (eeh_enabled())
> >+	if (ret == EEH_NEXT_ERR_NONE && eeh_enabled())
> > 		enable_irq(eeh_event_irq);
> >
> > 	return ret;
> >-- 
> >1.8.3.2
> >
> >
> 

-- 
Regards,
Daniel