f6b30d32d2
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: James Hogan <james.hogan@imgtec.com> Acked-by: Thomas Gleixner <tglx@linutronix.de> |
||
---|---|---|
.. | ||
perf | ||
.gitignore | ||
asm-offsets.c | ||
cachepart.c | ||
clock.c | ||
core_reg.c | ||
da.c | ||
devtree.c | ||
dma.c | ||
ftrace.c | ||
ftrace_stub.S | ||
head.S | ||
irq.c | ||
kick.c | ||
machines.c | ||
Makefile | ||
metag_ksyms.c | ||
module.c | ||
perf_callchain.c | ||
process.c | ||
ptrace.c | ||
setup.c | ||
signal.c | ||
smp.c | ||
stacktrace.c | ||
sys_metag.c | ||
tbiunexp.S | ||
tcm.c | ||
time.c | ||
topology.c | ||
traps.c | ||
user_gateway.S | ||
vmlinux.lds.S |