X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libcfs%2Flibcfs%2Fdebug.c;h=fb93ac22fdba9fe958a453245b726abf305e67c2;hb=7eef7d96bd0c4463ab4e90657d9e2bf706995c05;hp=f1ccfc5e6611df1e0ff2cf0626cfa290adb56d46;hpb=421d7a675265d697a1a9308aa9dac8030eab497a;p=fs%2Flustre-release.git diff --git a/libcfs/libcfs/debug.c b/libcfs/libcfs/debug.c index f1ccfc5..fb93ac2 100644 --- a/libcfs/libcfs/debug.c +++ b/libcfs/libcfs/debug.c @@ -16,8 +16,8 @@ * in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU General Public License - * version 2 along with this program; If not, see [sun.com URL with a - * copy of GPLv2]. + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or @@ -26,7 +26,7 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. */ /* @@ -36,6 +36,9 @@ * libcfs/libcfs/debug.c * * Author: Phil Schwan + * + * Copyright (c) 2011 Whamcloud, Inc. + * */ #ifndef EXPORT_SYMTAB @@ -60,8 +63,8 @@ CFS_MODULE_PARM(libcfs_debug, "i", int, 0644, "Lustre kernel debug mask"); EXPORT_SYMBOL(libcfs_debug); -int libcfs_debug_mb = -1; -CFS_MODULE_PARM(libcfs_debug_mb, "i", int, 0644, +unsigned int libcfs_debug_mb = 0; +CFS_MODULE_PARM(libcfs_debug_mb, "i", uint, 0644, "Total debug buffer size."); EXPORT_SYMBOL(libcfs_debug_mb); @@ -102,24 +105,24 @@ EXPORT_SYMBOL(portal_enter_debugger); unsigned int libcfs_catastrophe; EXPORT_SYMBOL(libcfs_catastrophe); -unsigned int libcfs_panic_on_lbug = 0; +unsigned int libcfs_watchdog_ratelimit = 300; +EXPORT_SYMBOL(libcfs_watchdog_ratelimit); + +unsigned int libcfs_panic_on_lbug = 1; CFS_MODULE_PARM(libcfs_panic_on_lbug, "i", uint, 0644, "Lustre kernel panic on LBUG"); EXPORT_SYMBOL(libcfs_panic_on_lbug); -atomic_t libcfs_kmemory = ATOMIC_INIT(0); +cfs_atomic_t libcfs_kmemory = CFS_ATOMIC_INIT(0); EXPORT_SYMBOL(libcfs_kmemory); static cfs_waitq_t debug_ctlwq; -#ifdef __arch_um__ -char debug_file_path[1024] = "/r/tmp/lustre-log"; -#else -char debug_file_path[1024] = "/tmp/lustre-log"; -#endif -char *debug_file_path_p = &debug_file_path[0]; +char libcfs_debug_file_path_arr[PATH_MAX] = LIBCFS_DEBUG_FILE_PATH_DEFAULT; -CFS_MODULE_PARM(debug_file_path_p, "s", charp, 0644, +/* We need to pass a pointer here, but elsewhere this must be a const */ +char *libcfs_debug_file_path; +CFS_MODULE_PARM(libcfs_debug_file_path, "s", charp, 0644, "Path for dumping debug logs, " "set 'NONE' to prevent log dumping"); @@ -130,7 +133,7 @@ int libcfs_panic_in_progress; const char * libcfs_debug_subsys2str(int subsys) { - switch (subsys) { + switch (1 << subsys) { default: return NULL; case S_UNDEFINED: @@ -165,6 +168,8 @@ libcfs_debug_subsys2str(int subsys) return "ldlm"; case S_LOV: return "lov"; + case S_LQUOTA: + return "lquota"; case S_LMV: return "lmv"; case S_SEC: @@ -187,7 +192,7 @@ libcfs_debug_subsys2str(int subsys) const char * libcfs_debug_dbg2str(int debug) { - switch (debug) { + switch (1 << debug) { default: return NULL; case D_TRACE: @@ -256,7 +261,6 @@ libcfs_debug_mask2str(char *str, int size, int mask, int is_subsys) libcfs_debug_dbg2str; int len = 0; const char *token; - int bit; int i; if (mask == 0) { /* "0" */ @@ -265,12 +269,10 @@ libcfs_debug_mask2str(char *str, int size, int mask, int is_subsys) len = 1; } else { /* space-separated tokens */ for (i = 0; i < 32; i++) { - bit = 1 << i; - - if ((mask & bit) == 0) + if ((mask & (1 << i)) == 0) continue; - token = fn(bit); + token = fn(i); if (token == NULL) /* unused bit */ continue; @@ -299,55 +301,11 @@ libcfs_debug_mask2str(char *str, int size, int mask, int is_subsys) } int -libcfs_debug_token2mask(int *mask, const char *str, int len, int is_subsys) +libcfs_debug_str2mask(int *mask, const char *str, int is_subsys) { const char *(*fn)(int bit) = is_subsys ? libcfs_debug_subsys2str : libcfs_debug_dbg2str; - int i; - int j; - int bit; - const char *token; - - /* match against known tokens */ - for (i = 0; i < 32; i++) { - bit = 1 << i; - - token = fn(bit); - if (token == NULL) /* unused? */ - continue; - - /* strcasecmp */ - for (j = 0; ; j++) { - if (j == len) { /* end of token */ - if (token[j] == 0) { - *mask = bit; - return 0; - } - break; - } - - if (token[j] == 0) - break; - - if (str[j] == token[j]) - continue; - - if (str[j] < 'A' || 'Z' < str[j]) - break; - - if (str[j] - 'A' + 'a' != token[j]) - break; - } - } - - return -EINVAL; /* no match */ -} - -int -libcfs_debug_str2mask(int *mask, const char *str, int is_subsys) -{ int m = 0; - char op = 0; int matched; int n; int t; @@ -361,81 +319,42 @@ libcfs_debug_str2mask(int *mask, const char *str, int is_subsys) if ((t = sscanf(str, "%i%n", &m, &matched)) >= 1 && matched == n) { + /* don't print warning for lctl set_param debug=0 or -1 */ + if (m != 0 && m != -1) + CWARN("You are trying to use a numerical value for the " + "mask - this will be deprecated in a future " + "release.\n"); *mask = m; return 0; } - /* must be a list of debug tokens or numbers separated by - * whitespace and optionally an operator ('+' or '-'). If an operator - * appears first in , '*mask' is used as the starting point - * (relative), otherwise 0 is used (absolute). An operator applies to - * all following tokens up to the next operator. */ - - matched = 0; - while (*str != 0) { - while (isspace(*str)) /* skip whitespace */ - str++; - - if (*str == 0) - break; - - if (*str == '+' || *str == '-') { - op = *str++; - - /* op on first token == relative */ - if (!matched) - m = *mask; - - while (isspace(*str)) /* skip whitespace */ - str++; - - if (*str == 0) /* trailing op */ - return -EINVAL; - } - - /* find token length */ - for (n = 0; str[n] != 0 && !isspace(str[n]); n++); - - /* match token */ - if (libcfs_debug_token2mask(&t, str, n, is_subsys) != 0) - return -EINVAL; - - matched = 1; - if (op == '-') - m &= ~t; - else - m |= t; - - str += n; - } - - if (!matched) - return -EINVAL; - - *mask = m; - return 0; + return cfs_str2mask(str, fn, mask, is_subsys ? 0 : D_CANTMASK, + 0xffffffff); } +/** + * Dump Lustre log to ::debug_file_path by calling tracefile_dump_all_pages() + */ void libcfs_debug_dumplog_internal(void *arg) { CFS_DECL_JOURNAL_DATA; CFS_PUSH_JOURNAL; - if (strncmp(debug_file_path, "NONE", 4) != 0) { + if (strncmp(libcfs_debug_file_path_arr, "NONE", 4) != 0) { snprintf(debug_file_name, sizeof(debug_file_name) - 1, - "%s.%ld.%ld", debug_file_path, cfs_time_current_sec(), - (long)arg); - printk(KERN_ALERT "LustreError: dumping log to %s\n", + "%s.%ld." LPLD, libcfs_debug_file_path_arr, + cfs_time_current_sec(), (long_ptr_t)arg); + printk(CFS_KERN_ALERT "LustreError: dumping log to %s\n", debug_file_name); - tracefile_dump_all_pages(debug_file_name); + cfs_tracefile_dump_all_pages(debug_file_name); + libcfs_run_debug_log_upcall(debug_file_name); } CFS_POP_JOURNAL; } int libcfs_debug_dumplog_thread(void *arg) { - cfs_daemonize(""); libcfs_debug_dumplog_internal(arg); cfs_waitq_signal(&debug_ctlwq); return 0; @@ -443,48 +362,60 @@ int libcfs_debug_dumplog_thread(void *arg) void libcfs_debug_dumplog(void) { - int rc; cfs_waitlink_t wait; + cfs_task_t *dumper; ENTRY; /* we're being careful to ensure that the kernel thread is * able to set our state to running as it exits before we * get to schedule() */ cfs_waitlink_init(&wait); - set_current_state(TASK_INTERRUPTIBLE); + cfs_set_current_state(CFS_TASK_INTERRUPTIBLE); cfs_waitq_add(&debug_ctlwq, &wait); - rc = cfs_kernel_thread(libcfs_debug_dumplog_thread, - (void *)(long)cfs_curproc_pid(), - CLONE_VM | CLONE_FS | CLONE_FILES); - if (rc < 0) - printk(KERN_ERR "LustreError: cannot start log dump thread: " - "%d\n", rc); + dumper = cfs_kthread_run(libcfs_debug_dumplog_thread, + (void*)(long)cfs_curproc_pid(), + "libcfs_debug_dumper"); + if (IS_ERR(dumper)) + printk(CFS_KERN_ERR "LustreError: cannot start log dump thread:" + " %ld\n", PTR_ERR(dumper)); else cfs_waitq_wait(&wait, CFS_TASK_INTERRUPTIBLE); - /* be sure to teardown if kernel_thread() failed */ + /* be sure to teardown if cfs_create_thread() failed */ cfs_waitq_del(&debug_ctlwq, &wait); - set_current_state(TASK_RUNNING); + cfs_set_current_state(CFS_TASK_RUNNING); } int libcfs_debug_init(unsigned long bufsize) { int rc = 0; - int max = libcfs_debug_mb; + unsigned int max = libcfs_debug_mb; cfs_waitq_init(&debug_ctlwq); - libcfs_console_max_delay = CDEBUG_DEFAULT_MAX_DELAY; - libcfs_console_min_delay = CDEBUG_DEFAULT_MIN_DELAY; + + if (libcfs_console_max_delay <= 0 || /* not set by user or */ + libcfs_console_min_delay <= 0 || /* set to invalid values */ + libcfs_console_min_delay >= libcfs_console_max_delay) { + libcfs_console_max_delay = CDEBUG_DEFAULT_MAX_DELAY; + libcfs_console_min_delay = CDEBUG_DEFAULT_MIN_DELAY; + } + + if (libcfs_debug_file_path != NULL) { + memset(libcfs_debug_file_path_arr, 0, PATH_MAX); + strncpy(libcfs_debug_file_path_arr, + libcfs_debug_file_path, PATH_MAX-1); + } + /* If libcfs_debug_mb is set to an invalid value or uninitialized * then just make the total buffers smp_num_cpus * TCD_MAX_PAGES */ - if (max > trace_max_debug_mb() || max < num_possible_cpus()) { + if (max > cfs_trace_max_debug_mb() || max < cfs_num_possible_cpus()) { max = TCD_MAX_PAGES; } else { - max = (max / num_possible_cpus()); + max = (max / cfs_num_possible_cpus()); max = (max << (20 - CFS_PAGE_SHIFT)); } - rc = tracefile_init(max); + rc = cfs_tracefile_init(max); if (rc == 0) libcfs_register_panic_notifier(); @@ -495,13 +426,13 @@ int libcfs_debug_init(unsigned long bufsize) int libcfs_debug_cleanup(void) { libcfs_unregister_panic_notifier(); - tracefile_exit(); + cfs_tracefile_exit(); return 0; } int libcfs_debug_clear_buffer(void) { - trace_flush_pages(); + cfs_trace_flush_pages(); return 0; } @@ -509,10 +440,10 @@ int libcfs_debug_clear_buffer(void) * should not be be marked as such. */ #undef DEBUG_SUBSYSTEM #define DEBUG_SUBSYSTEM S_UNDEFINED -int libcfs_debug_mark_buffer(char *text) +int libcfs_debug_mark_buffer(const char *text) { CDEBUG(D_TRACE,"***************************************************\n"); - CDEBUG(D_WARNING, "DEBUG MARKER: %s\n", text); + LCONSOLE(D_WARNING, "DEBUG MARKER: %s\n", text); CDEBUG(D_TRACE,"***************************************************\n"); return 0; @@ -522,7 +453,7 @@ int libcfs_debug_mark_buffer(char *text) void libcfs_debug_set_level(unsigned int debug_level) { - printk(KERN_WARNING "Lustre: Setting portals debug level to %08x\n", + printk(CFS_KERN_WARNING "Lustre: Setting portals debug level to %08x\n", debug_level); libcfs_debug = debug_level; }