Whamcloud - gitweb
LU-12977 ldiskfs: properly take inode_lock() for truncates
[fs/lustre-release.git] / libcfs / libcfs / linux / linux-debug.c
index aa01487..3dd1307 100644 (file)
@@ -40,9 +40,6 @@
 #include <linux/kmod.h>
 #include <linux/module.h>
 #include <linux/notifier.h>
-#ifdef HAVE_KERNEL_LOCKED
-#include <linux/smp_lock.h>
-#endif
 #include <linux/string.h>
 #include <linux/unistd.h>
 #include <linux/stacktrace.h>
@@ -128,8 +125,39 @@ do {                                                                              \
 #define MAX_ST_ENTRIES 100
 static DEFINE_SPINLOCK(st_lock);
 
+/*
+ * Linux v5.1-rc5 214d8ca6ee ("stacktrace: Provide common infrastructure")
+ * CONFIG_ARCH_STACKWALK indicates that save_stack_trace_tsk symbol is not
+ * exported. Use symbol_get() to find if save_stack_trace_tsk is available.
+ */
+#ifdef CONFIG_ARCH_STACKWALK
+typedef unsigned int (stack_trace_save_tsk_t)(struct task_struct *task,
+               unsigned long *store, unsigned int size,
+               unsigned int skipnr);
+static stack_trace_save_tsk_t *task_dump_stack;
+#endif
+
 static void libcfs_call_trace(struct task_struct *tsk)
 {
+#ifdef CONFIG_ARCH_STACKWALK
+       static unsigned long entries[MAX_ST_ENTRIES];
+       unsigned int i, nr_entries;
+
+       if (!task_dump_stack)
+               task_dump_stack = (stack_trace_save_tsk_t *)
+                       symbol_get("stack_trace_save_tsk");
+
+       spin_lock(&st_lock);
+       pr_info("Pid: %d, comm: %.20s %s %s\n", tsk->pid, tsk->comm,
+              init_utsname()->release, init_utsname()->version);
+       pr_info("Call Trace TBD:\n");
+       if (task_dump_stack) {
+               nr_entries = task_dump_stack(tsk, entries, MAX_ST_ENTRIES, 0);
+               for (i = 0; i < nr_entries; i++)
+                       pr_info("[<0>] %pB\n", (void *)entries[i]);
+       }
+       spin_unlock(&st_lock);
+#else
        struct stack_trace trace;
        static unsigned long entries[MAX_ST_ENTRIES];
 
@@ -145,6 +173,7 @@ static void libcfs_call_trace(struct task_struct *tsk)
        save_stack_trace_tsk(tsk, &trace);
        print_stack_trace(&trace, 0);
        spin_unlock(&st_lock);
+#endif
 }
 
 #else /* !CONFIG_STACKTRACE */
@@ -154,21 +183,6 @@ static void libcfs_call_trace(struct task_struct *tsk)
 #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);
-       print_symbol(msg, symbol);
-       printk("\n");
-}
-
-static void print_trace_warning(void *data, char *msg)
-{
-       printk("%s%s\n", (char *)data, msg);
-}
-#endif
-
 static int print_trace_stack(void *data, char *name)
 {
        printk(" <%s> ", name);
@@ -193,15 +207,9 @@ print_trace_address(void *data, unsigned long addr, int reliable)
 }
 
 static const struct stacktrace_ops print_trace_ops = {
-#ifdef HAVE_STACKTRACE_WARNING
-       .warning = print_trace_warning,
-       .warning_symbol = print_trace_warning_symbol,
-#endif
        .stack = print_trace_stack,
        .address = print_trace_address,
-#ifdef STACKTRACE_OPS_HAVE_WALK_STACK
        .walk_stack = print_context_stack,
-#endif
 };
 #endif /* HAVE_STACKTRACE_OPS */
 
@@ -210,11 +218,7 @@ 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);
+       dump_trace(tsk, NULL, NULL, 0, &print_trace_ops, NULL);
        printk("\n");
 #else /* !HAVE_STACKTRACE_OPS */
        if (tsk == current)
@@ -260,10 +264,6 @@ static int panic_notifier(struct notifier_block *self, unsigned long unused1,
         if (in_interrupt()) {
                 cfs_trace_debug_print();
         } else {
-#ifdef HAVE_KERNEL_LOCKED
-               while (kernel_locked())
-                       unlock_kernel();
-#endif
                libcfs_debug_dumplog_internal((void *)(long)current_pid());
         }
 #endif