Re: [PATCH V2] smp: Give WARN()ing when calling smp_call_function_many()/single()in serving irq

From: Thomas Gleixner
Date: Fri Jul 05 2013 - 09:51:16 EST


On Sat, 16 Feb 2013, Chuansheng Liu wrote:
> Currently the functions smp_call_function_many()/single() will
> give a WARN()ing only in the case of irqs_disabled(), but that
> check is not enough to guarantee execution of the SMP
> cross-calls.
>
> In many other cases such as softirq handling/interrupt handling,
> the two APIs still can not be called, just as the
> smp_call_function_many() comments say:
>
> * You must not call this function with disabled interrupts or from a
> * hardware interrupt handler or from a bottom half handler. Preemption
> * must be disabled when calling this function.
>
> 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.

That's not true if called with wait = 0 as we won't wait for the csd
in that case. The function will be invoked on cpuA after it reenables
interrupt. So for callers who don't care about synchronous execution
it should not warn in softirq context.

Thanks,

tglx


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/