Whamcloud - gitweb
LU-1346 libcfs: cleanup macros in portals_compat25.h
[fs/lustre-release.git] / libcfs / libcfs / linux / linux-debug.c
index c882f06..4d0f4df 100644 (file)
@@ -1,6 +1,4 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
  * GPL HEADER START
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -28,6 +26,8 @@
 /*
  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
+ *
+ * Copyright (c) 2012, 2013, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
  * Author: Phil Schwan <phil@clusterfs.com>
  */
 
-#ifndef EXPORT_SYMTAB
-# define EXPORT_SYMTAB
-#endif
-
-#ifndef AUTOCONF_INCLUDED
-#include <linux/config.h>
-#endif
 #include <linux/module.h>
 #include <linux/kmod.h>
 #include <linux/notifier.h>
 #include <linux/string.h>
 #include <linux/stat.h>
 #include <linux/errno.h>
+#ifdef HAVE_KERNEL_LOCKED
 #include <linux/smp_lock.h>
+#endif
 #include <linux/unistd.h>
 #include <linux/interrupt.h>
-#include <asm/system.h>
 #include <asm/uaccess.h>
 #include <linux/completion.h>
 
@@ -73,9 +67,7 @@
 
 #include "tracefile.h"
 
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
 #include <linux/kallsyms.h>
-#endif
 
 char lnet_upcall[1024] = "/usr/lib/lustre/lnet_upcall";
 char lnet_debug_log_upcall[1024] = "/usr/lib/lustre/lnet_debug_log_upcall";
@@ -102,7 +94,7 @@ void libcfs_run_debug_log_upcall(char *file)
 
         argv[2] = NULL;
 
