Message ID | 1315332049-2604-42-git-send-email-paulmck@linux.vnet.ibm.com |
---|---|
State | Accepted |
Commit | 93898fb1a395d2a5a53db238c68036da2f8c64d1 |
Headers | show |
On Tue, Sep 06, 2011 at 11:00:36AM -0700, Paul E. McKenney wrote: > The rcu_torture_fqs() function can prevent the rcutorture tests from > completing, resulting in a hang. This commit therefore ensures that > rcu_torture_fqs() will exit its inner loops at the end of the test, > and also applies the newish ULONG_CMP_LT() macro to time comparisons. > > Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> This seems like two entirely separate changes, which should go in separate commits. - Josh Triplett
On Sun, Oct 16, 2011 at 06:53:29PM -0700, Josh Triplett wrote: > On Tue, Sep 06, 2011 at 11:00:36AM -0700, Paul E. McKenney wrote: > > The rcu_torture_fqs() function can prevent the rcutorture tests from > > completing, resulting in a hang. This commit therefore ensures that > > rcu_torture_fqs() will exit its inner loops at the end of the test, > > and also applies the newish ULONG_CMP_LT() macro to time comparisons. > > > > Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> > > This seems like two entirely separate changes, which should go in > separate commits. Interesting. I was thinking of this as fixing hangs in rcutorture, and was feeling somewhat bad about having the separate commit for the part of the fix that I missed. ;-) Thanx, Paul
diff --git a/kernel/rcutorture.c b/kernel/rcutorture.c index 6648e00..eb739c0 100644 --- a/kernel/rcutorture.c +++ b/kernel/rcutorture.c @@ -741,7 +741,7 @@ static int rcu_torture_boost(void *arg) do { /* Wait for the next test interval. */ oldstarttime = boost_starttime; - while (jiffies - oldstarttime > ULONG_MAX / 2) { + while (ULONG_CMP_LT(jiffies, oldstarttime)) { schedule_timeout_uninterruptible(1); rcu_stutter_wait("rcu_torture_boost"); if (kthread_should_stop() || @@ -752,7 +752,7 @@ static int rcu_torture_boost(void *arg) /* Do one boost-test interval. */ endtime = oldstarttime + test_boost_duration * HZ; call_rcu_time = jiffies; - while (jiffies - endtime > ULONG_MAX / 2) { + while (ULONG_CMP_LT(jiffies, endtime)) { /* If we don't have a callback in flight, post one. */ if (!rbi.inflight) { smp_mb(); /* RCU core before ->inflight = 1. */ @@ -818,11 +818,13 @@ rcu_torture_fqs(void *arg) VERBOSE_PRINTK_STRING("rcu_torture_fqs task started"); do { fqs_resume_time = jiffies + fqs_stutter * HZ; - while (jiffies - fqs_resume_time > LONG_MAX) { + while (ULONG_CMP_LT(jiffies, fqs_resume_time) && + !kthread_should_stop()) { schedule_timeout_interruptible(1); } fqs_burst_remaining = fqs_duration; - while (fqs_burst_remaining > 0) { + while (fqs_burst_remaining > 0 && + !kthread_should_stop()) { cur_ops->fqs(); udelay(fqs_holdoff); fqs_burst_remaining -= fqs_holdoff;
The rcu_torture_fqs() function can prevent the rcutorture tests from completing, resulting in a hang. This commit therefore ensures that rcu_torture_fqs() will exit its inner loops at the end of the test, and also applies the newish ULONG_CMP_LT() macro to time comparisons. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> --- kernel/rcutorture.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-)