diff options
Diffstat (limited to 'kernel/torture.c')
-rw-r--r-- | kernel/torture.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/kernel/torture.c b/kernel/torture.c index acc9afc2f26e..40bb511cca48 100644 --- a/kernel/torture.c +++ b/kernel/torture.c | |||
@@ -335,13 +335,8 @@ static void torture_shuffle_tasks(void) | |||
335 | shuffle_idle_cpu = cpumask_next(shuffle_idle_cpu, shuffle_tmp_mask); | 335 | shuffle_idle_cpu = cpumask_next(shuffle_idle_cpu, shuffle_tmp_mask); |
336 | if (shuffle_idle_cpu >= nr_cpu_ids) | 336 | if (shuffle_idle_cpu >= nr_cpu_ids) |
337 | shuffle_idle_cpu = -1; | 337 | shuffle_idle_cpu = -1; |
338 | if (shuffle_idle_cpu != -1) { | 338 | else |
339 | cpumask_clear_cpu(shuffle_idle_cpu, shuffle_tmp_mask); | 339 | cpumask_clear_cpu(shuffle_idle_cpu, shuffle_tmp_mask); |
340 | if (cpumask_empty(shuffle_tmp_mask)) { | ||
341 | put_online_cpus(); | ||
342 | return; | ||
343 | } | ||
344 | } | ||
345 | 340 | ||
346 | mutex_lock(&shuffle_task_mutex); | 341 | mutex_lock(&shuffle_task_mutex); |
347 | list_for_each_entry(stp, &shuffle_task_list, st_l) | 342 | list_for_each_entry(stp, &shuffle_task_list, st_l) |
@@ -533,7 +528,11 @@ void stutter_wait(const char *title) | |||
533 | while (ACCESS_ONCE(stutter_pause_test) || | 528 | while (ACCESS_ONCE(stutter_pause_test) || |
534 | (torture_runnable && !ACCESS_ONCE(*torture_runnable))) { | 529 | (torture_runnable && !ACCESS_ONCE(*torture_runnable))) { |
535 | if (stutter_pause_test) | 530 | if (stutter_pause_test) |
536 | schedule_timeout_interruptible(1); | 531 | if (ACCESS_ONCE(stutter_pause_test) == 1) |
532 | schedule_timeout_interruptible(1); | ||
533 | else | ||
534 | while (ACCESS_ONCE(stutter_pause_test)) | ||
535 | cond_resched(); | ||
537 | else | 536 | else |
538 | schedule_timeout_interruptible(round_jiffies_relative(HZ)); | 537 | schedule_timeout_interruptible(round_jiffies_relative(HZ)); |
539 | torture_shutdown_absorb(title); | 538 | torture_shutdown_absorb(title); |
@@ -550,7 +549,11 @@ static int torture_stutter(void *arg) | |||
550 | VERBOSE_TOROUT_STRING("torture_stutter task started"); | 549 | VERBOSE_TOROUT_STRING("torture_stutter task started"); |
551 | do { | 550 | do { |
552 | if (!torture_must_stop()) { | 551 | if (!torture_must_stop()) { |
553 | schedule_timeout_interruptible(stutter); | 552 | if (stutter > 1) { |
553 | schedule_timeout_interruptible(stutter - 1); | ||
554 | ACCESS_ONCE(stutter_pause_test) = 2; | ||
555 | } | ||
556 | schedule_timeout_interruptible(1); | ||
554 | ACCESS_ONCE(stutter_pause_test) = 1; | 557 | ACCESS_ONCE(stutter_pause_test) = 1; |
555 | } | 558 | } |
556 | if (!torture_must_stop()) | 559 | if (!torture_must_stop()) |
@@ -596,21 +599,27 @@ static void torture_stutter_cleanup(void) | |||
596 | * The runnable parameter points to a flag that controls whether or not | 599 | * The runnable parameter points to a flag that controls whether or not |
597 | * the test is currently runnable. If there is no such flag, pass in NULL. | 600 | * the test is currently runnable. If there is no such flag, pass in NULL. |
598 | */ | 601 | */ |
599 | void __init torture_init_begin(char *ttype, bool v, int *runnable) | 602 | bool torture_init_begin(char *ttype, bool v, int *runnable) |
600 | { | 603 | { |
601 | mutex_lock(&fullstop_mutex); | 604 | mutex_lock(&fullstop_mutex); |
605 | if (torture_type != NULL) { | ||
606 | pr_alert("torture_init_begin: refusing %s init: %s running", | ||
607 | ttype, torture_type); | ||
608 | mutex_unlock(&fullstop_mutex); | ||
609 | return false; | ||
610 | } | ||
602 | torture_type = ttype; | 611 | torture_type = ttype; |
603 | verbose = v; | 612 | verbose = v; |
604 | torture_runnable = runnable; | 613 | torture_runnable = runnable; |
605 | fullstop = FULLSTOP_DONTSTOP; | 614 | fullstop = FULLSTOP_DONTSTOP; |
606 | 615 | return true; | |
607 | } | 616 | } |
608 | EXPORT_SYMBOL_GPL(torture_init_begin); | 617 | EXPORT_SYMBOL_GPL(torture_init_begin); |
609 | 618 | ||
610 | /* | 619 | /* |
611 | * Tell the torture module that initialization is complete. | 620 | * Tell the torture module that initialization is complete. |
612 | */ | 621 | */ |
613 | void __init torture_init_end(void) | 622 | void torture_init_end(void) |
614 | { | 623 | { |
615 | mutex_unlock(&fullstop_mutex); | 624 | mutex_unlock(&fullstop_mutex); |
616 | register_reboot_notifier(&torture_shutdown_nb); | 625 | register_reboot_notifier(&torture_shutdown_nb); |
@@ -642,6 +651,9 @@ bool torture_cleanup(void) | |||
642 | torture_shuffle_cleanup(); | 651 | torture_shuffle_cleanup(); |
643 | torture_stutter_cleanup(); | 652 | torture_stutter_cleanup(); |
644 | torture_onoff_cleanup(); | 653 | torture_onoff_cleanup(); |
654 | mutex_lock(&fullstop_mutex); | ||
655 | torture_type = NULL; | ||
656 | mutex_unlock(&fullstop_mutex); | ||
645 | return false; | 657 | return false; |
646 | } | 658 | } |
647 | EXPORT_SYMBOL_GPL(torture_cleanup); | 659 | EXPORT_SYMBOL_GPL(torture_cleanup); |
@@ -674,8 +686,10 @@ EXPORT_SYMBOL_GPL(torture_must_stop_irq); | |||
674 | */ | 686 | */ |
675 | void torture_kthread_stopping(char *title) | 687 | void torture_kthread_stopping(char *title) |
676 | { | 688 | { |
677 | if (verbose) | 689 | char buf[128]; |
678 | VERBOSE_TOROUT_STRING(title); | 690 | |
691 | snprintf(buf, sizeof(buf), "Stopping %s", title); | ||
692 | VERBOSE_TOROUT_STRING(buf); | ||
679 | while (!kthread_should_stop()) { | 693 | while (!kthread_should_stop()) { |
680 | torture_shutdown_absorb(title); | 694 | torture_shutdown_absorb(title); |
681 | schedule_timeout_uninterruptible(1); | 695 | schedule_timeout_uninterruptible(1); |