rcu: fix rcutorture bug
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Mon, 5 Jan 2009 02:28:27 +0000 (18:28 -0800)
committerIngo Molnar <mingo@elte.hu>
Mon, 5 Jan 2009 12:09:49 +0000 (13:09 +0100)
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>
kernel/rcutorture.c

index 3245b40..1cff28d 100644 (file)
@@ -136,7 +136,7 @@ static int stutter_pause_test = 0;
 #endif
 int rcutorture_runnable = RCUTORTURE_RUNNABLE_INIT;
 
-#define FULLSTOP_SIGNALED 1    /* Bail due to signal. */
+#define FULLSTOP_SHUTDOWN 1    /* Bail due to system shutdown/panic. */
 #define FULLSTOP_CLEANUP  2    /* Orderly shutdown. */
 static int fullstop;           /* stop generating callbacks at test end. */
 DEFINE_MUTEX(fullstop_mutex);  /* protect fullstop transitions and */
@@ -151,12 +151,10 @@ rcutorture_shutdown_notify(struct notifier_block *unused1,
 {
        if (fullstop)
                return NOTIFY_DONE;
-       if (signal_pending(current)) {
-               mutex_lock(&fullstop_mutex);
-               if (!ACCESS_ONCE(fullstop))
-                       fullstop = FULLSTOP_SIGNALED;
-               mutex_unlock(&fullstop_mutex);
-       }
+       mutex_lock(&fullstop_mutex);
+       if (!fullstop)
+               fullstop = FULLSTOP_SHUTDOWN;
+       mutex_unlock(&fullstop_mutex);
        return NOTIFY_DONE;
 }
 
@@ -624,7 +622,7 @@ rcu_torture_writer(void *arg)
                rcu_stutter_wait();
        } while (!kthread_should_stop() && !fullstop);
        VERBOSE_PRINTK_STRING("rcu_torture_writer task stopping");
-       while (!kthread_should_stop() && fullstop != FULLSTOP_SIGNALED)
+       while (!kthread_should_stop() && fullstop != FULLSTOP_SHUTDOWN)
                schedule_timeout_uninterruptible(1);
        return 0;
 }
@@ -649,7 +647,7 @@ rcu_torture_fakewriter(void *arg)
        } while (!kthread_should_stop() && !fullstop);
 
        VERBOSE_PRINTK_STRING("rcu_torture_fakewriter task stopping");
-       while (!kthread_should_stop() && fullstop != FULLSTOP_SIGNALED)
+       while (!kthread_should_stop() && fullstop != FULLSTOP_SHUTDOWN)
                schedule_timeout_uninterruptible(1);
        return 0;
 }
@@ -759,7 +757,7 @@ rcu_torture_reader(void *arg)
        VERBOSE_PRINTK_STRING("rcu_torture_reader task stopping");
        if (irqreader && cur_ops->irqcapable)
                del_timer_sync(&t);
-       while (!kthread_should_stop() && fullstop != FULLSTOP_SIGNALED)
+       while (!kthread_should_stop() && fullstop != FULLSTOP_SHUTDOWN)
                schedule_timeout_uninterruptible(1);
        return 0;
 }