Whamcloud - gitweb
Branch b1_8
authoryangsheng <yangsheng>
Mon, 11 May 2009 03:06:06 +0000 (03:06 +0000)
committeryangsheng <yangsheng>
Mon, 11 May 2009 03:06:06 +0000 (03:06 +0000)
b=11505

i=brian, shadow

Check whether print_trace_address() with "reliable" argument.

lnet/autoconf/lustre-lnet.m4
lnet/libcfs/linux/linux-debug.c

index 3bcb307..1e93f9e 100644 (file)
@@ -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 <asm/stacktrace.h>
+       ],[
+               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])
index 4735e0f..c75bdf4 100644 (file)
@@ -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))