• James Hogan's avatar
    metag: kick: add missing irq_enter/exit to kick_handler() · f6b30d32
    James Hogan authored
    kick_handler() doesn't have an irq_enter/exit pair, but it's used for
    handling SMP IPIs which require work to be done in softirqs, which are
    invoked from irq_exit() when the hard irq nest count reaches 0.
    
    The scheduler_ipi() callback in the IPI handler calls irq_enter/exit
    itself, but this is inside kick_handler()'s spin lock critical section,
    so if an invoked softirq issues an IPI the kick_handler() will be
    re-entered on the same CPU and will deadlock.
    
    This is easily fixed by adding the missing irq_enter/exit to
    kick_handler() so that the hard irq nest count doesn't reach 0 until
    after the spin lock has been released.
    
    Ideally the spin lock protected handler list will also be replaced by a
    lockless RCU protected list since it is certainly mostly read. That can
    be done in a later change though.
    Signed-off-by: default avatarJames Hogan <james.hogan@imgtec.com>
    Acked-by: default avatarThomas Gleixner <tglx@linutronix.de>
    f6b30d32
kick.c 3.07 KB