[PATCH] simplify the stacktrace code

From: Christoph Hellwig
Date: Mon Jan 08 2007 - 08:52:05 EST


Simplify the stacktrace code:

- remove the unused task argument to save_stack_trace, it's always
current
- remove the all_contexts flag, it's alwasy 0


Signed-off-by: Christoph Hellwig <hch@xxxxxx>

Index: linux-2.6/arch/mips/kernel/stacktrace.c
===================================================================
--- linux-2.6.orig/arch/mips/kernel/stacktrace.c 2006-12-25 12:57:06.000000000 +0100
+++ linux-2.6/arch/mips/kernel/stacktrace.c 2006-12-25 12:58:15.000000000 +0100
@@ -31,8 +31,7 @@
}
}

-static void save_context_stack(struct stack_trace *trace,
- struct task_struct *task, struct pt_regs *regs)
+static void save_context_stack(struct stack_trace *trace, struct pt_regs *regs)
{
unsigned long sp = regs->regs[29];
#ifdef CONFIG_KALLSYMS
@@ -41,7 +40,7 @@

if (raw_show_trace || !__kernel_text_address(pc)) {
unsigned long stack_page =
- (unsigned long)task_stack_page(task);
+ (unsigned long)task_stack_page(current);
if (stack_page && sp >= stack_page &&
sp <= stack_page + THREAD_SIZE - 32)
save_raw_context_stack(trace, sp);
@@ -54,7 +53,7 @@
trace->entries[trace->nr_entries++] = pc;
if (trace->nr_entries >= trace->max_entries)
break;
- pc = unwind_stack(task, &sp, pc, &ra);
+ pc = unwind_stack(current, &sp, pc, &ra);
} while (pc);
#else
save_raw_context_stack(trace, sp);
@@ -64,22 +63,13 @@
/*
* Save stack-backtrace addresses into a stack_trace buffer.
*/
-void save_stack_trace(struct stack_trace *trace, struct task_struct *task)
+void save_stack_trace(struct stack_trace *trace)
{
struct pt_regs dummyregs;
struct pt_regs *regs = &dummyregs;

WARN_ON(trace->nr_entries || !trace->max_entries);

- if (task && task != current) {
- regs->regs[29] = task->thread.reg29;
- regs->regs[31] = 0;
- regs->cp0_epc = task->thread.reg31;
- } else {
- if (!task)
- task = current;
- prepare_frametrace(regs);
- }
-
- save_context_stack(trace, task, regs);
+ prepare_frametrace(regs);
+ save_context_stack(trace, regs);
}
Index: linux-2.6/arch/s390/kernel/stacktrace.c
===================================================================
--- linux-2.6.orig/arch/s390/kernel/stacktrace.c 2006-12-25 12:54:49.000000000 +0100
+++ linux-2.6/arch/s390/kernel/stacktrace.c 2006-12-25 12:58:48.000000000 +0100
@@ -59,7 +59,7 @@
}
}

