debug.c

来自「lustre 1.6.5 source code」· C语言 代码 · 共 833 行 · 第 1/2 页

C
833
字号
/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * * Copyright (C) 2002 Cluster File Systems, Inc. *   Author: Phil Schwan <phil@clusterfs.com> * *   This file is part of Lustre, http://www.lustre.org. * *   Lustre is free software; you can redistribute it and/or *   modify it under the terms of version 2 of the GNU General Public *   License as published by the Free Software Foundation. * *   Lustre is distributed in the hope that it will be useful, *   but WITHOUT ANY WARRANTY; without even the implied warranty of *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *   GNU General Public License for more details. * *   You should have received a copy of the GNU General Public License *   along with Lustre; if not, write to the Free Software *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#ifndef EXPORT_SYMTAB# define EXPORT_SYMTAB#endif# define DEBUG_SUBSYSTEM S_LNET#include <stdarg.h>#include <libcfs/kp30.h>#include <libcfs/libcfs.h>#include "tracefile.h"static char debug_file_name[1024];#ifdef __KERNEL__unsigned int libcfs_subsystem_debug = ~0;CFS_MODULE_PARM(libcfs_subsystem_debug, "i", int, 0644,                "Lustre kernel debug subsystem mask");EXPORT_SYMBOL(libcfs_subsystem_debug);unsigned int libcfs_debug = (D_EMERG | D_ERROR | D_WARNING | D_CONSOLE |                             D_NETERROR | D_HA | D_CONFIG | D_IOCTL);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,                "Total debug buffer size.");EXPORT_SYMBOL(libcfs_debug_mb);unsigned int libcfs_printk = D_CANTMASK;CFS_MODULE_PARM(libcfs_printk, "i", uint, 0644,                "Lustre kernel debug console mask");EXPORT_SYMBOL(libcfs_printk);unsigned int libcfs_console_ratelimit = 1;CFS_MODULE_PARM(libcfs_console_ratelimit, "i", uint, 0644,                "Lustre kernel debug console ratelimit (0 to disable)");EXPORT_SYMBOL(libcfs_console_ratelimit);cfs_duration_t libcfs_console_max_delay;CFS_MODULE_PARM(libcfs_console_max_delay, "l", ulong, 0644,                "Lustre kernel debug console max delay (jiffies)");EXPORT_SYMBOL(libcfs_console_max_delay);cfs_duration_t libcfs_console_min_delay;CFS_MODULE_PARM(libcfs_console_min_delay, "l", ulong, 0644,                "Lustre kernel debug console min delay (jiffies)");EXPORT_SYMBOL(libcfs_console_min_delay);unsigned int libcfs_console_backoff = CDEBUG_DEFAULT_BACKOFF;CFS_MODULE_PARM(libcfs_console_backoff, "i", uint, 0644,                "Lustre kernel debug console backoff factor");EXPORT_SYMBOL(libcfs_console_backoff);unsigned int libcfs_debug_binary = 1;EXPORT_SYMBOL(libcfs_debug_binary);unsigned int libcfs_stack;EXPORT_SYMBOL(libcfs_stack);unsigned int portal_enter_debugger;EXPORT_SYMBOL(portal_enter_debugger);unsigned int libcfs_catastrophe;EXPORT_SYMBOL(libcfs_catastrophe);unsigned int libcfs_panic_on_lbug = 0;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);EXPORT_SYMBOL(libcfs_kmemory);static cfs_waitq_t debug_ctlwq;#ifdef __arch_um__char debug_file_path[1024] = "/r/tmp/lustre-log";#elsechar debug_file_path[1024] = "/tmp/lustre-log";#endifint libcfs_panic_in_progress;/* libcfs_debug_token2mask() expects the returned * string in lower-case */const char *libcfs_debug_subsys2str(int subsys){        switch (subsys) {        default:                return NULL;        case S_UNDEFINED:                return "undefined";        case S_MDC:                return "mdc";        case S_MDS:                return "mds";        case S_OSC:                return "osc";        case S_OST:                return "ost";        case S_CLASS:                return "class";        case S_LOG:                return "log";        case S_LLITE:                return "llite";        case S_RPC:                return "rpc";        case S_LNET:                return "lnet";        case S_LND:                return "lnd";        case S_PINGER:                return "pinger";        case S_FILTER:                return "filter";        case S_ECHO:                return "echo";        case S_LDLM:                return "ldlm";        case S_LOV:                return "lov";        case S_LMV:                return "lmv";        case S_SEC:                return "sec";        case S_GSS:                return "gss";        case S_MGC:                return "mgc";        case S_MGS:                return "mgs";        case S_FID:                return "fid";        case S_FLD:                return "fld";        }}/* libcfs_debug_token2mask() expects the returned * string in lower-case */const char *libcfs_debug_dbg2str(int debug){        switch (debug) {        default:                return NULL;        case D_TRACE:                return "trace";        case D_INODE:                return "inode";        case D_SUPER:                return "super";        case D_EXT2:                return "ext2";        case D_MALLOC:                return "malloc";        case D_CACHE:                return "cache";        case D_INFO:                return "info";        case D_IOCTL:                return "ioctl";        case D_NETERROR:                return "neterror";        case D_NET:                return "net";        case D_WARNING:                return "warning";        case D_BUFFS:                return "buffs";        case D_OTHER:                return "other";        case D_DENTRY:                return "dentry";        case D_NETTRACE:                return "nettrace";        case D_PAGE:                return "page";        case D_DLMTRACE:                return "dlmtrace";        case D_ERROR:                return "error";        case D_EMERG:                return "emerg";        case D_HA:                return "ha";        case D_RPCTRACE:                return "rpctrace";        case D_VFSTRACE:                return "vfstrace";        case D_READA:                return "reada";        case D_MMAP:                return "mmap";        case D_CONFIG:                return "config";        case D_CONSOLE:                return "console";        case D_QUOTA:                return "quota";        case D_SEC:                return "sec";        }}intlibcfs_debug_mask2str(char *str, int size, int mask, int is_subsys){        const char *(*fn)(int bit) = is_subsys ? libcfs_debug_subsys2str :                                                 libcfs_debug_dbg2str;        int           len = 0;        const char   *token;        int           bit;        int           i;        if (mask == 0) {                        /* "0" */                if (size > 0)                        str[0] = '0';                len = 1;        } else {                                /* space-separated tokens */                for (i = 0; i < 32; i++) {                        bit = 1 << i;                        if ((mask & bit) == 0)                                continue;                        token = fn(bit);                        if (token == NULL)              /* unused bit */                                continue;                        if (len > 0) {                  /* separator? */                                if (len < size)                                        str[len] = ' ';                                len++;                        }                        while (*token != 0) {                                if (len < size)                                        str[len] = *token;                                token++;                                len++;                        }                }        }        /* terminate 'str' */        if (len < size)                str[len] = 0;        else                str[size - 1] = 0;        return len;}intlibcfs_debug_token2mask(int *mask, const char *str, int len, 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 */}intlibcfs_debug_str2mask(int *mask, const char *str, int is_subsys){        int         m = 0;        char        op = 0;        int         matched;        int         n;        int         t;        /* Allow a number for backwards compatibility */        for (n = strlen(str); n > 0; n--)                if (!isspace(str[n-1]))                        break;        matched = n;        if ((t = sscanf(str, "%i%n", &m, &matched)) >= 1 &&            matched == n) {                *mask = m;                return 0;        }        /* <str> must be a list of debug tokens or numbers separated by         * whitespace and optionally an operator ('+' or '-').  If an operator         * appears first in <str>, '*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;}void libcfs_debug_dumplog_internal(void *arg){        CFS_DECL_JOURNAL_DATA;        CFS_PUSH_JOURNAL;        snprintf(debug_file_name, sizeof(debug_file_path) - 1, "%s.%ld.%ld",                 debug_file_path, cfs_time_current_sec(), (long)arg);        printk(KERN_ALERT "LustreError: dumping log to %s\n", debug_file_name);        tracefile_dump_all_pages(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);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?