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

From: Alistair Popple <[email-masked]>
Date: Tue, 28 Jul 2015 11:14:51 +1000

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?)

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