-void save_stack_trace(struct stack_trace *trace, struct task_struct *task)
+void save_stack_trace(struct stack_trace *trace)
{
register unsigned long sp asm ("15");
unsigned long orig_sp, new_sp;
@@ -69,20 +69,16 @@
new_sp = save_context_stack(trace, &trace->skip, orig_sp,
S390_lowcore.panic_stack - PAGE_SIZE,
S390_lowcore.panic_stack);
- if ((new_sp != orig_sp) && !trace->all_contexts)
+ if (new_sp != orig_sp)
return;
new_sp = save_context_stack(trace, &trace->skip, new_sp,
S390_lowcore.async_stack - ASYNC_SIZE,
S390_lowcore.async_stack);
- if ((new_sp != orig_sp) && !trace->all_contexts)
+ if (new_sp != orig_sp)
return;
- if (task)
- save_context_stack(trace, &trace->skip, new_sp,
- (unsigned long) task_stack_page(task),
- (unsigned long) task_stack_page(task) + THREAD_SIZE);
- else
- save_context_stack(trace, &trace->skip, new_sp,
- S390_lowcore.thread_info,
- S390_lowcore.thread_info + THREAD_SIZE);
+
+ save_context_stack(trace, &trace->skip, new_sp,
+ S390_lowcore.thread_info,
+ S390_lowcore.thread_info + THREAD_SIZE);
return;
}
Index: linux-2.6/arch/sh/kernel/stacktrace.c
===================================================================
--- linux-2.6.orig/arch/sh/kernel/stacktrace.c 2006-12-25 12:57:06.000000000 +0100
+++ linux-2.6/arch/sh/kernel/stacktrace.c 2006-12-25 12:59:04.000000000 +0100
@@ -19,14 +19,7 @@
*/
void save_stack_trace(struct stack_trace *trace, struct task_struct *task)
{
- unsigned long *sp;
-
- if (!task)
- task = current;
- if (task == current)
- sp = (unsigned long *)current_stack_pointer;
- else
- sp = (unsigned long *)task->thread.sp;
+ unsigned long *sp = (unsigned long *)current_stack_pointer;

while (!kstack_end(sp)) {
unsigned long addr = *sp++;
Index: linux-2.6/arch/sparc64/kernel/stacktrace.c
===================================================================
--- linux-2.6.orig/arch/sparc64/kernel/stacktrace.c 2006-12-25 12:57:06.000000000 +0100
+++ linux-2.6/arch/sparc64/kernel/stacktrace.c 2006-12-25 12:59:39.000000000 +0100
@@ -3,22 +3,16 @@
#include <linux/thread_info.h>
#include <asm/ptrace.h>

-void save_stack_trace(struct stack_trace *trace, struct task_struct *task)
+void save_stack_trace(struct stack_trace *trace)
{
unsigned long ksp, fp, thread_base;
- struct thread_info *tp;
+ struct thread_info *tp = task_thread_info(current);

- if (!task)
- task = current;
- tp = task_thread_info(task);
- if (task == current) {
- flushw_all();
- __asm__ __volatile__(
- "mov %%fp, %0"
- : "=r" (ksp)
- );
- } else
- ksp = tp->ksp;
+ flushw_all();
+ __asm__ __volatile__(
+ "mov %%fp, %0"
+ : "=r" (ksp)
+ );

fp = ksp + STACK_BIAS;
thread_base = (unsigned long) tp;
Index: linux-2.6/arch/x86_64/kernel/stacktrace.c
===================================================================
--- linux-2.6.orig/arch/x86_64/kernel/stacktrace.c 2006-12-25 12:54:49.000000000 +0100
+++ linux-2.6/arch/x86_64/kernel/stacktrace.c 2006-12-25 12:59:54.000000000 +0100
@@ -21,8 +21,7 @@

static int save_stack_stack(void *data, char *name)
{
- struct stack_trace *trace = (struct stack_trace *)data;
- return trace->all_contexts ? 0 : -1;
+ return -1;
}

static void save_stack_address(void *data, unsigned long addr)
@@ -46,9 +45,9 @@
/*
* Save stack-backtrace addresses into a stack_trace buffer.
*/
-void save_stack_trace(struct stack_trace *trace, struct task_struct *task)
+void save_stack_trace(struct stack_trace *trace)
{
- dump_trace(task, NULL, NULL, &save_stack_ops, trace);
+ dump_trace(current, NULL, NULL, &save_stack_ops, trace);
trace->entries[trace->nr_entries++] = ULONG_MAX;
}
EXPORT_SYMBOL(save_stack_trace);
Index: linux-2.6/include/linux/stacktrace.h
===================================================================
--- linux-2.6.orig/include/linux/stacktrace.h 2006-12-25 12:54:49.000000000 +0100
+++ linux-2.6/include/linux/stacktrace.h 2006-12-25 13:00:06.000000000 +0100
@@ -6,15 +6,13 @@
unsigned int nr_entries, max_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,
- struct task_struct *task);
+extern void save_stack_trace(struct stack_trace *trace);

extern void print_stack_trace(struct stack_trace *trace, int spaces);
#else
-# define save_stack_trace(trace, task) do { } while (0)
+# define save_stack_trace(trace) do { } while (0)
# define print_stack_trace(trace) do { } while (0)
#endif

Index: linux-2.6/kernel/lockdep.c
===================================================================
--- linux-2.6.orig/kernel/lockdep.c 2006-12-25 12:54:50.000000000 +0100
+++ linux-2.6/kernel/lockdep.c 2006-12-25 13:00:12.000000000 +0100
@@ -254,9 +254,8 @@
trace->entries = stack_trace + nr_stack_trace_entries;

trace->skip = 3;
- trace->all_contexts = 0;

- save_stack_trace(trace, NULL);
+ save_stack_trace(trace);

trace->max_entries = trace->nr_entries;

Index: linux-2.6/lib/fault-inject.c
===================================================================
--- linux-2.6.orig/lib/fault-inject.c 2006-12-25 12:54:50.000000000 +0100
+++ linux-2.6/lib/fault-inject.c 2006-12-25 13:00:19.000000000 +0100
@@ -72,9 +72,8 @@
trace.entries = entries;
trace.max_entries = depth;
trace.skip = 1;
- trace.all_contexts = 0;

- save_stack_trace(&trace, NULL);
+ save_stack_trace(&trace);
for (n = 0; n < trace.nr_entries; n++) {
if (attr->reject_start <= entries[n] &&
entries[n] < attr->reject_end)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/