]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 9 Oct 2020 14:11:04 +0000 (16:11 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 9 Oct 2020 14:11:04 +0000 (16:11 +0200)
added patches:
ftrace-move-rcu-is-watching-check-after-recursion-check.patch

queue-4.9/ftrace-move-rcu-is-watching-check-after-recursion-check.patch [new file with mode: 0644]
queue-4.9/series

diff --git a/queue-4.9/ftrace-move-rcu-is-watching-check-after-recursion-check.patch b/queue-4.9/ftrace-move-rcu-is-watching-check-after-recursion-check.patch
new file mode 100644 (file)
index 0000000..23ce268
--- /dev/null
@@ -0,0 +1,57 @@
+From b40341fad6cc2daa195f8090fd3348f18fff640a Mon Sep 17 00:00:00 2001
+From: "Steven Rostedt (VMware)" <rostedt@goodmis.org>
+Date: Tue, 29 Sep 2020 12:40:31 -0400
+Subject: ftrace: Move RCU is watching check after recursion check
+
+From: Steven Rostedt (VMware) <rostedt@goodmis.org>
+
+commit b40341fad6cc2daa195f8090fd3348f18fff640a upstream.
+
+The first thing that the ftrace function callback helper functions should do
+is to check for recursion. Peter Zijlstra found that when
+"rcu_is_watching()" had its notrace removed, it caused perf function tracing
+to crash. This is because the call of rcu_is_watching() is tested before
+function recursion is checked and and if it is traced, it will cause an
+infinite recursion loop.
+
+rcu_is_watching() should still stay notrace, but to prevent this should
+never had crashed in the first place. The recursion prevention must be the
+first thing done in callback functions.
+
+Link: https://lore.kernel.org/r/20200929112541.GM2628@hirez.programming.kicks-ass.net
+
+Cc: stable@vger.kernel.org
+Cc: Paul McKenney <paulmck@kernel.org>
+Fixes: c68c0fa293417 ("ftrace: Have ftrace_ops_get_func() handle RCU and PER_CPU flags too")
+Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Reported-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ kernel/trace/ftrace.c |    8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+--- a/kernel/trace/ftrace.c
++++ b/kernel/trace/ftrace.c
+@@ -5334,17 +5334,15 @@ static void ftrace_ops_assist_func(unsig
+ {
+       int bit;
+-      if ((op->flags & FTRACE_OPS_FL_RCU) && !rcu_is_watching())
+-              return;
+-
+       bit = trace_test_and_set_recursion(TRACE_LIST_START, TRACE_LIST_MAX);
+       if (bit < 0)
+               return;
+       preempt_disable_notrace();
+-      if (!(op->flags & FTRACE_OPS_FL_PER_CPU) ||
+-          !ftrace_function_local_disabled(op)) {
++      if ((!(op->flags & FTRACE_OPS_FL_RCU) || rcu_is_watching()) &&
++          (!(op->flags & FTRACE_OPS_FL_PER_CPU) ||
++           !ftrace_function_local_disabled(op))) {
+               op->func(ip, parent_ip, op, regs);
+       }
index 0e2d26d71d2e940f6ae2acdb0b07f1fc96716a14..818166c68afd65ada2a9cb89d40245f8420981f6 100644 (file)
@@ -31,3 +31,4 @@ platform-x86-thinkpad_acpi-re-initialize-acpi-buffer-size-when-reuse.patch
 driver-core-fix-probe_count-imbalance-in-really_probe.patch
 perf-top-fix-stdio-interface-input-handling-with-glibc-2.28.patch
 mtd-rawnand-sunxi-fix-the-probe-error-path.patch
+ftrace-move-rcu-is-watching-check-after-recursion-check.patch