mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
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>
This commit is contained in:
parent
ea7d3fef42
commit
c59ab97e9e
1 changed files with 8 additions and 10 deletions
|
@ -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,
|
||||||
{
|
{
|
||||||
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)
|
||||||
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)
|
||||||
} 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)
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue