| From fb983c0e040fbab874b81a01d6d9da9f992950d9 Mon Sep 17 00:00:00 2001 |
| From: Jiri Slaby <jslaby@suse.cz> |
| Date: Wed, 30 Oct 2019 08:25:45 +0100 |
| Subject: [PATCH] stacktrace: Don't skip first entry on noncurrent tasks |
| |
| commit b0c51f158455e31d5024100cf3580fcd88214b0e upstream. |
| |
| When doing cat /proc/<PID>/stack, the output is missing the first entry. |
| When the current code walks the stack starting in stack_trace_save_tsk, |
| it skips all scheduler functions (that's OK) plus one more function. But |
| this one function should be skipped only for the 'current' task as it is |
| stack_trace_save_tsk proper. |
| |
| The original code (before the common infrastructure) skipped one |
| function only for the 'current' task -- see save_stack_trace_tsk before |
| 3599fe12a125. So do so also in the new infrastructure now. |
| |
| Fixes: 214d8ca6ee85 ("stacktrace: Provide common infrastructure") |
| Signed-off-by: Jiri Slaby <jslaby@suse.cz> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Tested-by: Michal Suchanek <msuchanek@suse.de> |
| Acked-by: Josh Poimboeuf <jpoimboe@redhat.com> |
| Link: https://lkml.kernel.org/r/20191030072545.19462-1-jslaby@suse.cz |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/kernel/stacktrace.c b/kernel/stacktrace.c |
| index 899b726c9e98..97c44cff0229 100644 |
| --- a/kernel/stacktrace.c |
| +++ b/kernel/stacktrace.c |
| @@ -141,7 +141,8 @@ unsigned int stack_trace_save_tsk(struct task_struct *tsk, unsigned long *store, |
| struct stacktrace_cookie c = { |
| .store = store, |
| .size = size, |
| - .skip = skipnr + 1, |
| + /* skip this function if they are tracing us */ |
| + .skip = skipnr + !!(current == tsk), |
| }; |
| |
| if (!try_get_task_stack(tsk)) |
| @@ -306,7 +307,8 @@ unsigned int stack_trace_save_tsk(struct task_struct *task, |
| struct stack_trace trace = { |
| .entries = store, |
| .max_entries = size, |
| - .skip = skipnr + 1, |
| + /* skip this function if they are tracing us */ |
| + .skip = skipnr + !!(current == task), |
| }; |
| |
| save_stack_trace_tsk(task, &trace); |
| -- |
| 2.7.4 |
| |