-        rc = USERMODEHELPER(argv[0], argv, envp);
+        rc = call_usermodehelper(argv[0], argv, envp, 1);
         if (rc < 0 && rc != -ENOENT) {
                 CERROR("Error %d invoking LNET debug log upcall %s %s; "
                        "check /proc/sys/lnet/debug_log_upcall\n",
@@ -132,7 +124,7 @@ void libcfs_run_upcall(char **argv)
 
         LASSERT(argc >= 2);
 
-        rc = USERMODEHELPER(argv[0], argv, envp);
+        rc = call_usermodehelper(argv[0], argv, envp, 1);
         if (rc < 0 && rc != -ENOENT) {
                 CERROR("Error %d invoking LNET upcall %s %s%s%s%s%s%s%s%s; "
                        "check /proc/sys/lnet/upcall\n",
@@ -151,41 +143,28 @@ void libcfs_run_upcall(char **argv)
         }
 }
 
-void libcfs_run_lbug_upcall(const char *file, const char *fn, const int line)
+void libcfs_run_lbug_upcall(struct libcfs_debug_msg_data *msgdata)
 {
         char *argv[6];
         char buf[32];
 
         ENTRY;
-        snprintf (buf, sizeof buf, "%d", line);
+        snprintf (buf, sizeof buf, "%d", msgdata->msg_line);
 
         argv[1] = "LBUG";
-        argv[2] = (char *)file;
-        argv[3] = (char *)fn;
+        argv[2] = (char *)msgdata->msg_file;
+        argv[3] = (char *)msgdata->msg_fn;
         argv[4] = buf;
         argv[5] = NULL;
 
         libcfs_run_upcall (argv);
 }
 
-#ifdef __arch_um__
-void lbug_with_loc(const char *file, const char *func, const int line)
-{
-        libcfs_catastrophe = 1;
-        libcfs_debug_msg(NULL, 0, D_EMERG, file, func, line,
-                         "LBUG - trying to dump log to %s\n",
-                         libcfs_debug_file_path);
-        libcfs_debug_dumplog();
-        libcfs_run_lbug_upcall(file, func, line);
-        asm("int $3");
-        panic("LBUG");
-}
-#else
 /* coverity[+kill] */
-void lbug_with_loc(const char *file, const char *func, const int line)
+void lbug_with_loc(struct libcfs_debug_msg_data *msgdata)
 {
         libcfs_catastrophe = 1;
-        libcfs_debug_msg(NULL, 0, D_EMERG, file, func, line, "LBUG\n");
+        libcfs_debug_msg(msgdata, "LBUG\n");
 
         if (in_interrupt()) {
                 panic("LBUG in interrupt.\n");
@@ -195,14 +174,13 @@ void lbug_with_loc(const char *file, const char *func, const int line)
         libcfs_debug_dumpstack(NULL);
         if (!libcfs_panic_on_lbug)
                 libcfs_debug_dumplog();
-        libcfs_run_lbug_upcall(file, func, line);
+        libcfs_run_lbug_upcall(msgdata);
         if (libcfs_panic_on_lbug)
                 panic("LBUG");
         set_task_state(current, TASK_UNINTERRUPTIBLE);
         while (1)
                 schedule();
 }
-#endif /* __arch_um__ */
 
 #ifdef __KERNEL__
 
@@ -210,6 +188,7 @@ void lbug_with_loc(const char *file, const char *func, const int line)
 #include <linux/nmi.h>
 #include <asm/stacktrace.h>
 
+#ifdef HAVE_STACKTRACE_WARNING
 static void
 print_trace_warning_symbol(void *data, char *msg, unsigned long symbol)
 {
@@ -222,6 +201,7 @@ 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)
 {
@@ -247,21 +227,21 @@ static void print_trace_address(void *data, unsigned long addr)
 }
 
 static DUMP_TRACE_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
 
 void libcfs_debug_dumpstack(struct task_struct *tsk)
 {
-#if defined(__arch_um__)
-        if (tsk != NULL)
-                CWARN("stack dump for pid %d (%d) requested; wake up gdb.\n",
-                      tsk->pid, UML_PID(tsk));
-        //asm("int $3");
-#elif defined(HAVE_DUMP_TRACE)
+#if defined(HAVE_DUMP_TRACE)
         /* dump_stack() */
         /* show_trace() */
         if (tsk == NULL)
@@ -270,9 +250,9 @@ void libcfs_debug_dumpstack(struct task_struct *tsk)
         /* show_trace_log_lvl() */
        printk("\nCall Trace:\n");
        dump_trace(tsk, NULL, NULL,
-#ifdef HAVE_TRACE_ADDRESS_RELIABLE
+#ifdef HAVE_DUMP_TRACE_ADDRESS
                    0,
-#endif /* HAVE_TRACE_ADDRESS_RELIABLE */
+#endif /* HAVE_DUMP_TRACE_ADDRESS */
                    &print_trace_ops, NULL);
        printk("\n");
 #elif defined(HAVE_SHOW_TASK)
@@ -313,9 +293,10 @@ static int panic_notifier(struct notifier_block *self, unsigned long unused1,
         if (in_interrupt()) {
                 cfs_trace_debug_print();
         } else {
-                while (current->lock_depth >= 0)
-                        unlock_kernel();
-
+# ifdef HAVE_KERNEL_LOCKED
+               while (kernel_locked())
+                       unlock_kernel();
+# endif
                 libcfs_debug_dumplog_internal((void *)(long)cfs_curproc_pid());
         }
 #endif
@@ -330,20 +311,12 @@ static struct notifier_block libcfs_panic_notifier = {
 
 void libcfs_register_panic_notifier(void)
 {
-#ifdef HAVE_ATOMIC_PANIC_NOTIFIER
         atomic_notifier_chain_register(&panic_notifier_list, &libcfs_panic_notifier);
-#else
-        notifier_chain_register(&panic_notifier_list, &libcfs_panic_notifier);
-#endif
 }
 
 void libcfs_unregister_panic_notifier(void)
 {
-#ifdef HAVE_ATOMIC_PANIC_NOTIFIER
         atomic_notifier_chain_unregister(&panic_notifier_list, &libcfs_panic_notifier);
-#else
-        notifier_chain_unregister(&panic_notifier_list, &libcfs_panic_notifier);
-#endif
 }
 
 EXPORT_SYMBOL(libcfs_debug_dumpstack);