| From ee11b93f95eabdf8198edd4668bf9102e7248270 Mon Sep 17 00:00:00 2001 |
| From: "Steven Rostedt (VMware)" <rostedt@goodmis.org> |
| Date: Thu, 29 Oct 2020 17:31:45 -0400 |
| Subject: ftrace: Fix recursion check for NMI test |
| |
| From: Steven Rostedt (VMware) <rostedt@goodmis.org> |
| |
| commit ee11b93f95eabdf8198edd4668bf9102e7248270 upstream. |
| |
| The code that checks recursion will work to only do the recursion check once |
| if there's nested checks. The top one will do the check, the other nested |
| checks will see recursion was already checked and return zero for its "bit". |
| On the return side, nothing will be done if the "bit" is zero. |
| |
| The problem is that zero is returned for the "good" bit when in NMI context. |
| This will set the bit for NMIs making it look like *all* NMI tracing is |
| recursing, and prevent tracing of anything in NMI context! |
| |
| The simple fix is to return "bit + 1" and subtract that bit on the end to |
| get the real bit. |
| |
| Cc: stable@vger.kernel.org |
| Fixes: edc15cafcbfa3 ("tracing: Avoid unnecessary multiple recursion checks") |
| Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| kernel/trace/trace.h | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/kernel/trace/trace.h |
| +++ b/kernel/trace/trace.h |
| @@ -653,7 +653,7 @@ static __always_inline int trace_test_an |
| current->trace_recursion = val; |
| barrier(); |
| |
| - return bit; |
| + return bit + 1; |
| } |
| |
| static __always_inline void trace_clear_recursion(int bit) |
| @@ -663,6 +663,7 @@ static __always_inline void trace_clear_ |
| if (!bit) |
| return; |
| |
| + bit--; |
| bit = 1 << bit; |
| val &= ~bit; |
| |