From: yangsheng Date: Mon, 11 May 2009 03:04:27 +0000 (+0000) Subject: Branch b_release_1_8_1 X-Git-Tag: v1_8_0_110~33 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=f32b0b04c16a7d34eeb7afda71dfbb7335e48699;p=fs%2Flustre-release.git Branch b_release_1_8_1 b=11505 i=brian(LLNL), shadow Check whether print_trace_address() with "reliable" argument. --- diff --git a/lnet/autoconf/lustre-lnet.m4 b/lnet/autoconf/lustre-lnet.m4 index 3bcb307..1e93f9e 100644 --- a/lnet/autoconf/lustre-lnet.m4 +++ b/lnet/autoconf/lustre-lnet.m4 @@ -1320,6 +1320,7 @@ LB_LINUX_TRY_COMPILE([ ]) EXTRA_KCFLAGS="$tmp_flags" ]) + # 2.6.23 lost dtor argument AC_DEFUN([LN_KMEM_CACHE_CREATE_DTOR], [AC_MSG_CHECKING([check kmem_cache_create has dtor argument]) @@ -1336,6 +1337,40 @@ LB_LINUX_TRY_COMPILE([ ]) ]) +# +# LN_FUNC_DUMP_TRACE +# +# 2.6.23 exports dump_trace() so we can dump_stack() on any task +# 2.6.24 has stacktrace_ops.address with "reliable" parameter +# +AC_DEFUN([LN_FUNC_DUMP_TRACE], +[LB_CHECK_SYMBOL_EXPORT([dump_trace], +[kernel/ksyms.c arch/${LINUX_ARCH%_64}/kernel/traps_64.c],[ + AC_DEFINE(HAVE_DUMP_TRACE, 1, [dump_trace is exported]) + AC_MSG_CHECKING([whether print_trace_address has reliable argument]) + tmp_flags="$EXTRA_KCFLAGS" + EXTRA_KCFLAGS="-Werror" + LB_LINUX_TRY_COMPILE([ + struct task_struct; + struct pt_regs; + void print_addr(void *data, unsigned long addr, int reliable); + #include + ],[ + struct stacktrace_ops ops; + + ops.address = print_addr; + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_TRACE_ADDRESS_RELIABLE, 1, + [print_trace_address has reliable argument]) + ],[ + AC_MSG_RESULT(no) + ],[ + ]) +EXTRA_KCFLAGS="$tmp_flags" +]) +]) + # 2.6.24 request not use real numbers for ctl_name AC_DEFUN([LN_SYSCTL_UNNUMBERED], [AC_MSG_CHECKING([for CTL_UNNUMBERED]) @@ -1388,19 +1423,6 @@ LB_LINUX_TRY_COMPILE([ ]) ]) -# -# LN_FUNC_DUMP_TRACE -# -# 2.6.27 exports dump_trace() so we can dump_stack() on any task -# -AC_DEFUN([LN_FUNC_DUMP_TRACE], -[LB_CHECK_SYMBOL_EXPORT([dump_trace], -[kernel/ksyms.c arch/${LINUX_ARCH%_64}/kernel/traps_64.c],[ - AC_DEFINE(HAVE_DUMP_TRACE, 1, [dump_trace is exported]) -],[ -]) -]) - # 2.6.27 have second argument to sock_map_fd AC_DEFUN([LN_SOCK_MAP_FD_2ARG], [AC_MSG_CHECKING([sock_map_fd have second argument]) diff --git a/lnet/libcfs/linux/linux-debug.c b/lnet/libcfs/linux/linux-debug.c index 4735e0f..c75bdf4 100644 --- a/lnet/libcfs/linux/linux-debug.c +++ b/lnet/libcfs/linux/linux-debug.c @@ -229,23 +229,23 @@ static int print_trace_stack(void *data, char *name) return 0; } -void printk_address(unsigned long address, int reliable) -{ - printk(" [<%016lx>] %s%pS\n", address, reliable ? "": "? ", (void *) address); -} - +#ifdef HAVE_TRACE_ADDRESS_RELIABLE +# define RELIABLE reliable +# define DUMP_TRACE_CONST const static void print_trace_address(void *data, unsigned long addr, int reliable) +#else +/* before 2.6.24 there was no reliable arg */ +# define RELIABLE 1 +# define DUMP_TRACE_CONST +static void print_trace_address(void *data, unsigned long addr) +#endif { + char fmt[32]; touch_nmi_watchdog(); - printk_address(addr, reliable); + sprintf(fmt, " [<%016lx>] %s%%s\n", addr, RELIABLE ? "": "? "); + __print_symbol(fmt, addr); } -static const struct stacktrace_ops print_trace_ops = { - .warning = print_trace_warning, - .warning_symbol = print_trace_warning_symbol, - .stack = print_trace_stack, - .address = print_trace_address, -}; #endif void libcfs_debug_dumpstack(struct task_struct *tsk) @@ -264,12 +264,22 @@ void libcfs_debug_dumpstack(struct task_struct *tsk) CWARN("showing stack for process %d\n", tsk->pid); show_task(tsk); #elif defined(HAVE_DUMP_TRACE) +static DUMP_TRACE_CONST struct stacktrace_ops print_trace_ops = { + .warning = print_trace_warning, + .warning_symbol = print_trace_warning_symbol, + .stack = print_trace_stack, + .address = print_trace_address, +}; /* dump_stack() */ /* show_trace() */ printk("Pid: %d, comm: %.20s\n", current->pid, current->comm); /* show_trace_log_lvl() */ printk("\nCall Trace:\n"); - dump_trace(tsk, NULL, NULL, 0, &print_trace_ops, ""); + dump_trace(tsk, NULL, NULL, +#ifdef HAVE_TRACE_ADDRESS_RELIABLE + 0, +#endif /* HAVE_TRACE_ADDRESS_RELIABLE */ + &print_trace_ops, NULL); printk("\n"); #else if ((tsk == NULL) || (tsk == current))