X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=libcfs%2Flibcfs%2Fdebug.c;h=8669dad85789a2995d05c60519c6e0c73d35d917;hp=b059791572d78b6abd9ed63452bbefc6f0366974;hb=cfba9a1ecc6b20746c289afc8e3c81097e07d8a3;hpb=f6497eb3503b7efff823888ed76422db4e9e078e diff --git a/libcfs/libcfs/debug.c b/libcfs/libcfs/debug.c index b059791..8669dad 100644 --- a/libcfs/libcfs/debug.c +++ b/libcfs/libcfs/debug.c @@ -69,15 +69,8 @@ static int libcfs_param_debug_mb_set(const char *val, * RHEL6 does not support any kind of locking so we have to provide * our own */ -#if !defined(HAVE_MODULE_PARAM_LOCKING) && !defined(HAVE_KERNEL_PARAM_LOCK) - kernel_param_lock(THIS_MODULE); -#endif if (!*((unsigned int *)kp->arg)) { *((unsigned int *)kp->arg) = num; - -#if !defined(HAVE_MODULE_PARAM_LOCKING) && !defined(HAVE_KERNEL_PARAM_LOCK) - kernel_param_unlock(THIS_MODULE); -#endif return 0; } @@ -86,9 +79,6 @@ static int libcfs_param_debug_mb_set(const char *val, if (!rc) *((unsigned int *)kp->arg) = cfs_trace_get_debug_mb(); -#if !defined(HAVE_MODULE_PARAM_LOCKING) && !defined(HAVE_KERNEL_PARAM_LOCK) - kernel_param_unlock(THIS_MODULE); -#endif return rc; } @@ -259,7 +249,7 @@ MODULE_PARM_DESC(libcfs_panic_on_lbug, "Lustre kernel panic on LBUG"); atomic_t libcfs_kmemory = ATOMIC_INIT(0); EXPORT_SYMBOL(libcfs_kmemory); -static wait_queue_head_t debug_ctlwq; +static DECLARE_COMPLETION(debug_complete); char libcfs_debug_file_path_arr[PATH_MAX] = LIBCFS_DEBUG_FILE_PATH_DEFAULT; EXPORT_SYMBOL(libcfs_debug_file_path_arr); @@ -396,8 +386,7 @@ void libcfs_debug_dumplog_internal(void *arg) snprintf(debug_file_name, sizeof(debug_file_name) - 1, "%s.%lld.%ld", libcfs_debug_file_path_arr, (s64)current_time, (uintptr_t)arg); - printk(KERN_ALERT "LustreError: dumping log to %s\n", - debug_file_name); + 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); } @@ -407,38 +396,38 @@ void libcfs_debug_dumplog_internal(void *arg) static int libcfs_debug_dumplog_thread(void *arg) { libcfs_debug_dumplog_internal(arg); - wake_up(&debug_ctlwq); + complete(&debug_complete); return 0; } +static DEFINE_MUTEX(libcfs_debug_dumplog_lock); + void libcfs_debug_dumplog(void) { - wait_queue_entry_t wait; struct task_struct *dumper; 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() - */ - init_waitqueue_entry(&wait, current); - set_current_state(TASK_INTERRUPTIBLE); - add_wait_queue(&debug_ctlwq, &wait); + if (mutex_trylock(&libcfs_debug_dumplog_lock) == 0) + return; + /* If a previous call was interrupted, debug_complete->done + * might be elevated, and so we won't actually wait here. + * So we reinit the completion to ensure we wait for + * one thread to complete, though it might not be the one + * we start if there are overlaping thread. + */ + reinit_completion(&debug_complete); dumper = kthread_run(libcfs_debug_dumplog_thread, (void *)(long)current_pid(), "libcfs_debug_dumper"); if (IS_ERR(dumper)) - printk(KERN_ERR "LustreError: cannot start log dump thread:" - " %ld\n", PTR_ERR(dumper)); + pr_err("LustreError: cannot start log dump thread: rc = %ld\n", + PTR_ERR(dumper)); else - schedule(); + wait_for_completion_interruptible(&debug_complete); - /* be sure to teardown if cfs_create_thread() failed */ - remove_wait_queue(&debug_ctlwq, &wait); - set_current_state(TASK_RUNNING); + mutex_unlock(&libcfs_debug_dumplog_lock); } EXPORT_SYMBOL(libcfs_debug_dumplog); @@ -447,8 +436,6 @@ 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) {