#endif
char lnet_upcall[1024] = "/usr/lib/lustre/lnet_upcall";
+char lnet_debug_log_upcall[1024] = "/usr/lib/lustre/lnet_debug_log_upcall";
+
+/**
+ * Upcall function once a Lustre log has been dumped.
+ *
+ * \param file path of the dumped log
+ */
+void libcfs_run_debug_log_upcall(char *file)
+{
+ char *argv[3];
+ int rc;
+ char *envp[] = {
+ "HOME=/",
+ "PATH=/sbin:/bin:/usr/sbin:/usr/bin",
+ NULL};
+ ENTRY;
+
+ argv[0] = lnet_debug_log_upcall;
+
+ LASSERTF(file != NULL, "called on a null filename\n");
+ argv[1] = file; //only need to pass the path of the file
+
+ argv[2] = NULL;
+
+ rc = USERMODEHELPER(argv[0], argv, envp);
+ if (rc < 0 && rc != -ENOENT) {
+ CERROR("Error %d invoking LNET debug log upcall %s %s; "
+ "check /proc/sys/lnet/debug_log_upcall\n",
+ rc, argv[0], argv[1]);
+ } else {
+ CDEBUG(D_HA, "Invoked LNET debug log upcall %s %s\n",
+ argv[0], argv[1]);
+ }
+
+ EXIT;
+}
void libcfs_run_upcall(char **argv)
{
static cfs_sysctl_table_header_t *lnet_table_header = NULL;
extern char lnet_upcall[1024];
+/**
+ * The path of debug log dump upcall script.
+ */
+extern char lnet_debug_log_upcall[1024];
#define PSDEV_LNET (0x100)
enum {
PSDEV_LNET_DUMP_KERNEL, /* snapshot kernel debug buffer to file */
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 */
};
-static int
-proc_call_handler(void *data, int write,
- loff_t *ppos, void *buffer, size_t *lenp,
+static int
+proc_call_handler(void *data, int write,
+ loff_t *ppos, void *buffer, size_t *lenp,
int (*handler)(void *data, int write,
loff_t pos, void *buffer, int len))
{
__##name); \
}
-static int __proc_dobitmasks(void *data, int write,
+static int __proc_dobitmasks(void *data, int write,
loff_t pos, void *buffer, int nob)
{
const int tmpstrlen = 512;
{
if (!write)
return 0;
-
+
return trace_dump_debug_buffer_usrstr(buffer, nob);
}
{
if (!write) {
int len = strlen(tracefile);
-
+
if (pos >= len)
return 0;
-
- return trace_copyout_string(buffer, nob,
+
+ return trace_copyout_string(buffer, nob,
tracefile + pos, "\n");
}
-
+
return trace_daemon_command_usrstr(buffer, nob);
}
if (pos >= len)
return 0;
-
+
return trace_copyout_string(buffer, nob, tmpstr + pos, "\n");
}
-
+
return trace_set_debug_mb_usrstr(buffer, nob);
}
.mode = 0644,
.proc_handler = &proc_console_backoff
},
-
{
.ctl_name = PSDEV_DEBUG_PATH,
.procname = "debug_path",
.mode = 0644,
.proc_handler = &proc_dostring,
},
-
{
.ctl_name = PSDEV_LNET_UPCALL,
.procname = "upcall",
.proc_handler = &proc_dostring,
},
{
+ .ctl_name = PSDEV_LNET_DEBUG_LOG_UPCALL,
+ .procname = "debug_log_upcall",
+ .data = lnet_debug_log_upcall,
+ .maxlen = sizeof(lnet_debug_log_upcall),
+ .mode = 0644,
+ .proc_handler = &proc_dostring,
+ },
+ {
.ctl_name = PSDEV_LNET_MEMUSED,
.procname = "memused",
.data = (int *)&libcfs_kmemory.counter,
extern char tracefile[TRACEFILE_NAME_SIZE];
extern long long tracefile_size;
+extern void libcfs_run_debug_log_upcall(char *file);
+
int tracefile_init_arch(void);
void tracefile_fini_arch(void);
#define TRACEFILE_SIZE (500 << 20)
-/* Size of a buffer for sprinting console messages if we can't get a page
+/* Size of a buffer for sprinting console messages if we can't get a page
* from system */
#define TRACE_CONSOLE_BUFFER_SIZE 1024
/*
* Maximal number of pages allowed on ->tcd_pages and
- * ->tcd_daemon_pages each.
+ * ->tcd_daemon_pages each.
* Always TCD_MAX_PAGES * tcd_pages_factor / 100 in current
* implementation.
*/
*/
unsigned short cpu;
/*
- * type(context) of this page
+ * type(context) of this page
*/
unsigned short type;
};