Release 4.7 drivers/staging/lustre/lnet/libcfs/debug.c
  
  
/*
 * GPL HEADER START
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 only,
 * as published by the Free Software Foundation.
 *
 * This program 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 version 2 for more details (a copy is included
 * 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
 * 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
 * have any questions.
 *
 * GPL HEADER END
 */
/*
 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
 * Use is subject to license terms.
 *
 * Copyright (c) 2011, 2012, Intel Corporation.
 */
/*
 * This file is part of Lustre, http://www.lustre.org/
 * Lustre is a trademark of Sun Microsystems, Inc.
 *
 * libcfs/libcfs/debug.c
 *
 * Author: Phil Schwan <phil@clusterfs.com>
 *
 */
# define DEBUG_SUBSYSTEM S_LNET
#include "../../include/linux/libcfs/libcfs.h"
#include "tracefile.h"
static char debug_file_name[1024];
unsigned int libcfs_subsystem_debug = ~0;
EXPORT_SYMBOL(libcfs_subsystem_debug);
module_param(libcfs_subsystem_debug, int, 0644);
MODULE_PARM_DESC(libcfs_subsystem_debug, "Lustre kernel debug subsystem mask");
unsigned int libcfs_debug = (D_CANTMASK |
			     D_NETERROR | D_HA | D_CONFIG | D_IOCTL);
