Skip to content

Commit 5fc57df

Browse files
brooniewilldeacon
authored andcommitted
arm64: stacktrace: Convert to ARCH_STACKWALK
Historically architectures have had duplicated code in their stack trace implementations for filtering what gets traced. In order to avoid this duplication some generic code has been provided using a new interface arch_stack_walk(), enabled by selecting ARCH_STACKWALK in Kconfig, which factors all this out into the generic stack trace code. Convert arm64 to use this common infrastructure. Signed-off-by: Mark Brown <broonie@kernel.org> Reviewed-by: Miroslav Benes <mbenes@suse.cz> Link: https://lore.kernel.org/r/20200914153409.25097-4-broonie@kernel.org Signed-off-by: Will Deacon <will@kernel.org>
1 parent baa2cd4 commit 5fc57df

2 files changed

Lines changed: 11 additions & 69 deletions

File tree

arch/arm64/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ config ARM64
2929
select ARCH_HAS_SETUP_DMA_OPS
3030
select ARCH_HAS_SET_DIRECT_MAP
3131
select ARCH_HAS_SET_MEMORY
32+
select ARCH_STACKWALK
3233
select ARCH_HAS_STRICT_KERNEL_RWX
3334
select ARCH_HAS_STRICT_MODULE_RWX
3435
select ARCH_HAS_SYNC_DMA_FOR_DEVICE

arch/arm64/kernel/stacktrace.c

Lines changed: 10 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -133,82 +133,23 @@ void notrace walk_stackframe(struct task_struct *tsk, struct stackframe *frame,
133133
NOKPROBE_SYMBOL(walk_stackframe);
134134

135135
#ifdef CONFIG_STACKTRACE
136-
struct stack_trace_data {
137-
struct stack_trace *trace;
138-
unsigned int no_sched_functions;
139-
unsigned int skip;
140-
};
141136

142-
static bool save_trace(void *d, unsigned long addr)
137+
void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie,
138+
struct task_struct *task, struct pt_regs *regs)
143139
{
144-
struct stack_trace_data *data = d;
145-
struct stack_trace *trace = data->trace;
146-
147-
if (data->no_sched_functions && in_sched_functions(addr))
148-
return false;
149-
if (data->skip) {
150-
data->skip--;
151-
return false;
152-
}
153-
154-
trace->entries[trace->nr_entries++] = addr;
155-
156-
return trace->nr_entries >= trace->max_entries;
157-
}
158-
159-
void save_stack_trace_regs(struct pt_regs *regs, struct stack_trace *trace)
160-
{
161-
struct stack_trace_data data;
162-
struct stackframe frame;
163-
164-
data.trace = trace;
165-
data.skip = trace->skip;
166-
data.no_sched_functions = 0;
167-
168-
start_backtrace(&frame, regs->regs[29], regs->pc);
169-
walk_stackframe(current, &frame, save_trace, &data);
170-
}
171-
EXPORT_SYMBOL_GPL(save_stack_trace_regs);
172-
173-
static noinline void __save_stack_trace(struct task_struct *tsk,
174-
struct stack_trace *trace, unsigned int nosched)
175-
{
176-
struct stack_trace_data data;
177140
struct stackframe frame;
178141

179-
if (!try_get_task_stack(tsk))
180-
return;
181-
182-
data.trace = trace;
183-
data.skip = trace->skip;
184-
data.no_sched_functions = nosched;
185-
186-
if (tsk != current) {
187-
start_backtrace(&frame, thread_saved_fp(tsk),
188-
thread_saved_pc(tsk));
189-
} else {
190-
/* We don't want this function nor the caller */
191-
data.skip += 2;
142+
if (regs)
143+
start_backtrace(&frame, regs->regs[29], regs->pc);
144+
else if (task == current)
192145
start_backtrace(&frame,
193146
(unsigned long)__builtin_frame_address(0),
194-
(unsigned long)__save_stack_trace);
195-
}
196-
197-
walk_stackframe(tsk, &frame, save_trace, &data);
147+
(unsigned long)arch_stack_walk);
148+
else
149+
start_backtrace(&frame, thread_saved_fp(task),
150+
thread_saved_pc(task));
198151

199-
put_task_stack(tsk);
200-
}
201-
202-
void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
203-
{
204-
__save_stack_trace(tsk, trace, 1);
205-
}
206-
EXPORT_SYMBOL_GPL(save_stack_trace_tsk);
207-
208-
void save_stack_trace(struct stack_trace *trace)
209-
{
210-
__save_stack_trace(current, trace, 0);
152+
walk_stackframe(task, &frame, consume_entry, cookie);
211153
}
212154

213-
EXPORT_SYMBOL_GPL(save_stack_trace);
214155
#endif

0 commit comments

Comments
 (0)