])
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])
])
])
+#
+# 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])
])
])
-#
-# 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])
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)
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))