• Benjamin Herrenschmidt's avatar
    [POWERPC] Fix iSeries hard irq enabling regression · ff3da2e0
    Benjamin Herrenschmidt authored
    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: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    ff3da2e0
irq.c 25.5 KB