X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libcfs%2Flibcfs%2Flinux%2Flinux-debug.c;h=46fbc2911821ba8aa92ed28b18b4cdc878f0f406;hb=4f6be250fdfa6530886597d13d3d1377c90e20a7;hp=4db7b4ac35da27d2d3749d8a9153a057a4e06452;hpb=70d70c4f541c84adc88c372d670cd3a7fa8bc91f;p=fs%2Flustre-release.git diff --git a/libcfs/libcfs/linux/linux-debug.c b/libcfs/libcfs/linux/linux-debug.c index 4db7b4ac..46fbc29 100644 --- a/libcfs/libcfs/linux/linux-debug.c +++ b/libcfs/libcfs/linux/linux-debug.c @@ -23,7 +23,7 @@ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2012, 2013, Intel Corporation. + * Copyright (c) 2012, 2017, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -34,27 +34,19 @@ * Author: Phil Schwan */ -#include +#include +#include +#include #include +#include #include -#include -#include -#include -#include -#include #ifdef HAVE_KERNEL_LOCKED #include #endif +#include #include -#include -#include -#include - -#include -#include -#include -#include -#include +#include +#include # define DEBUG_SUBSYSTEM S_LNET @@ -62,8 +54,6 @@ #include "tracefile.h" -#include - char lnet_debug_log_upcall[1024] = "/usr/lib/lustre/lnet_debug_log_upcall"; /** @@ -104,25 +94,51 @@ void libcfs_run_debug_log_upcall(char *file) /* coverity[+kill] */ void lbug_with_loc(struct libcfs_debug_msg_data *msgdata) { - libcfs_catastrophe = 1; - libcfs_debug_msg(msgdata, "LBUG\n"); + libcfs_catastrophe = 1; + libcfs_debug_msg(msgdata, "LBUG\n"); - if (in_interrupt()) { - panic("LBUG in interrupt.\n"); - /* not reached */ - } + if (in_interrupt()) { + panic("LBUG in interrupt.\n"); + /* not reached */ + } - libcfs_debug_dumpstack(NULL); - if (!libcfs_panic_on_lbug) - libcfs_debug_dumplog(); - if (libcfs_panic_on_lbug) - panic("LBUG"); - set_task_state(current, TASK_UNINTERRUPTIBLE); - while (1) - schedule(); + libcfs_debug_dumpstack(NULL); + if (libcfs_panic_on_lbug) + panic("LBUG"); + else + libcfs_debug_dumplog(); + set_current_state(TASK_UNINTERRUPTIBLE); + while (1) + schedule(); } EXPORT_SYMBOL(lbug_with_loc); +#ifdef CONFIG_STACKTRACE + +#define MAX_ST_ENTRIES 100 +static DEFINE_SPINLOCK(st_lock); + +static void libcfs_call_trace(struct task_struct *tsk) +{ + struct stack_trace trace; + static unsigned long entries[MAX_ST_ENTRIES]; + + trace.nr_entries = 0; + trace.max_entries = MAX_ST_ENTRIES; + trace.entries = entries; + trace.skip = 0; + + 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:\n"); + save_stack_trace_tsk(tsk, &trace); + print_stack_trace(&trace, 0); + spin_unlock(&st_lock); +} + +#else /* !CONFIG_STACKTRACE */ + #ifdef CONFIG_X86 #include #include @@ -210,18 +226,14 @@ static void libcfs_call_trace(struct task_struct *tsk) #endif /* CONFIG_X86 */ +#endif /* CONFIG_STACKTRACE */ + void libcfs_debug_dumpstack(struct task_struct *tsk) { libcfs_call_trace(tsk ?: current); } EXPORT_SYMBOL(libcfs_debug_dumpstack); -struct task_struct *libcfs_current(void) -{ - CWARN("current task struct is %p\n", current); - return current; -} - static int panic_notifier(struct notifier_block *self, unsigned long unused1, void *unused2) {