-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
* GPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* 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.
+ *
+ * Copyright (c) 2011, Whamcloud, Inc.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#include <asm/div64.h>
#include "tracefile.h"
+#ifdef CONFIG_SYSCTL
static cfs_sysctl_table_header_t *lnet_table_header = NULL;
+#endif
extern char lnet_upcall[1024];
/**
* The path of debug log dump upcall script.
PSDEV_CONSOLE_BACKOFF, /* delay increase factor */
PSDEV_DEBUG_PATH, /* crashdump log location */
PSDEV_DEBUG_DUMP_PATH, /* crashdump tracelog location */
+ PSDEV_CPT_TABLE, /* information about cpu partitions */
PSDEV_LNET_UPCALL, /* User mode upcall script */
PSDEV_LNET_MEMUSED, /* bytes currently PORTAL_ALLOCated */
PSDEV_LNET_CATASTROPHE, /* if we have LBUGged or panic'd */
PSDEV_LNET_DAEMON_FILE, /* spool kernel debug buffer to file */
PSDEV_LNET_DEBUG_MB, /* size of debug buffer */
PSDEV_LNET_DEBUG_LOG_UPCALL, /* debug log upcall script */
+ PSDEV_LNET_WATCHDOG_RATELIMIT, /* ratelimit watchdog messages */
+ PSDEV_LNET_FORCE_LBUG, /* hook to force an LBUG */
+ PSDEV_LNET_FAIL_LOC, /* control test failures instrumentation */
+ PSDEV_LNET_FAIL_VAL, /* userdata for fail loc */
};
#else
#define CTL_LNET CTL_UNNUMBERED
#define PSDEV_CONSOLE_BACKOFF CTL_UNNUMBERED
#define PSDEV_DEBUG_PATH CTL_UNNUMBERED
#define PSDEV_DEBUG_DUMP_PATH CTL_UNNUMBERED
+#define PSDEV_CPT_TABLE CTL_UNNUMBERED
#define PSDEV_LNET_UPCALL CTL_UNNUMBERED
#define PSDEV_LNET_MEMUSED CTL_UNNUMBERED
#define PSDEV_LNET_CATASTROPHE CTL_UNNUMBERED
#define PSDEV_LNET_DAEMON_FILE CTL_UNNUMBERED
#define PSDEV_LNET_DEBUG_MB CTL_UNNUMBERED
#define PSDEV_LNET_DEBUG_LOG_UPCALL CTL_UNNUMBERED
+#define PSDEV_LNET_WATCHDOG_RATELIMIT CTL_UNNUMBERED
+#define PSDEV_LNET_FORCE_LBUG CTL_UNNUMBERED
+#define PSDEV_LNET_FAIL_LOC CTL_UNNUMBERED
+#define PSDEV_LNET_FAIL_VAL CTL_UNNUMBERED
#endif
-
-static int
+int
proc_call_handler(void *data, int write,
loff_t *ppos, void *buffer, size_t *lenp,
int (*handler)(void *data, int write,
int is_subsys = (mask == &libcfs_subsystem_debug) ? 1 : 0;
int is_printk = (mask == &libcfs_printk) ? 1 : 0;
- rc = trace_allocate_string_buffer(&tmpstr, tmpstrlen);
+ rc = cfs_trace_allocate_string_buffer(&tmpstr, tmpstrlen);
if (rc < 0)
return rc;
if (pos >= rc) {
rc = 0;
} else {
- rc = trace_copyout_string(buffer, nob,
- tmpstr + pos, "\n");
+ rc = cfs_trace_copyout_string(buffer, nob,
+ tmpstr + pos, "\n");
}
} else {
- rc = trace_copyin_string(tmpstr, tmpstrlen, buffer, nob);
+ rc = cfs_trace_copyin_string(tmpstr, tmpstrlen, buffer, nob);
if (rc < 0)
return rc;
*mask |= D_EMERG;
}
- trace_free_string_buffer(tmpstr, tmpstrlen);
+ cfs_trace_free_string_buffer(tmpstr, tmpstrlen);
return rc;
}
DECLARE_PROC_HANDLER(proc_dobitmasks)
+static int min_watchdog_ratelimit = 0; /* disable ratelimiting */
+static int max_watchdog_ratelimit = (24*60*60); /* limit to once per day */
+
static int __proc_dump_kernel(void *data, int write,
loff_t pos, void *buffer, int nob)
{
if (!write)
return 0;
- return trace_dump_debug_buffer_usrstr(buffer, nob);
+ return cfs_trace_dump_debug_buffer_usrstr(buffer, nob);
}
DECLARE_PROC_HANDLER(proc_dump_kernel)
loff_t pos, void *buffer, int nob)
{
if (!write) {
- int len = strlen(tracefile);
+ int len = strlen(cfs_tracefile);
if (pos >= len)
return 0;
- return trace_copyout_string(buffer, nob,
- tracefile + pos, "\n");
+ return cfs_trace_copyout_string(buffer, nob,
+ cfs_tracefile + pos, "\n");
}
- return trace_daemon_command_usrstr(buffer, nob);
+ return cfs_trace_daemon_command_usrstr(buffer, nob);
}
DECLARE_PROC_HANDLER(proc_daemon_file)
if (!write) {
char tmpstr[32];
int len = snprintf(tmpstr, sizeof(tmpstr), "%d",
- trace_get_debug_mb());
+ cfs_trace_get_debug_mb());
if (pos >= len)
return 0;
- return trace_copyout_string(buffer, nob, tmpstr + pos, "\n");
+ return cfs_trace_copyout_string(buffer, nob, tmpstr + pos,
+ "\n");
}
- return trace_set_debug_mb_usrstr(buffer, nob);
+ return cfs_trace_set_debug_mb_usrstr(buffer, nob);
}
DECLARE_PROC_HANDLER(proc_debug_mb)
return rc;
}
+int LL_PROC_PROTO(libcfs_force_lbug)
+{
+ if (write)
+ LBUG();
+ return 0;
+}
+
+int LL_PROC_PROTO(proc_fail_loc)
+{
+ int rc;
+ long old_fail_loc = cfs_fail_loc;
+
+ rc = ll_proc_dolongvec(table, write, filp, buffer, lenp, ppos);
+ if (old_fail_loc != cfs_fail_loc)
+ cfs_waitq_signal(&cfs_race_waitq);
+ return rc;
+}
+
+static int __proc_cpt_table(void *data, int write,
+ loff_t pos, void *buffer, int nob)
+{
+ char *buf = NULL;
+ int len = 4096;
+ int rc = 0;
+
+ if (write)
+ return -EPERM;
+
+ LASSERT(cfs_cpt_table != NULL);
+
+ while (1) {
+ LIBCFS_ALLOC(buf, len);
+ if (buf == NULL)
+ return -ENOMEM;
+
+ rc = cfs_cpt_table_print(cfs_cpt_table, buf, len);
+ if (rc >= 0)
+ break;
+
+ LIBCFS_FREE(buf, len);
+ if (rc == -EFBIG) {
+ len <<= 1;
+ continue;
+ }
+ goto out;
+ }
+
+ if (pos >= rc) {
+ rc = 0;
+ goto out;
+ }
+
+ rc = cfs_trace_copyout_string(buffer, nob, buf + pos, NULL);
+ out:
+ if (buf != NULL)
+ LIBCFS_FREE(buf, len);
+ return rc;
+}
+DECLARE_PROC_HANDLER(proc_cpt_table)
+
static cfs_sysctl_table_t lnet_table[] = {
/*
* NB No .strategy entries have been provided since sysctl(8) prefers
* to go via /proc for portability.
*/
{
- .ctl_name = PSDEV_DEBUG,
+ INIT_CTL_NAME(PSDEV_DEBUG)
.procname = "debug",
.data = &libcfs_debug,
.maxlen = sizeof(int),
.proc_handler = &proc_dobitmasks,
},
{
- .ctl_name = PSDEV_SUBSYSTEM_DEBUG,
+ INIT_CTL_NAME(PSDEV_SUBSYSTEM_DEBUG)
.procname = "subsystem_debug",
.data = &libcfs_subsystem_debug,
.maxlen = sizeof(int),
.proc_handler = &proc_dobitmasks,
},
{
- .ctl_name = PSDEV_PRINTK,
+ INIT_CTL_NAME(PSDEV_PRINTK)
.procname = "printk",
.data = &libcfs_printk,
.maxlen = sizeof(int),
.proc_handler = &proc_dobitmasks,
},
{
- .ctl_name = PSDEV_CONSOLE_RATELIMIT,
+ INIT_CTL_NAME(PSDEV_CONSOLE_RATELIMIT)
.procname = "console_ratelimit",
.data = &libcfs_console_ratelimit,
.maxlen = sizeof(int),
.proc_handler = &proc_dointvec
},
{
- .ctl_name = PSDEV_CONSOLE_MAX_DELAY_CS,
+ INIT_CTL_NAME(PSDEV_CONSOLE_MAX_DELAY_CS)
.procname = "console_max_delay_centisecs",
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = &proc_console_max_delay_cs
},
{
- .ctl_name = PSDEV_CONSOLE_MIN_DELAY_CS,
+ INIT_CTL_NAME(PSDEV_CONSOLE_MIN_DELAY_CS)
.procname = "console_min_delay_centisecs",
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = &proc_console_min_delay_cs
},
{
- .ctl_name = PSDEV_CONSOLE_BACKOFF,
+ INIT_CTL_NAME(PSDEV_CONSOLE_BACKOFF)
.procname = "console_backoff",
.maxlen = sizeof(int),
.mode = 0644,
},
{
- .ctl_name = PSDEV_DEBUG_PATH,
+ INIT_CTL_NAME(PSDEV_DEBUG_PATH)
.procname = "debug_path",
- .data = debug_file_path_arr,
- .maxlen = sizeof(debug_file_path_arr),
+ .data = libcfs_debug_file_path_arr,
+ .maxlen = sizeof(libcfs_debug_file_path_arr),
.mode = 0644,
.proc_handler = &proc_dostring,
},
+ {
+ .ctl_name = PSDEV_CPT_TABLE,
+ .procname = "cpu_partition_table",
+ .maxlen = 128,
+ .mode = 0444,
+ .proc_handler = &proc_cpt_table,
+ },
+
{
- .ctl_name = PSDEV_LNET_UPCALL,
+ INIT_CTL_NAME(PSDEV_LNET_UPCALL)
.procname = "upcall",
.data = lnet_upcall,
.maxlen = sizeof(lnet_upcall),
.proc_handler = &proc_dostring,
},
{
- .ctl_name = PSDEV_LNET_DEBUG_LOG_UPCALL,
+ INIT_CTL_NAME(PSDEV_LNET_DEBUG_LOG_UPCALL)
.procname = "debug_log_upcall",
.data = lnet_debug_log_upcall,
.maxlen = sizeof(lnet_debug_log_upcall),
.proc_handler = &proc_dostring,
},
{
- .ctl_name = PSDEV_LNET_MEMUSED,
- .procname = "memused",
+ INIT_CTL_NAME(PSDEV_LNET_MEMUSED)
+ .procname = "lnet_memused",
.data = (int *)&libcfs_kmemory.counter,
.maxlen = sizeof(int),
.mode = 0444,
.proc_handler = &proc_dointvec,
- .strategy = &sysctl_intvec,
+ INIT_STRATEGY(&sysctl_intvec)
},
{
- .ctl_name = PSDEV_LNET_CATASTROPHE,
+ INIT_CTL_NAME(PSDEV_LNET_CATASTROPHE)
.procname = "catastrophe",
.data = &libcfs_catastrophe,
.maxlen = sizeof(int),
.mode = 0444,
.proc_handler = &proc_dointvec,
- .strategy = &sysctl_intvec,
+ INIT_STRATEGY(&sysctl_intvec)
},
{
- .ctl_name = PSDEV_LNET_PANIC_ON_LBUG,
+ INIT_CTL_NAME(PSDEV_LNET_PANIC_ON_LBUG)
.procname = "panic_on_lbug",
.data = &libcfs_panic_on_lbug,
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = &proc_dointvec,
- .strategy = &sysctl_intvec,
+ INIT_STRATEGY(&sysctl_intvec)
},
{
- .ctl_name = PSDEV_LNET_DUMP_KERNEL,
+ INIT_CTL_NAME(PSDEV_LNET_DUMP_KERNEL)
.procname = "dump_kernel",
.maxlen = 256,
.mode = 0200,
.proc_handler = &proc_dump_kernel,
},
{
- .ctl_name = PSDEV_LNET_DAEMON_FILE,
+ INIT_CTL_NAME(PSDEV_LNET_DAEMON_FILE)
.procname = "daemon_file",
.mode = 0644,
.maxlen = 256,
.proc_handler = &proc_daemon_file,
},
{
- .ctl_name = PSDEV_LNET_DEBUG_MB,
+ INIT_CTL_NAME(PSDEV_LNET_DEBUG_MB)
.procname = "debug_mb",
.mode = 0644,
.proc_handler = &proc_debug_mb,
},
- {0}
+ {
+ INIT_CTL_NAME(PSDEV_LNET_WATCHDOG_RATELIMIT)
+ .procname = "watchdog_ratelimit",
+ .data = &libcfs_watchdog_ratelimit,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+ .proc_handler = &proc_dointvec_minmax,
+ .extra1 = &min_watchdog_ratelimit,
+ .extra2 = &max_watchdog_ratelimit,
+ },
+ { INIT_CTL_NAME(PSDEV_LNET_FORCE_LBUG)
+ .procname = "force_lbug",
+ .data = NULL,
+ .maxlen = 0,
+ .mode = 0200,
+ .proc_handler = &libcfs_force_lbug
+ },
+ {
+ INIT_CTL_NAME(PSDEV_LNET_FAIL_LOC)
+ .procname = "fail_loc",
+ .data = &cfs_fail_loc,
+ .maxlen = sizeof(cfs_fail_loc),
+ .mode = 0644,
+ .proc_handler = &proc_fail_loc
+ },
+ {
+ INIT_CTL_NAME(PSDEV_LNET_FAIL_VAL)
+ .procname = "fail_val",
+ .data = &cfs_fail_val,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+ .proc_handler = &proc_dointvec
+ },
+ {
+ INIT_CTL_NAME(0)
+ }
};
+#ifdef CONFIG_SYSCTL
static cfs_sysctl_table_t top_table[] = {
{
- .ctl_name = CTL_LNET,
+ INIT_CTL_NAME(CTL_LNET)
.procname = "lnet",
.mode = 0555,
.data = NULL,
.child = lnet_table,
},
{
- .ctl_name = 0
+ INIT_CTL_NAME(0)
}
};
int insert_proc(void)
{
-#ifdef CONFIG_SYSCTL
if (lnet_table_header == NULL)
lnet_table_header = cfs_register_sysctl_table(top_table, 0);
#endif