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

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
Loading
Loading
Loading
Loading
+8 −10
Original line number Diff line number Diff line
@@ -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;
	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;
}