diff options
| author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2009-01-04 21:28:27 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-01-05 07:09:49 -0500 |
| commit | c59ab97e9ecdee9084d2da09e5a8ceea9a396508 (patch) | |
| tree | 2f5cd48f324089acec80f8fb44bdc4f5de84052a | |
| parent | ea7d3fef4222cd98556a0b386598268d4dbf6670 (diff) | |
rcu: fix rcutorture bug
Fix an rcutorture bug that prevents the shutdown notifier from ever
actually having any effect, due to the fact that kthreads ignore all
signals.
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
| -rw-r--r-- | kernel/rcutorture.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/kernel/rcutorture.c b/kernel/rcutorture.c index 3245b40952c6..1cff28db56b6 100644 --- a/kernel/rcutorture.c +++ b/kernel/rcutorture.c | |||
| @@ -136,7 +136,7 @@ static int stutter_pause_test = 0; | |||
| 136 | #endif | 136 | #endif |
| 137 | int rcutorture_runnable = RCUTORTURE_RUNNABLE_INIT; | 137 | int rcutorture_runnable = RCUTORTURE_RUNNABLE_INIT; |
| 138 | 138 | ||
| 139 | #define FULLSTOP_SIGNALED 1 /* Bail due to signal. */ | 139 | #define FULLSTOP_SHUTDOWN 1 /* Bail due to system shutdown/panic. */ |
| 140 | #define FULLSTOP_CLEANUP 2 /* Orderly shutdown. */ | 140 | #define FULLSTOP_CLEANUP 2 /* Orderly shutdown. */ |
| 141 | static int fullstop; /* stop generating callbacks at test end. */ | 141 | static int fullstop; /* stop generating callbacks at test end. */ |
| 142 | DEFINE_MUTEX(fullstop_mutex); /* protect fullstop transitions and */ | 142 | DEFINE_MUTEX(fullstop_mutex); /* protect fullstop transitions and */ |
| @@ -151,12 +151,10 @@ rcutorture_shutdown_notify(struct notifier_block *unused1, | |||
| 151 | { | 151 | { |
| 152 | if (fullstop) | 152 | if (fullstop) |
| 153 | return NOTIFY_DONE; | 153 | return NOTIFY_DONE; |
| 154 | if (signal_pending(current)) { | 154 | mutex_lock(&fullstop_mutex); |
| 155 | mutex_lock(&fullstop_mutex); | 155 | if (!fullstop) |
| 156 | if (!ACCESS_ONCE(fullstop)) | 156 | fullstop = FULLSTOP_SHUTDOWN; |
| 157 | fullstop = FULLSTOP_SIGNALED; | 157 | mutex_unlock(&fullstop_mutex); |
| 158 | mutex_unlock(&fullstop_mutex); | ||
| 159 | } | ||
| 160 | return NOTIFY_DONE; | 158 | return NOTIFY_DONE; |
| 161 | } | 159 | } |
| 162 | 160 | ||
| @@ -624,7 +622,7 @@ rcu_torture_writer(void *arg) | |||
| 624 | rcu_stutter_wait(); | 622 | rcu_stutter_wait(); |
| 625 | } while (!kthread_should_stop() && !fullstop); | 623 | } while (!kthread_should_stop() && !fullstop); |
| 626 | VERBOSE_PRINTK_STRING("rcu_torture_writer task stopping"); | 624 | VERBOSE_PRINTK_STRING("rcu_torture_writer task stopping"); |
| 627 | while (!kthread_should_stop() && fullstop != FULLSTOP_SIGNALED) | 625 | while (!kthread_should_stop() && fullstop != FULLSTOP_SHUTDOWN) |
| 628 | schedule_timeout_uninterruptible(1); | 626 | schedule_timeout_uninterruptible(1); |
| 629 | return 0; | 627 | return 0; |
| 630 | } | 628 | } |
| @@ -649,7 +647,7 @@ rcu_torture_fakewriter(void *arg) | |||
| 649 | } while (!kthread_should_stop() && !fullstop); | 647 | } while (!kthread_should_stop() && !fullstop); |
| 650 | 648 | ||
| 651 | VERBOSE_PRINTK_STRING("rcu_torture_fakewriter task stopping"); | 649 | VERBOSE_PRINTK_STRING("rcu_torture_fakewriter task stopping"); |
| 652 | while (!kthread_should_stop() && fullstop != FULLSTOP_SIGNALED) | 650 | while (!kthread_should_stop() && fullstop != FULLSTOP_SHUTDOWN) |
| 653 | schedule_timeout_uninterruptible(1); | 651 | schedule_timeout_uninterruptible(1); |
| 654 | return 0; | 652 | return 0; |
| 655 | } | 653 | } |
| @@ -759,7 +757,7 @@ rcu_torture_reader(void *arg) | |||
| 759 | VERBOSE_PRINTK_STRING("rcu_torture_reader task stopping"); | 757 | VERBOSE_PRINTK_STRING("rcu_torture_reader task stopping"); |
| 760 | if (irqreader && cur_ops->irqcapable) | 758 | if (irqreader && cur_ops->irqcapable) |
| 761 | del_timer_sync(&t); | 759 | del_timer_sync(&t); |
| 762 | while (!kthread_should_stop() && fullstop != FULLSTOP_SIGNALED) | 760 | while (!kthread_should_stop() && fullstop != FULLSTOP_SHUTDOWN) |
| 763 | schedule_timeout_uninterruptible(1); | 761 | schedule_timeout_uninterruptible(1); |
| 764 | return 0; | 762 | return 0; |
| 765 | } | 763 | } |
