debug.c

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

C
833
字号
        return 0;}void libcfs_debug_dumplog(void){        int            rc;        cfs_waitlink_t wait;        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_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);        else                cfs_waitq_wait(&wait, CFS_TASK_INTERRUPTIBLE);        /* be sure to teardown if kernel_thread() failed */        cfs_waitq_del(&debug_ctlwq, &wait);        set_current_state(TASK_RUNNING);}int libcfs_debug_init(unsigned long bufsize){        int    rc = 0;        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_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()) {                max = TCD_MAX_PAGES;        } else {                max = (max / num_possible_cpus());                max = (max << (20 - CFS_PAGE_SHIFT));        }        rc = tracefile_init(max);        if (rc == 0)                libcfs_register_panic_notifier();        return rc;}int libcfs_debug_cleanup(void){        libcfs_unregister_panic_notifier();        tracefile_exit();        return 0;}int libcfs_debug_clear_buffer(void){        trace_flush_pages();        return 0;}/* Debug markers, although printed by S_LNET * should not be be marked as such. */#undef DEBUG_SUBSYSTEM#define DEBUG_SUBSYSTEM S_UNDEFINEDint libcfs_debug_mark_buffer(char *text){        CDEBUG(D_TRACE,"***************************************************\n");        CDEBUG(D_WARNING, "DEBUG MARKER: %s\n", text);        CDEBUG(D_TRACE,"***************************************************\n");        return 0;}#undef DEBUG_SUBSYSTEM#define DEBUG_SUBSYSTEM S_LNETvoid libcfs_debug_set_level(unsigned int debug_level){        printk(KERN_WARNING "Lustre: Setting portals debug level to %08x\n",               debug_level);        libcfs_debug = debug_level;}EXPORT_SYMBOL(libcfs_debug_dumplog);EXPORT_SYMBOL(libcfs_debug_set_level);#else /* !__KERNEL__ */#include <libcfs/libcfs.h>#ifdef HAVE_CATAMOUNT_DATA_H#include <catamount/data.h>#include <catamount/lputs.h>static char source_nid[16];/* 0 indicates no messages to console, 1 is errors, > 1 is all debug messages */static int toconsole = 1;unsigned int libcfs_console_ratelimit = 1;cfs_duration_t libcfs_console_max_delay;cfs_duration_t libcfs_console_min_delay;unsigned int libcfs_console_backoff = CDEBUG_DEFAULT_BACKOFF;#else /* !HAVE_CATAMOUNT_DATA_H */#ifdef HAVE_NETDB_H#include <sys/utsname.h>#endif /* HAVE_NETDB_H */struct utsname *tmp_utsname;static char source_nid[sizeof(tmp_utsname->nodename)];#endif /* HAVE_CATAMOUNT_DATA_H */static int source_pid;int smp_processor_id = 1;char debug_file_path[1024];FILE *debug_file_fd;int portals_do_debug_dumplog(void *arg){        printf("Look in %s\n", debug_file_name);        return 0;}void portals_debug_print(void){        return;}void libcfs_debug_dumplog(void){        printf("Look in %s\n", debug_file_name);        return;}int libcfs_debug_init(unsigned long bufsize){        char *debug_mask = NULL;        char *debug_subsys = NULL;        char *debug_filename;#ifdef HAVE_CATAMOUNT_DATA_H        char *debug_console = NULL;        char *debug_ratelimit = NULL;        char *debug_max_delay = NULL;        char *debug_min_delay = NULL;        char *debug_backoff = NULL;        libcfs_console_max_delay = CDEBUG_DEFAULT_MAX_DELAY;        libcfs_console_min_delay = CDEBUG_DEFAULT_MIN_DELAY;        snprintf(source_nid, sizeof(source_nid) - 1, "%u", _my_pnid);        source_pid = _my_pid;        debug_console = getenv("LIBLUSTRE_DEBUG_CONSOLE");        if (debug_console != NULL) {                toconsole = strtoul(debug_console, NULL, 0);                CDEBUG(D_INFO, "set liblustre toconsole to %u\n", toconsole);        }        debug_ratelimit = getenv("LIBLUSTRE_DEBUG_CONSOLE_RATELIMIT");        if (debug_ratelimit != NULL) {                libcfs_console_ratelimit = strtoul(debug_ratelimit, NULL, 0);                CDEBUG(D_INFO, "set liblustre console ratelimit to %u\n",                                libcfs_console_ratelimit);        }        debug_max_delay = getenv("LIBLUSTRE_DEBUG_CONSOLE_MAX_DELAY");        if (debug_max_delay != NULL)                libcfs_console_max_delay =                            cfs_time_seconds(strtoul(debug_max_delay, NULL, 0));        debug_min_delay = getenv("LIBLUSTRE_DEBUG_CONSOLE_MIN_DELAY");        if (debug_min_delay != NULL)                libcfs_console_min_delay =                            cfs_time_seconds(strtoul(debug_min_delay, NULL, 0));        if (debug_min_delay || debug_max_delay) {                if (!libcfs_console_max_delay || !libcfs_console_min_delay ||                    libcfs_console_max_delay < libcfs_console_min_delay) {                        libcfs_console_max_delay = CDEBUG_DEFAULT_MAX_DELAY;                        libcfs_console_min_delay = CDEBUG_DEFAULT_MIN_DELAY;                        CDEBUG(D_INFO, "LIBLUSTRE_DEBUG_CONSOLE_MAX_DELAY "                                       "should be greater than "                                       "LIBLUSTRE_DEBUG_CONSOLE_MIN_DELAY "                                       "and both parameters should be non-null"                                       ": restore default values\n");                } else {                        CDEBUG(D_INFO, "set liblustre console max delay to %lus"                                       " and min delay to %lus\n",                               (cfs_duration_t)                                     cfs_duration_sec(libcfs_console_max_delay),                               (cfs_duration_t)                                    cfs_duration_sec(libcfs_console_min_delay));                }        }        debug_backoff = getenv("LIBLUSTRE_DEBUG_CONSOLE_BACKOFF");        if (debug_backoff != NULL) {                libcfs_console_backoff = strtoul(debug_backoff, NULL, 0);                if (libcfs_console_backoff <= 0) {                        libcfs_console_backoff = CDEBUG_DEFAULT_BACKOFF;                        CDEBUG(D_INFO, "LIBLUSTRE_DEBUG_CONSOLE_BACKOFF <= 0: "                                       "restore default value\n");                } else {                        CDEBUG(D_INFO, "set liblustre console backoff to %u\n",                               libcfs_console_backoff);                }        }#else        struct utsname myname;        if (uname(&myname) == 0)                strcpy(source_nid, myname.nodename);        source_pid = getpid();#endif        /* debug masks */        debug_mask = getenv("LIBLUSTRE_DEBUG_MASK");        if (debug_mask)                libcfs_debug = (unsigned int) strtol(debug_mask, NULL, 0);        debug_subsys = getenv("LIBLUSTRE_DEBUG_SUBSYS");        if (debug_subsys)                libcfs_subsystem_debug =                                (unsigned int) strtol(debug_subsys, NULL, 0);        debug_filename = getenv("LIBLUSTRE_DEBUG_BASE");        if (debug_filename)                strncpy(debug_file_path,debug_filename,sizeof(debug_file_path));        debug_filename = getenv("LIBLUSTRE_DEBUG_FILE");        if (debug_filename)                strncpy(debug_file_name,debug_filename,sizeof(debug_file_path));        if (debug_file_name[0] == '\0' && debug_file_path[0] != '\0')                snprintf(debug_file_name, sizeof(debug_file_name) - 1,                         "%s-%s-%lu.log", debug_file_path, source_nid, time(0));        if (strcmp(debug_file_name, "stdout") == 0 ||            strcmp(debug_file_name, "-") == 0) {                debug_file_fd = stdout;        } else if (strcmp(debug_file_name, "stderr") == 0) {                debug_file_fd = stderr;        } else if (debug_file_name[0] != '\0') {                debug_file_fd = fopen(debug_file_name, "w");                if (debug_file_fd == NULL)                        fprintf(stderr, "%s: unable to open '%s': %s\n",                                source_nid, debug_file_name, strerror(errno));        }        if (debug_file_fd == NULL)                debug_file_fd = stdout;        return 0;}int libcfs_debug_cleanup(void){        if (debug_file_fd != stdout && debug_file_fd != stderr)                fclose(debug_file_fd);        return 0;}int libcfs_debug_clear_buffer(void){        return 0;}int libcfs_debug_mark_buffer(char *text){        fprintf(debug_file_fd, "*******************************************************************************\n");        fprintf(debug_file_fd, "DEBUG MARKER: %s\n", text);        fprintf(debug_file_fd, "*******************************************************************************\n");        return 0;}#ifdef HAVE_CATAMOUNT_DATA_H#define CATAMOUNT_MAXLINE (256-4)void catamount_printline(char *buf, size_t size){    char *pos = buf;    int prsize = size;    while (prsize > 0){        lputs(pos);        pos += CATAMOUNT_MAXLINE;        prsize -= CATAMOUNT_MAXLINE;    }}#endifintlibcfs_debug_vmsg2(cfs_debug_limit_state_t *cdls,                   int subsys, int mask,                   const char *file, const char *fn, const int line,                   const char *format1, va_list args,                   const char *format2, ...){        struct timeval tv;        int            nob;        int            remain;        va_list        ap;        char           buf[PAGE_SIZE]; /* size 4096 used for compatimble with linux,                                        * where message can`t be exceed PAGE_SIZE */        int            console = 0;        char *prefix = "Lustre";#ifdef HAVE_CATAMOUNT_DATA_H        /* toconsole == 0 - all messages to debug_file_fd         * toconsole == 1 - warnings to console, all to debug_file_fd         * toconsole >  1 - all debug to console */        if (((mask & libcfs_printk) && toconsole == 1) || toconsole > 1)                console = 1;#endif        if ((!console) && (!debug_file_fd)) {                return 0;        }        if (mask & (D_EMERG | D_ERROR))               prefix = "LustreError";        nob = snprintf(buf, sizeof(buf), "%s: %u-%s:(%s:%d:%s()): ", prefix,                       source_pid, source_nid, file, line, fn);        remain = sizeof(buf) - nob;        if (format1) {                nob += vsnprintf(&buf[nob], remain, format1, args);        }        remain = sizeof(buf) - nob;        if ((format2) && (remain > 0)) {                va_start(ap, format2);                nob += vsnprintf(&buf[nob], remain, format2, ap);                va_end(ap);        }#ifdef HAVE_CATAMOUNT_DATA_H        if (console) {                /* check rate limit for console */                if (cdls != NULL) {                        if (libcfs_console_ratelimit &&                                cdls->cdls_next != 0 &&     /* not first time ever */                                !cfs_time_after(cfs_time_current(), cdls->cdls_next)) {                                /* skipping a console message */                                cdls->cdls_count++;                                goto out_file;                        }                        if (cfs_time_after(cfs_time_current(), cdls->cdls_next +                                           libcfs_console_max_delay +                                           cfs_time_seconds(10))) {                                /* last timeout was a long time ago */                                cdls->cdls_delay /= libcfs_console_backoff * 4;                        } else {                                cdls->cdls_delay *= libcfs_console_backoff;                                if (cdls->cdls_delay <                                                libcfs_console_min_delay)                                        cdls->cdls_delay =                                                libcfs_console_min_delay;                                else if (cdls->cdls_delay >                                                libcfs_console_max_delay)                                        cdls->cdls_delay =                                                libcfs_console_max_delay;                        }                        /* ensure cdls_next is never zero after it's been seen */                        cdls->cdls_next = (cfs_time_current() + cdls->cdls_delay) | 1;                }                if (cdls != NULL && cdls->cdls_count != 0) {                        char buf2[100];                        nob = snprintf(buf2, sizeof(buf2),                                       "Skipped %d previous similar message%s\n",                                       cdls->cdls_count, (cdls->cdls_count > 1) ? "s" : "");                        catamount_printline(buf2, nob);                        cdls->cdls_count = 0;                        goto out_file;                }                catamount_printline(buf, nob);       }out_file:        /* return on toconsole > 1, as we don't want the user getting        * spammed by the debug data */        if (toconsole > 1)                return 0;#endif        if (debug_file_fd == NULL)                return 0;        gettimeofday(&tv, NULL);        fprintf(debug_file_fd, "%lu.%06lu:%u:%s:(%s:%d:%s()): %s",                tv.tv_sec, tv.tv_usec, source_pid, source_nid,                file, line, fn, buf);        return 0;}voidlibcfs_assertion_failed(const char *expr, const char *file, const char *func,                        const int line){        libcfs_debug_msg(NULL, 0, D_EMERG, file, func, line,                         "ASSERTION(%s) failed\n", expr);        abort();}#endif /* __KERNEL__ */

⌨️ 快捷键说明

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