EXPORT_SYMBOL(libcfs_debug);
module_param(libcfs_debug, int, 0644);
MODULE_PARM_DESC(libcfs_debug, "Lustre kernel debug mask");
static int libcfs_param_debug_mb_set(const char *val,
				     const struct kernel_param *kp)
{
	int rc;
	unsigned num;
	rc = kstrtouint(val, 0, &num);
	if (rc < 0)
		return rc;
	if (!*((unsigned int *)kp->arg)) {
		*((unsigned int *)kp->arg) = num;
		return 0;
	}
	rc = cfs_trace_set_debug_mb(num);
	if (!rc)
		*((unsigned int *)kp->arg) = cfs_trace_get_debug_mb();
	return rc;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| oleg drokin | oleg drokin | 108 | 100.00% | 1 | 100.00% | 
 | Total | 108 | 100.00% | 1 | 100.00% | 
/* While debug_mb setting look like unsigned int, in fact
 * it needs quite a bunch of extra processing, so we define special
 * debugmb parameter type with corresponding methods to handle this case
 */
static struct kernel_param_ops param_ops_debugmb = {
	.set = libcfs_param_debug_mb_set,
	.get = param_get_uint,
};
#define param_check_debugmb(name, p) \
		__param_check(name, p, unsigned int)
static unsigned int libcfs_debug_mb;
module_param(libcfs_debug_mb, debugmb, 0644);
MODULE_PARM_DESC(libcfs_debug_mb, "Total debug buffer size.");
unsigned int libcfs_printk = D_CANTMASK;
module_param(libcfs_printk, uint, 0644);
MODULE_PARM_DESC(libcfs_printk, "Lustre kernel debug console mask");
unsigned int libcfs_console_ratelimit = 1;
module_param(libcfs_console_ratelimit, uint, 0644);
MODULE_PARM_DESC(libcfs_console_ratelimit, "Lustre kernel debug console ratelimit (0 to disable)");
static int param_set_delay_minmax(const char *val,
				  const struct kernel_param *kp,
				  long min, long max)
{
	long d;
	int sec;
	int rc;
	rc = kstrtoint(val, 0, &sec);
	if (rc)
		return -EINVAL;
	d = cfs_time_seconds(sec) / 100;
	if (d < min || d > max)
		return -EINVAL;
	*((unsigned int *)kp->arg) = d;
	return 0;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| dmitry eremin-solenikov | dmitry eremin-solenikov | 92 | 100.00% | 1 | 100.00% | 
 | Total | 92 | 100.00% | 1 | 100.00% | 
static int param_get_delay(char *buffer, const struct kernel_param *kp)
{
	unsigned int d = *(unsigned int *)kp->arg;
	return sprintf(buffer, "%u", (unsigned int)cfs_duration_sec(d * 100));
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| dmitry eremin-solenikov | dmitry eremin-solenikov | 49 | 100.00% | 1 | 100.00% | 
 | Total | 49 | 100.00% | 1 | 100.00% | 
unsigned int libcfs_console_max_delay;
unsigned int libcfs_console_min_delay;
static int param_set_console_max_delay(const char *val,
				       const struct kernel_param *kp)
{
	return param_set_delay_minmax(val, kp,
				      libcfs_console_min_delay, INT_MAX);
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| dmitry eremin-solenikov | dmitry eremin-solenikov | 29 | 100.00% | 1 | 100.00% | 
 | Total | 29 | 100.00% | 1 | 100.00% | 
static struct kernel_param_ops param_ops_console_max_delay = {
	.set = param_set_console_max_delay,
	.get = param_get_delay,
};
#define param_check_console_max_delay(name, p) \
		__param_check(name, p, unsigned int)
module_param(libcfs_console_max_delay, console_max_delay, 0644);
MODULE_PARM_DESC(libcfs_console_max_delay, "Lustre kernel debug console max delay (jiffies)");
static int param_set_console_min_delay(const char *val,
				       const struct kernel_param *kp)
{
	return param_set_delay_minmax(val, kp,
				      1, libcfs_console_max_delay);
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| dmitry eremin-solenikov | dmitry eremin-solenikov | 26 | 89.66% | 1 | 50.00% | 
| peng tao | peng tao | 3 | 10.34% | 1 | 50.00% | 
 | Total | 29 | 100.00% | 2 | 100.00% | 
static struct kernel_param_ops param_ops_console_min_delay = {
	.set = param_set_console_min_delay,
	.get = param_get_delay,
};
#define param_check_console_min_delay(name, p) \
		__param_check(name, p, unsigned int)
module_param(libcfs_console_min_delay, console_min_delay, 0644);
MODULE_PARM_DESC(libcfs_console_min_delay, "Lustre kernel debug console min delay (jiffies)");
static int param_set_uint_minmax(const char *val,
				 const struct kernel_param *kp,
				 unsigned int min, unsigned int max)
{
	unsigned int num;
	int ret;
	if (!val)
		return -EINVAL;
	ret = kstrtouint(val, 0, &num);
	if (ret < 0 || num < min || num > max)
		return -EINVAL;
	*((unsigned int *)kp->arg) = num;
	return 0;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| oleg drokin | oleg drokin | 88 | 100.00% | 2 | 100.00% | 
 | Total | 88 | 100.00% | 2 | 100.00% | 
static int param_set_uintpos(const char *val, const struct kernel_param *kp)
{
	return param_set_uint_minmax(val, kp, 1, -1);
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| oleg drokin | oleg drokin | 30 | 100.00% | 1 | 100.00% | 
 | Total | 30 | 100.00% | 1 | 100.00% | 
static struct kernel_param_ops param_ops_uintpos = {
	.set = param_set_uintpos,
	.get = param_get_uint,
};
#define param_check_uintpos(name, p) \
		__param_check(name, p, unsigned int)
unsigned int libcfs_console_backoff = CDEBUG_DEFAULT_BACKOFF;
module_param(libcfs_console_backoff, uintpos, 0644);
MODULE_PARM_DESC(libcfs_console_backoff, "Lustre kernel debug console backoff factor");
unsigned int libcfs_debug_binary = 1;
unsigned int libcfs_stack = 3 * THREAD_SIZE / 4;
EXPORT_SYMBOL(libcfs_stack);
unsigned int libcfs_catastrophe;
EXPORT_SYMBOL(libcfs_catastrophe);
unsigned int libcfs_panic_on_lbug = 1;
module_param(libcfs_panic_on_lbug, uint, 0644);
MODULE_PARM_DESC(libcfs_panic_on_lbug, "Lustre kernel panic on LBUG");
static wait_queue_head_t debug_ctlwq;
char libcfs_debug_file_path_arr[PATH_MAX] = LIBCFS_DEBUG_FILE_PATH_DEFAULT;
/* We need to pass a pointer here, but elsewhere this must be a const */
static char *libcfs_debug_file_path;
module_param(libcfs_debug_file_path, charp, 0644);
MODULE_PARM_DESC(libcfs_debug_file_path,
		 "Path for dumping debug logs, set 'NONE' to prevent log dumping");
int libcfs_panic_in_progress;
/* libcfs_debug_token2mask() expects the returned string in lower-case */
static const char *
libcfs_debug_subsys2str(int subsys)
{
	static const char *libcfs_debug_subsystems[] = LIBCFS_DEBUG_SUBSYS_NAMES;
	if (subsys >= ARRAY_SIZE(libcfs_debug_subsystems))
		return NULL;
	return libcfs_debug_subsystems[subsys];
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| jinshan xiong | jinshan xiong | 19 | 50.00% | 1 | 33.33% | 
| peng tao | peng tao | 18 | 47.37% | 1 | 33.33% | 
| luca ceresoli | luca ceresoli | 1 | 2.63% | 1 | 33.33% | 
 | Total | 38 | 100.00% | 3 | 100.00% | 
/* libcfs_debug_token2mask() expects the returned string in lower-case */
static const char *
libcfs_debug_dbg2str(int debug)
{
	static const char *libcfs_debug_masks[] = LIBCFS_DEBUG_MASKS_NAMES;
	if (debug >= ARRAY_SIZE(libcfs_debug_masks))
		return NULL;
	return libcfs_debug_masks[debug];
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| jinshan xiong | jinshan xiong | 19 | 50.00% | 1 | 33.33% | 
| peng tao | peng tao | 18 | 47.37% | 1 | 33.33% | 
| luca ceresoli | luca ceresoli | 1 | 2.63% | 1 | 33.33% | 
 | Total | 38 | 100.00% | 3 | 100.00% | 
int
libcfs_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	   i;
	if (mask == 0) {			/* "0" */
		if (size > 0)
			str[0] = '0';
		len = 1;
	} else {				/* space-separated tokens */
		for (i = 0; i < 32; i++) {
			if ((mask & (1 << i)) == 0)
				continue;
			token = fn(i);
			if (!token)	      /* 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;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| peng tao | peng tao | 203 | 99.51% | 1 | 50.00% | 
| oleg drokin | oleg drokin | 1 | 0.49% | 1 | 50.00% | 
 | Total | 204 | 100.00% | 2 | 100.00% | 
int
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	 m = 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;
	t = sscanf(str, "%i%n", &m, &matched);
	if (t >= 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;
	}
	return cfs_str2mask(str, fn, mask, is_subsys ? 0 : D_CANTMASK,
			    0xffffffff);
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| peng tao | peng tao | 149 | 96.75% | 1 | 33.33% | 
| hema prathaban | hema prathaban | 4 | 2.60% | 1 | 33.33% | 
| joe perches | joe perches | 1 | 0.65% | 1 | 33.33% | 
 | Total | 154 | 100.00% | 3 | 100.00% | 
/**
 * Dump Lustre log to ::debug_file_path by calling tracefile_dump_all_pages()
 */
void libcfs_debug_dumplog_internal(void *arg)
{
	void *journal_info;
	journal_info = current->journal_info;
	current->journal_info = NULL;
	if (strncmp(libcfs_debug_file_path_arr, "NONE", 4) != 0) {
		snprintf(debug_file_name, sizeof(debug_file_name) - 1,
			 "%s.%lld.%ld", libcfs_debug_file_path_arr,
			 (s64)ktime_get_real_seconds(), (long_ptr_t)arg);
		pr_alert("LustreError: dumping log to %s\n", debug_file_name);
		cfs_tracefile_dump_all_pages(debug_file_name);
		libcfs_run_debug_log_upcall(debug_file_name);
	}
	current->journal_info = journal_info;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| peng tao | peng tao | 65 | 72.22% | 1 | 25.00% | 
| greg kroah-hartman | greg kroah-hartman | 19 | 21.11% | 1 | 25.00% | 
| arnd bergmann | arnd bergmann | 5 | 5.56% | 1 | 25.00% | 
| hema prathaban | hema prathaban | 1 | 1.11% | 1 | 25.00% | 
 | Total | 90 | 100.00% | 4 | 100.00% | 
static int libcfs_debug_dumplog_thread(void *arg)
{
	libcfs_debug_dumplog_internal(arg);
	wake_up(&debug_ctlwq);
	return 0;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| peng tao | peng tao | 23 | 95.83% | 1 | 50.00% | 
| luca ceresoli | luca ceresoli | 1 | 4.17% | 1 | 50.00% | 
 | Total | 24 | 100.00% | 2 | 100.00% | 
void libcfs_debug_dumplog(void)
{
	wait_queue_t wait;
	struct task_struct *dumper;
	/* 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()
         */
	init_waitqueue_entry(&wait, current);
	set_current_state(TASK_INTERRUPTIBLE);
	add_wait_queue(&debug_ctlwq, &wait);
	dumper = kthread_run(libcfs_debug_dumplog_thread,
			     (void *)(long)current_pid(),
			     "libcfs_debug_dumper");
	if (IS_ERR(dumper))
		pr_err("LustreError: cannot start log dump thread: %ld\n",
		       PTR_ERR(dumper));
	else
		schedule();
	/* be sure to teardown if cfs_create_thread() failed */
	remove_wait_queue(&debug_ctlwq, &wait);
	set_current_state(TASK_RUNNING);
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| peng tao | peng tao | 88 | 94.62% | 3 | 42.86% | 
| greg kroah-hartman | greg kroah-hartman | 2 | 2.15% | 1 | 14.29% | 
| hema prathaban | hema prathaban | 1 | 1.08% | 1 | 14.29% | 
| oleg drokin | oleg drokin | 1 | 1.08% | 1 | 14.29% | 
| joe perches | joe perches | 1 | 1.08% | 1 | 14.29% | 
 | Total | 93 | 100.00% | 7 | 100.00% | 
EXPORT_SYMBOL(libcfs_debug_dumplog);
int libcfs_debug_init(unsigned long bufsize)
{
	int    rc = 0;
	unsigned int max = libcfs_debug_mb;
	init_waitqueue_head(&debug_ctlwq);
	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) {
		strlcpy(libcfs_debug_file_path_arr,
			libcfs_debug_file_path,
			sizeof(libcfs_debug_file_path_arr));
	}
	/* 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 > cfs_trace_max_debug_mb() || max < num_possible_cpus()) {
		max = TCD_MAX_PAGES;
	} else {
		max = max / num_possible_cpus();
		max <<= (20 - PAGE_SHIFT);
	}
	rc = cfs_tracefile_init(max);
	if (rc == 0) {
		libcfs_register_panic_notifier();
		libcfs_debug_mb = cfs_trace_get_debug_mb();
	}
	return rc;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| peng tao | peng tao | 117 | 87.97% | 1 | 14.29% | 
| oleg drokin | oleg drokin | 8 | 6.02% | 2 | 28.57% | 
| dmitry eremin-solenikov | dmitry eremin-solenikov | 5 | 3.76% | 1 | 14.29% | 
| kirill a. shutemov | kirill a. shutemov | 1 | 0.75% | 1 | 14.29% | 
| aya mahfouz | aya mahfouz | 1 | 0.75% | 1 | 14.29% | 
| rickard strandqvist | rickard strandqvist | 1 | 0.75% | 1 | 14.29% | 
 | Total | 133 | 100.00% | 7 | 100.00% | 
int libcfs_debug_cleanup(void)
{
	libcfs_unregister_panic_notifier();
	cfs_tracefile_exit();
	return 0;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| peng tao | peng tao | 16 | 100.00% | 1 | 100.00% | 
 | Total | 16 | 100.00% | 1 | 100.00% | 
int libcfs_debug_clear_buffer(void)
{
	cfs_trace_flush_pages();
	return 0;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| peng tao | peng tao | 13 | 100.00% | 1 | 100.00% | 
 | Total | 13 | 100.00% | 1 | 100.00% | 
/* Debug markers, although printed by S_LNET should not be be marked as such. */
#undef DEBUG_SUBSYSTEM
#define DEBUG_SUBSYSTEM S_UNDEFINED
int libcfs_debug_mark_buffer(const char *text)
{
	CDEBUG(D_TRACE,
	       "***************************************************\n");
	LCONSOLE(D_WARNING, "DEBUG MARKER: %s\n", text);
	CDEBUG(D_TRACE,
	       "***************************************************\n");
	return 0;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| peng tao | peng tao | 36 | 100.00% | 1 | 100.00% | 
 | Total | 36 | 100.00% | 1 | 100.00% | 
#undef DEBUG_SUBSYSTEM
#define DEBUG_SUBSYSTEM S_LNET
Overall Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| peng tao | peng tao | 1050 | 61.87% | 4 | 16.00% | 
| oleg drokin | oleg drokin | 306 | 18.03% | 6 | 24.00% | 
| dmitry eremin-solenikov | dmitry eremin-solenikov | 260 | 15.32% | 2 | 8.00% | 
| jinshan xiong | jinshan xiong | 38 | 2.24% | 1 | 4.00% | 
| greg kroah-hartman | greg kroah-hartman | 22 | 1.30% | 3 | 12.00% | 
| hema prathaban | hema prathaban | 6 | 0.35% | 2 | 8.00% | 
| arnd bergmann | arnd bergmann | 5 | 0.29% | 1 | 4.00% | 
| luca ceresoli | luca ceresoli | 4 | 0.24% | 1 | 4.00% | 
| joe perches | joe perches | 2 | 0.12% | 1 | 4.00% | 
| kirill a. shutemov | kirill a. shutemov | 1 | 0.06% | 1 | 4.00% | 
| aya mahfouz | aya mahfouz | 1 | 0.06% | 1 | 4.00% | 
| rickard strandqvist | rickard strandqvist | 1 | 0.06% | 1 | 4.00% | 
| chen weixiang | chen weixiang | 1 | 0.06% | 1 | 4.00% | 
 | Total | 1697 | 100.00% | 25 | 100.00% | 
  
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.