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); |
