| From 4dad81d2d3579335d4633731b6d3d7ad02f79a5e Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 30 Oct 2019 08:25:45 +0100 |
| Subject: stacktrace: Don't skip first entry on noncurrent tasks |
| |
| From: Jiri Slaby <jslaby@suse.cz> |
| |
| [ Upstream commit b0c51f158455e31d5024100cf3580fcd88214b0e ] |
| |
| 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: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/stacktrace.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| diff --git a/kernel/stacktrace.c b/kernel/stacktrace.c |
| index f5440abb75329..9bbfbdb96ae51 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)) |
| @@ -298,7 +299,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.20.1 |
| |