]> pilppa.com Git - linux-2.6-omap-h63xx.git/commit
[POWERPC] Fix iSeries hard irq enabling regression
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 2 Apr 2008 04:58:40 +0000 (15:58 +1100)
committerPaul Mackerras <paulus@samba.org>
Thu, 3 Apr 2008 11:10:34 +0000 (22:10 +1100)
commitff3da2e0938bae36d10d69c22bce0177b067a9e2
tree4df635b6bc9298fbf455ab2be23aaec04324c3f0
parent025306f30948836a743eb68a7cbaf4ab0bfb5f47
[POWERPC] Fix iSeries hard irq enabling regression

A subtle bug sneaked into iSeries recently.  On this platform, we must
not normally clear MSR:EE (the hardware external interrupt enable)
except for short periods of time.  Taking an interrupt while
soft-disabled doesn't cause us to clear it for example.

The iSeries kernel expects to mostly run with MSR:EE enabled at all
times except in a few exception entry/exit code paths.  Thus
local_irq_enable() doesn't check if it needs to hard-enable as it
expects this to be unnecessary on iSeries.

However, hard_irq_disable() _does_ cause MSR:EE to be cleared,
including on iSeries.  A call to it was recently added to the
context switch code, thus causing interrupts to become disabled
for a long periods of time, causing the iSeries watchdog to kick
in under some circumstances and other nasty things.

This patch fixes it by making local_irq_enable() properly re-enable
MSR:EE on iSeries.  It basically removes a return statement here
to make iSeries use the same code path as everybody else.  That does
mean that we might occasionally get spurious decrementer interrupts
but I don't think that matters.

Another option would have been to make hard_irq_disable() a nop
on iSeries but I didn't like it much, in case we have good reasons
to hard-disable.

Part of the patch is fixes to make sure the hard_enabled PACA field
is properly set on iSeries as it used not to be before, since it
was mostly unused.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/kernel/head_64.S
arch/powerpc/kernel/irq.c