| From 4230e2deaa484b385aa01d598b2aea8e7f2660a6 Mon Sep 17 00:00:00 2001 |
| From: Zong Li <zong.li@sifive.com> |
| Date: Wed, 21 Oct 2020 15:38:39 +0800 |
| Subject: stop_machine, rcu: Mark functions as notrace |
| |
| From: Zong Li <zong.li@sifive.com> |
| |
| commit 4230e2deaa484b385aa01d598b2aea8e7f2660a6 upstream. |
| |
| Some architectures assume that the stopped CPUs don't make function calls |
| to traceable functions when they are in the stopped state. See also commit |
| cb9d7fd51d9f ("watchdog: Mark watchdog touch functions as notrace"). |
| |
| Violating this assumption causes kernel crashes when switching tracer on |
| RISC-V. |
| |
| Mark rcu_momentary_dyntick_idle() and stop_machine_yield() notrace to |
| prevent this. |
| |
| Fixes: 4ecf0a43e729 ("processor: get rid of cpu_relax_yield") |
| Fixes: 366237e7b083 ("stop_machine: Provide RCU quiescent state in multi_cpu_stop()") |
| Signed-off-by: Zong Li <zong.li@sifive.com> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Tested-by: Atish Patra <atish.patra@wdc.com> |
| Tested-by: Colin Ian King <colin.king@canonical.com> |
| Acked-by: Steven Rostedt (VMware) <rostedt@goodmis.org> |
| Acked-by: Paul E. McKenney <paulmck@kernel.org> |
| Cc: stable@vger.kernel.org |
| Link: https://lore.kernel.org/r/20201021073839.43935-1-zong.li@sifive.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| kernel/rcu/tree.c | 2 +- |
| kernel/stop_machine.c | 2 +- |
| 2 files changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/kernel/rcu/tree.c |
| +++ b/kernel/rcu/tree.c |
| @@ -416,7 +416,7 @@ bool rcu_eqs_special_set(int cpu) |
| * |
| * The caller must have disabled interrupts and must not be idle. |
| */ |
| -void rcu_momentary_dyntick_idle(void) |
| +notrace void rcu_momentary_dyntick_idle(void) |
| { |
| int special; |
| |
| --- a/kernel/stop_machine.c |
| +++ b/kernel/stop_machine.c |
| @@ -178,7 +178,7 @@ static void ack_state(struct multi_stop_ |
| set_state(msdata, msdata->state + 1); |
| } |
| |
| -void __weak stop_machine_yield(const struct cpumask *cpumask) |
| +notrace void __weak stop_machine_yield(const struct cpumask *cpumask) |
| { |
| cpu_relax(); |
| } |