From: Anton Blanchard <hidden> Date: 2012-06-27 22:45:09
Commit f948501b36c6 ("Make hard_irq_disable() actually hard-disable
interrupts") caused check_and_cede_processor to stop working.
->irq_happened will never be zero right after a hard_irq_disable
so the compiler removes the call to cede_processor completely.
The bug was introduced back in the lazy interrupt handling rework
of 3.4 but was hidden until recently because hard_irq_disable did
nothing.
This issue will eventually appear in 3.4 stable since the
hard_irq_disable fix is marked stable, so mark this one for stable
too.
Signed-off-by: Anton Blanchard <redacted>
Cc: stable@vger.kernel.org
---
Index: linux-build/arch/powerpc/platforms/pseries/processor_idle.c
===================================================================
From: Benjamin Herrenschmidt <benh@kernel.crashing.org> Date: 2012-06-27 22:51:24
On Thu, 2012-06-28 at 08:45 +1000, Anton Blanchard wrote:
quoted hunk
hard_irq_disable();- if (get_paca()->irq_happened == 0)+ if (get_paca()->irq_happened == PACA_IRQ_HARD_DIS) cede_processor();
I'd rather add a helper, something like lazy_irq_pending()
and hide the actual check for the bits in irq_happened, in
case we change the scheme again.
Something like:
static inline bool lazy_irq_pending(void)
{
return !!(get_paca()->irq_happened & ~PACA_IRQ_HARD_DIS);
}
Cheers,
Ben.
From: Anton Blanchard <hidden> Date: 2012-06-27 23:13:52
Hi,
I'd rather add a helper, something like lazy_irq_pending()
and hide the actual check for the bits in irq_happened, in
case we change the scheme again.
Good idea. Look ok?
--
Commit f948501b36c6 ("Make hard_irq_disable() actually hard-disable
interrupts") caused check_and_cede_processor to stop working.
->irq_happened will never be zero right after a hard_irq_disable
so the compiler removes the call to cede_processor completely.
The bug was introduced back in the lazy interrupt handling rework
of 3.4 but was hidden until recently because hard_irq_disable did
nothing.
This issue will eventually appear in 3.4 stable since the
hard_irq_disable fix is marked stable, so mark this one for stable
too.
Signed-off-by: Anton Blanchard <redacted>
Cc: stable@vger.kernel.org
---
v2: create a helper, suggested by Ben.
Index: linux-build/arch/powerpc/platforms/pseries/processor_idle.c
===================================================================
From: Benjamin Herrenschmidt <benh@kernel.crashing.org> Date: 2012-06-28 07:10:49
On Thu, 2012-06-28 at 09:13 +1000, Anton Blanchard wrote:
Hi,
quoted
I'd rather add a helper, something like lazy_irq_pending()
and hide the actual check for the bits in irq_happened, in
case we change the scheme again.
Good idea. Look ok?
--
Commit f948501b36c6 ("Make hard_irq_disable() actually hard-disable
interrupts") caused check_and_cede_processor to stop working.
->irq_happened will never be zero right after a hard_irq_disable
so the compiler removes the call to cede_processor completely.
The bug was introduced back in the lazy interrupt handling rework
of 3.4 but was hidden until recently because hard_irq_disable did
nothing.
This issue will eventually appear in 3.4 stable since the
hard_irq_disable fix is marked stable, so mark this one for stable
too.
Yup, looks good, I'll send to Linus tomorrow.
Cheers,
Ben.
quoted hunk
Signed-off-by: Anton Blanchard <redacted>
Cc: stable@vger.kernel.org
---
v2: create a helper, suggested by Ben.
Index: linux-build/arch/powerpc/platforms/pseries/processor_idle.c
===================================================================