]) # LIBCFS_GET_USER_PAGES_6ARG
#
+# LIBCFS_STACKTRACE_OPS
+#
+# Kernel version 4.8 commit c8fe4609827aedc9c4b45de80e7cdc8ccfa8541b
+# removed both struct stacktrace_ops and dump_trace() function
+#
+AC_DEFUN([LIBCFS_STACKTRACE_OPS], [
+LB_CHECK_COMPILE([if 'struct stacktrace_ops' exists],
+stacktrace_ops, [
+ struct task_struct;
+ struct pt_regs;
+ #include <asm/stacktrace.h>
+],[
+ struct stacktrace_ops ops;
+ ops.stack = NULL;
+],[
+ AC_DEFINE(HAVE_STACKTRACE_OPS, 1,
+ [struct stacktrace_ops exists])
+])
+]) # LIBCFS_STACKTRACE_OPS
+
+#
# LIBCFS_PROG_LINUX
#
# LibCFS linux kernel checks
# 4.6
LIBCFS_STACKTRACE_OPS_ADDRESS_RETURN_INT
LIBCFS_GET_USER_PAGES_6ARG
+# 4.8
+LIBCFS_STACKTRACE_OPS
]) # LIBCFS_PROG_LINUX
#
#include <linux/nmi.h>
#include <asm/stacktrace.h>
+#ifdef HAVE_STACKTRACE_OPS
#ifdef HAVE_STACKTRACE_WARNING
static void
print_trace_warning_symbol(void *data, char *msg, unsigned long symbol)
{
- printk("%s", (char *)data);
+ printk("%s", (char *)data);
print_symbol(msg, symbol);
printk("\n");
}
.walk_stack = print_context_stack,
#endif
};
+#endif /* HAVE_STACKTRACE_OPS */
static void libcfs_call_trace(struct task_struct *tsk)
{
+#ifdef HAVE_STACKTRACE_OPS
+ printk("Pid: %d, comm: %.20s\n", tsk->pid, tsk->comm);
+ printk("\nCall Trace:\n");
dump_trace(tsk, NULL, NULL,
#ifdef HAVE_DUMP_TRACE_ADDRESS
0,
#endif /* HAVE_DUMP_TRACE_ADDRESS */
&print_trace_ops, NULL);
printk("\n");
+#else /* !HAVE_STACKTRACE_OPS */
+ if (tsk == current)
+ dump_stack();
+ else
+ CWARN("can't show stack: kernel doesn't export show_task\n");
+#endif /* HAVE_STACKTRACE_OPS */
}
#else /* !CONFIG_X86 */
static void libcfs_call_trace(struct task_struct *tsk)
{
- if ((tsk == NULL) || (tsk == current))
+ if (tsk == current)
dump_stack();
else
CWARN("can't show stack: kernel doesn't export show_task\n");
void libcfs_debug_dumpstack(struct task_struct *tsk)
{
- /* dump_stack() */
- /* show_trace() */
- if (tsk == NULL)
- tsk = current;
- printk("Pid: %d, comm: %.20s\n", tsk->pid, tsk->comm);
- /* show_trace_log_lvl() */
- printk("\nCall Trace:\n");
- libcfs_call_trace(tsk);
+ libcfs_call_trace(tsk ?: current);
}
EXPORT_SYMBOL(libcfs_debug_dumpstack);