On Fri, Feb 19, 2021 at 09:12:10PM +0800, Wen Yang wrote: > >> On Fri, Feb 19, 2021 at 02:43:34PM +0800, Wen Yang wrote: > >> From: Peter Zijlstra <peterz@xxxxxxxxxxxxx> > >> > >> commit 19dbdcb8039cff16669a05136a29180778d16d0a upstream. > >> > >> It's clearly documented that smp function calls cannot be invoked from > >> softirq handling context. Unfortunately nothing enforces that or emits a > >> warning. > >> > >> A single function call can be invoked from softirq context only via > >> smp_call_function_single_async(). > >> > >> The only legit context is task context, so add a warning to that effect. > >> > >> Reported-by: luferry <luferry@xxxxxxx> > >> Signed-off-by: Peter Zijlstra <peterz@xxxxxxxxxxxxx> > >> Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > >> Link: https://lkml.kernel.org/r/20190718160601.GP3402@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx > >> Cc: stable <stable@xxxxxxxxxxxxxxx> # 4.9.x > >> Signed-off-by: Wen Yang <simon.wy@xxxxxxxxxxxxxxx> > >> --- > >> kernel/smp.c | 16 ++++++++++++++++ > >> 1 file changed, 16 insertions(+) > >> > >> diff --git a/kernel/smp.c b/kernel/smp.c > >> index 399905f..f2b29c4 100644 > >> --- a/kernel/smp.c > >> +++ b/kernel/smp.c > >> @@ -276,6 +276,14 @@ int smp_call_function_single(int cpu, smp_call_func_t func, void *info, > >> WARN_ON_ONCE(cpu_online(this_cpu) && irqs_disabled() > >> && !oops_in_progress); > >> > >> + /* > >> + * When @wait we can deadlock when we interrupt between llist_add() and > >> + * arch_send_call_function_ipi*(); when !@wait we can deadlock due to > >> + * csd_lock() on because the interrupt context uses the same csd > >> + * storage. > >> + */ > >> + WARN_ON_ONCE(!in_task()); > >> + > >> csd = &csd_stack; > >> if (!wait) { > >> csd = this_cpu_ptr(&csd_data); > >> @@ -401,6 +409,14 @@ void smp_call_function_many(const struct cpumask *mask, > >> WARN_ON_ONCE(cpu_online(this_cpu) && irqs_disabled() > >> && !oops_in_progress && !early_boot_irqs_disabled); > >> > >> + /* > >> + * When @wait we can deadlock when we interrupt between llist_add() and > >> + * arch_send_call_function_ipi*(); when !@wait we can deadlock due to > >> + * csd_lock() on because the interrupt context uses the same csd > >> + * storage. > >> + */ > >> + WARN_ON_ONCE(!in_task()); > >> + > >> /* Try to fastpath. So, what's a CPU they want? Ignoring this one. */ > >> cpu = cpumask_first_and(mask, cpu_online_mask); > >> if (cpu == this_cpu) > >> -- > >> 1.8.3.1 > >> > > > > WHy do you want this in the 4.9.y kernel tree only, and not all others? > > What bug/problem does this fix? It seems that it will only report > > problems that other code has, not fix existing code. If anything, it's > > going to start causing machines to reboot that have "panic on warn" set, > > is that a good thing to do? > > 4.9, 4.14 and 4.19 should all need it. > > We find that some third party kernel modules occasionally cause kernel > panic (such as watchdog reset). After further analysis, it is found that the > functions such as smp_call_function()/on_each_cpu() are called in the interrupt > context or softirq context. If no in-kernel code has this problem, then why is this needed to be backported? > Since these usages are illegal and cannot be prohibited, we should add a warning > to enhance the robustness of the stable kernel and/or facilitate the analysis of > the problems. We don't care, nor can we do, anything about out-of-tree code. If you wish to add this patch to your specific kernels to catch bad things, that's fine, but as it is, I do not see how this patch fits the stable kernel rules. thanks, greg k-h