diff options
| -rw-r--r-- | arch/x86/kernel/stacktrace.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/arch/x86/kernel/stacktrace.c b/arch/x86/kernel/stacktrace.c index 8dabd7bf1673..77835bc021c7 100644 --- a/arch/x86/kernel/stacktrace.c +++ b/arch/x86/kernel/stacktrace.c | |||
| @@ -30,7 +30,7 @@ static int save_stack_address(struct stack_trace *trace, unsigned long addr, | |||
| 30 | return 0; | 30 | return 0; |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | static void __save_stack_trace(struct stack_trace *trace, | 33 | static void noinline __save_stack_trace(struct stack_trace *trace, |
| 34 | struct task_struct *task, struct pt_regs *regs, | 34 | struct task_struct *task, struct pt_regs *regs, |
| 35 | bool nosched) | 35 | bool nosched) |
| 36 | { | 36 | { |
| @@ -56,6 +56,7 @@ static void __save_stack_trace(struct stack_trace *trace, | |||
| 56 | */ | 56 | */ |
| 57 | void save_stack_trace(struct stack_trace *trace) | 57 | void save_stack_trace(struct stack_trace *trace) |
| 58 | { | 58 | { |
| 59 | trace->skip++; | ||
| 59 | __save_stack_trace(trace, current, NULL, false); | 60 | __save_stack_trace(trace, current, NULL, false); |
| 60 | } | 61 | } |
| 61 | EXPORT_SYMBOL_GPL(save_stack_trace); | 62 | EXPORT_SYMBOL_GPL(save_stack_trace); |
| @@ -70,6 +71,8 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace) | |||
| 70 | if (!try_get_task_stack(tsk)) | 71 | if (!try_get_task_stack(tsk)) |
| 71 | return; | 72 | return; |
| 72 | 73 | ||
| 74 | if (tsk == current) | ||
| 75 | trace->skip++; | ||
| 73 | __save_stack_trace(trace, tsk, NULL, true); | 76 | __save_stack_trace(trace, tsk, NULL, true); |
| 74 | 77 | ||
| 75 | put_task_stack(tsk); | 78 | put_task_stack(tsk); |
| @@ -88,8 +91,9 @@ EXPORT_SYMBOL_GPL(save_stack_trace_tsk); | |||
| 88 | } \ | 91 | } \ |
| 89 | }) | 92 | }) |
| 90 | 93 | ||
| 91 | static int __save_stack_trace_reliable(struct stack_trace *trace, | 94 | static int __always_inline |
| 92 | struct task_struct *task) | 95 | __save_stack_trace_reliable(struct stack_trace *trace, |
| 96 | struct task_struct *task) | ||
| 93 | { | 97 | { |
| 94 | struct unwind_state state; | 98 | struct unwind_state state; |
| 95 | struct pt_regs *regs; | 99 | struct pt_regs *regs; |
