On Fri, Jul 05, 2013 at 03:50:57PM +0200, Thomas Gleixner wrote: > On Sat, 16 Feb 2013, Chuansheng Liu wrote: > > There is a real case for softirq DEADLOCK case: > > > > CPUA CPUB > > spin_lock(&spinlock) > > Any irq coming, call the irq handler > > irq_exit() > > spin_lock_irq(&spinlock) > > <== Blocking here due to > > CPUB hold it > > __do_softirq() > > run_timer_softirq() > > timer_cb() > > call smp_call_function_many() > > send IPI interrupt to CPUA > > wait_csd() > > > > Then both CPUA and CPUB will be deadlocked here. >
Why can't we just use spin_lock_irq instead of spin_lock in CPUB to prevent this to happen ? And the according senario for kernel/smp.c is to use raw_spin_lock_irqsave instead of raw_spin_lock in generic_smp_call_function_single_interrupt to protect the follow one line codes: raw_spin_lock(&q->lock); list_replace_init(&q->list, &list); raw_spin_unlock(&q->lock); Thanks. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/