Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 100722
b: refs/heads/master
c: f76e915
h: refs/heads/master
v: v3
  • Loading branch information
Nicolas Pitre authored and Lennert Buytenhek committed Jun 22, 2008
1 parent 91b3e26 commit 267347b
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 5 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b0bfcce930bca38af056662e598991cb393eaa4a
refs/heads/master: f76e9154736e9ab47b64940d0062f19c80225b7f
5 changes: 5 additions & 0 deletions trunk/arch/arm/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,11 @@ config STACKTRACE_SUPPORT
bool
default y

config HAVE_LATENCYTOP_SUPPORT
bool
depends on !SMP
default y

config LOCKDEP_SUPPORT
bool
default y
Expand Down
34 changes: 30 additions & 4 deletions trunk/arch/arm/kernel/stacktrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,34 +36,60 @@ EXPORT_SYMBOL(walk_stackframe);
#ifdef CONFIG_STACKTRACE
struct stack_trace_data {
struct stack_trace *trace;
unsigned int no_sched_functions;
unsigned int skip;
};

static int save_trace(struct stackframe *frame, void *d)
{
struct stack_trace_data *data = d;
struct stack_trace *trace = data->trace;
unsigned long addr = frame->lr;

if (data->no_sched_functions && in_sched_functions(addr))
return 0;
if (data->skip) {
data->skip--;
return 0;
}

trace->entries[trace->nr_entries++] = frame->lr;
trace->entries[trace->nr_entries++] = addr;

return trace->nr_entries >= trace->max_entries;
}

void save_stack_trace(struct stack_trace *trace)
void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
{
struct stack_trace_data data;
unsigned long fp, base;

data.trace = trace;
data.skip = trace->skip;
base = (unsigned long)task_stack_page(current);
asm("mov %0, fp" : "=r" (fp));
base = (unsigned long)task_stack_page(tsk);

if (tsk != current) {
#ifdef CONFIG_SMP
/*
* What guarantees do we have here that 'tsk'
* is not running on another CPU?
*/
BUG();
#else
data.no_sched_functions = 1;
fp = thread_saved_fp(tsk);
#endif
} else {
data.no_sched_functions = 0;
asm("mov %0, fp" : "=r" (fp));
}

walk_stackframe(fp, base, base + THREAD_SIZE, save_trace, &data);
if (trace->nr_entries < trace->max_entries)
trace->entries[trace->nr_entries++] = ULONG_MAX;
}

void save_stack_trace(struct stack_trace *trace)
{
save_stack_trace_tsk(current, trace);
}
#endif

0 comments on commit 267347b

Please sign in to comment.