[PATCH] x86: Some preparationary cleanup for stack trace
- Remove unused all_contexts parameter No caller used it - Move skip argument into the structure (needed for followon patches) Cc: mingo@elte.hu Signed-off-by: Andi Kleen <ak@suse.de>
This commit is contained in:
parent
4ea8a5d8b5
commit
5a1b3999d6
|
@ -61,12 +61,8 @@ save_context_stack(struct stack_trace *trace, unsigned int skip,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Save stack-backtrace addresses into a stack_trace buffer.
|
* Save stack-backtrace addresses into a stack_trace buffer.
|
||||||
* If all_contexts is set, all contexts (hardirq, softirq and process)
|
|
||||||
* are saved. If not set then only the current context is saved.
|
|
||||||
*/
|
*/
|
||||||
void save_stack_trace(struct stack_trace *trace,
|
void save_stack_trace(struct stack_trace *trace, struct task_struct *task)
|
||||||
struct task_struct *task, int all_contexts,
|
|
||||||
unsigned int skip)
|
|
||||||
{
|
{
|
||||||
unsigned long ebp;
|
unsigned long ebp;
|
||||||
unsigned long *stack = &ebp;
|
unsigned long *stack = &ebp;
|
||||||
|
@ -85,10 +81,9 @@ void save_stack_trace(struct stack_trace *trace,
|
||||||
struct thread_info *context = (struct thread_info *)
|
struct thread_info *context = (struct thread_info *)
|
||||||
((unsigned long)stack & (~(THREAD_SIZE - 1)));
|
((unsigned long)stack & (~(THREAD_SIZE - 1)));
|
||||||
|
|
||||||
ebp = save_context_stack(trace, skip, context, stack, ebp);
|
ebp = save_context_stack(trace, trace->skip, context, stack, ebp);
|
||||||
stack = (unsigned long *)context->previous_esp;
|
stack = (unsigned long *)context->previous_esp;
|
||||||
if (!all_contexts || !stack ||
|
if (!stack || trace->nr_entries >= trace->max_entries)
|
||||||
trace->nr_entries >= trace->max_entries)
|
|
||||||
break;
|
break;
|
||||||
trace->entries[trace->nr_entries++] = ULONG_MAX;
|
trace->entries[trace->nr_entries++] = ULONG_MAX;
|
||||||
if (trace->nr_entries >= trace->max_entries)
|
if (trace->nr_entries >= trace->max_entries)
|
||||||
|
|
|
@ -59,9 +59,7 @@ static inline unsigned long save_context_stack(struct stack_trace *trace,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void save_stack_trace(struct stack_trace *trace,
|
void save_stack_trace(struct stack_trace *trace, struct task_struct *task)
|
||||||
struct task_struct *task, int all_contexts,
|
|
||||||
unsigned int skip)
|
|
||||||
{
|
{
|
||||||
register unsigned long sp asm ("15");
|
register unsigned long sp asm ("15");
|
||||||
unsigned long orig_sp;
|
unsigned long orig_sp;
|
||||||
|
@ -69,22 +67,23 @@ void save_stack_trace(struct stack_trace *trace,
|
||||||
sp &= PSW_ADDR_INSN;
|
sp &= PSW_ADDR_INSN;
|
||||||
orig_sp = sp;
|
orig_sp = sp;
|
||||||
|
|
||||||
sp = save_context_stack(trace, &skip, sp,
|
sp = save_context_stack(trace, &trace->skip, sp,
|
||||||
S390_lowcore.panic_stack - PAGE_SIZE,
|
S390_lowcore.panic_stack - PAGE_SIZE,
|
||||||
S390_lowcore.panic_stack);
|
S390_lowcore.panic_stack);
|
||||||
if ((sp != orig_sp) && !all_contexts)
|
if ((sp != orig_sp) && !trace->all_contexts)
|
||||||
return;
|
return;
|
||||||
sp = save_context_stack(trace, &skip, sp,
|
sp = save_context_stack(trace, &trace->skip, sp,
|
||||||
S390_lowcore.async_stack - ASYNC_SIZE,
|
S390_lowcore.async_stack - ASYNC_SIZE,
|
||||||
S390_lowcore.async_stack);
|
S390_lowcore.async_stack);
|
||||||
if ((sp != orig_sp) && !all_contexts)
|
if ((sp != orig_sp) && !trace->all_contexts)
|
||||||
return;
|
return;
|
||||||
if (task)
|
if (task)
|
||||||
save_context_stack(trace, &skip, sp,
|
save_context_stack(trace, &trace->skip, sp,
|
||||||
(unsigned long) task_stack_page(task),
|
(unsigned long) task_stack_page(task),
|
||||||
(unsigned long) task_stack_page(task) + THREAD_SIZE);
|
(unsigned long) task_stack_page(task) + THREAD_SIZE);
|
||||||
else
|
else
|
||||||
save_context_stack(trace, &skip, sp, S390_lowcore.thread_info,
|
save_context_stack(trace, &trace->skip, sp,
|
||||||
|
S390_lowcore.thread_info,
|
||||||
S390_lowcore.thread_info + THREAD_SIZE);
|
S390_lowcore.thread_info + THREAD_SIZE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,9 +109,10 @@ out_restore:
|
||||||
* Save stack-backtrace addresses into a stack_trace buffer:
|
* Save stack-backtrace addresses into a stack_trace buffer:
|
||||||
*/
|
*/
|
||||||
static inline unsigned long
|
static inline unsigned long
|
||||||
save_context_stack(struct stack_trace *trace, unsigned int skip,
|
save_context_stack(struct stack_trace *trace,
|
||||||
unsigned long stack, unsigned long stack_end)
|
unsigned long stack, unsigned long stack_end)
|
||||||
{
|
{
|
||||||
|
int skip = trace->skip;
|
||||||
unsigned long addr;
|
unsigned long addr;
|
||||||
|
|
||||||
#ifdef CONFIG_FRAME_POINTER
|
#ifdef CONFIG_FRAME_POINTER
|
||||||
|
@ -159,12 +160,8 @@ save_context_stack(struct stack_trace *trace, unsigned int skip,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Save stack-backtrace addresses into a stack_trace buffer.
|
* Save stack-backtrace addresses into a stack_trace buffer.
|
||||||
* If all_contexts is set, all contexts (hardirq, softirq and process)
|
|
||||||
* are saved. If not set then only the current context is saved.
|
|
||||||
*/
|
*/
|
||||||
void save_stack_trace(struct stack_trace *trace,
|
void save_stack_trace(struct stack_trace *trace, struct task_struct *task)
|
||||||
struct task_struct *task, int all_contexts,
|
|
||||||
unsigned int skip)
|
|
||||||
{
|
{
|
||||||
unsigned long stack = (unsigned long)&stack;
|
unsigned long stack = (unsigned long)&stack;
|
||||||
int i, nr_stacks = 0, stacks_done[MAX_STACKS];
|
int i, nr_stacks = 0, stacks_done[MAX_STACKS];
|
||||||
|
@ -207,9 +204,8 @@ void save_stack_trace(struct stack_trace *trace,
|
||||||
return;
|
return;
|
||||||
stacks_done[nr_stacks] = stack_end;
|
stacks_done[nr_stacks] = stack_end;
|
||||||
|
|
||||||
stack = save_context_stack(trace, skip, stack, stack_end);
|
stack = save_context_stack(trace, stack, stack_end);
|
||||||
if (!all_contexts || !stack ||
|
if (!stack || trace->nr_entries >= trace->max_entries)
|
||||||
trace->nr_entries >= trace->max_entries)
|
|
||||||
return;
|
return;
|
||||||
trace->entries[trace->nr_entries++] = ULONG_MAX;
|
trace->entries[trace->nr_entries++] = ULONG_MAX;
|
||||||
if (trace->nr_entries >= trace->max_entries)
|
if (trace->nr_entries >= trace->max_entries)
|
||||||
|
|
|
@ -5,15 +5,16 @@
|
||||||
struct stack_trace {
|
struct stack_trace {
|
||||||
unsigned int nr_entries, max_entries;
|
unsigned int nr_entries, max_entries;
|
||||||
unsigned long *entries;
|
unsigned long *entries;
|
||||||
|
int skip; /* input argument: How many entries to skip */
|
||||||
|
int all_contexts; /* input argument: if true do than one stack */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void save_stack_trace(struct stack_trace *trace,
|
extern void save_stack_trace(struct stack_trace *trace,
|
||||||
struct task_struct *task, int all_contexts,
|
struct task_struct *task);
|
||||||
unsigned int skip);
|
|
||||||
|
|
||||||
extern void print_stack_trace(struct stack_trace *trace, int spaces);
|
extern void print_stack_trace(struct stack_trace *trace, int spaces);
|
||||||
#else
|
#else
|
||||||
# define save_stack_trace(trace, task, all, skip) do { } while (0)
|
# define save_stack_trace(trace, task) do { } while (0)
|
||||||
# define print_stack_trace(trace) do { } while (0)
|
# define print_stack_trace(trace) do { } while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -224,7 +224,10 @@ static int save_trace(struct stack_trace *trace)
|
||||||
trace->max_entries = MAX_STACK_TRACE_ENTRIES - nr_stack_trace_entries;
|
trace->max_entries = MAX_STACK_TRACE_ENTRIES - nr_stack_trace_entries;
|
||||||
trace->entries = stack_trace + nr_stack_trace_entries;
|
trace->entries = stack_trace + nr_stack_trace_entries;
|
||||||
|
|
||||||
save_stack_trace(trace, NULL, 0, 3);
|
trace->skip = 3;
|
||||||
|
trace->all_contexts = 0;
|
||||||
|
|
||||||
|
save_stack_trace(trace, NULL);
|
||||||
|
|
||||||
trace->max_entries = trace->nr_entries;
|
trace->max_entries = trace->nr_entries;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue