diff options
Diffstat (limited to 'kernel/trace/preemptirq_delay_test.c')
| -rw-r--r-- | kernel/trace/preemptirq_delay_test.c | 12 | 
1 files changed, 10 insertions, 2 deletions
| diff --git a/kernel/trace/preemptirq_delay_test.c b/kernel/trace/preemptirq_delay_test.c index c4c86de63cf9..312d1a0ca3b6 100644 --- a/kernel/trace/preemptirq_delay_test.c +++ b/kernel/trace/preemptirq_delay_test.c @@ -16,6 +16,7 @@  #include <linux/printk.h>  #include <linux/string.h>  #include <linux/sysfs.h> +#include <linux/completion.h>  static ulong delay = 100;  static char test_mode[12] = "irq"; @@ -28,6 +29,8 @@ MODULE_PARM_DESC(delay, "Period in microseconds (100 us default)");  MODULE_PARM_DESC(test_mode, "Mode of the test such as preempt, irq, or alternate (default irq)");  MODULE_PARM_DESC(burst_size, "The size of a burst (default 1)"); +static struct completion done; +  #define MIN(x, y) ((x) < (y) ? (x) : (y))  static void busy_wait(ulong time) @@ -114,6 +117,8 @@ static int preemptirq_delay_run(void *data)  	for (i = 0; i < s; i++)  		(testfuncs[i])(i); +	complete(&done); +  	set_current_state(TASK_INTERRUPTIBLE);  	while (!kthread_should_stop()) {  		schedule(); @@ -128,15 +133,18 @@ static int preemptirq_delay_run(void *data)  static int preemptirq_run_test(void)  {  	struct task_struct *task; -  	char task_name[50]; +	init_completion(&done); +  	snprintf(task_name, sizeof(task_name), "%s_test", test_mode);  	task =  kthread_run(preemptirq_delay_run, NULL, task_name);  	if (IS_ERR(task))  		return PTR_ERR(task); -	if (task) +	if (task) { +		wait_for_completion(&done);  		kthread_stop(task); +	}  	return 0;  } |