Commit c59ab97e authored by Paul E. McKenney's avatar Paul E. McKenney Committed by Ingo Molnar

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: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent ea7d3fef
...@@ -136,7 +136,7 @@ static int stutter_pause_test = 0; ...@@ -136,7 +136,7 @@ static int stutter_pause_test = 0;
#endif #endif
int rcutorture_runnable = RCUTORTURE_RUNNABLE_INIT; 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. */ #define FULLSTOP_CLEANUP 2 /* Orderly shutdown. */
static int fullstop; /* stop generating callbacks at test end. */ static int fullstop; /* stop generating callbacks at test end. */
DEFINE_MUTEX(fullstop_mutex); /* protect fullstop transitions and */ DEFINE_MUTEX(fullstop_mutex); /* protect fullstop transitions and */
...@@ -151,12 +151,10 @@ rcutorture_shutdown_notify(struct notifier_block *unused1, ...@@ -151,12 +151,10 @@ rcutorture_shutdown_notify(struct notifier_block *unused1,
{ {
if (fullstop) if (fullstop)
return NOTIFY_DONE; return NOTIFY_DONE;
if (signal_pending(current)) { mutex_lock(&fullstop_mutex);
mutex_lock(&fullstop_mutex); if (!fullstop)
if (!ACCESS_ONCE(fullstop)) fullstop = FULLSTOP_SHUTDOWN;
fullstop = FULLSTOP_SIGNALED; mutex_unlock(&fullstop_mutex);
mutex_unlock(&fullstop_mutex);
}
return NOTIFY_DONE; return NOTIFY_DONE;
} }
...@@ -624,7 +622,7 @@ rcu_torture_writer(void *arg) ...@@ -624,7 +622,7 @@ rcu_torture_writer(void *arg)
rcu_stutter_wait(); rcu_stutter_wait();
} while (!kthread_should_stop() && !fullstop); } while (!kthread_should_stop() && !fullstop);
VERBOSE_PRINTK_STRING("rcu_torture_writer task stopping"); 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); schedule_timeout_uninterruptible(1);
return 0; return 0;
} }
...@@ -649,7 +647,7 @@ rcu_torture_fakewriter(void *arg) ...@@ -649,7 +647,7 @@ rcu_torture_fakewriter(void *arg)
} while (!kthread_should_stop() && !fullstop); } while (!kthread_should_stop() && !fullstop);
VERBOSE_PRINTK_STRING("rcu_torture_fakewriter task stopping"); 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); schedule_timeout_uninterruptible(1);
return 0; return 0;
} }
...@@ -759,7 +757,7 @@ rcu_torture_reader(void *arg) ...@@ -759,7 +757,7 @@ rcu_torture_reader(void *arg)
VERBOSE_PRINTK_STRING("rcu_torture_reader task stopping"); VERBOSE_PRINTK_STRING("rcu_torture_reader task stopping");
if (irqreader && cur_ops->irqcapable) if (irqreader && cur_ops->irqcapable)
del_timer_sync(&t); del_timer_sync(&t);
while (!kthread_should_stop() && fullstop != FULLSTOP_SIGNALED) while (!kthread_should_stop() && fullstop != FULLSTOP_SHUTDOWN)
schedule_timeout_uninterruptible(1); schedule_timeout_uninterruptible(1);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment