Commit ea31fd9c authored by Paul E. McKenney's avatar Paul E. McKenney

rcutorture: Use torture_hrtimeout_jiffies() to avoid busy-waits

Because rcu_torture_writer() and rcu_torture_fakewriter() predate
hrtimers, they do timer-wheel-decoupled timed waits by using the
timer-wheel-based schedule_timeout_interruptible() functions in
conjunction with a random udelay()-based wait.  This latter unnecessarily
burns CPU time, so this commit instead uses torture_hrtimeout_jiffies()
to decouple from the timer wheels without busy-waiting.
Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
parent ae19aaaf
...@@ -1194,10 +1194,7 @@ rcu_torture_writer(void *arg) ...@@ -1194,10 +1194,7 @@ rcu_torture_writer(void *arg)
case RTWS_COND_GET: case RTWS_COND_GET:
rcu_torture_writer_state = RTWS_COND_GET; rcu_torture_writer_state = RTWS_COND_GET;
gp_snap = cur_ops->get_gp_state(); gp_snap = cur_ops->get_gp_state();
i = torture_random(&rand) % 16; torture_hrtimeout_jiffies(torture_random(&rand) % 16, &rand);
if (i != 0)
schedule_timeout_interruptible(i);
udelay(torture_random(&rand) % 1000);
rcu_torture_writer_state = RTWS_COND_SYNC; rcu_torture_writer_state = RTWS_COND_SYNC;
cur_ops->cond_sync(gp_snap); cur_ops->cond_sync(gp_snap);
rcu_torture_pipe_update(old_rp); rcu_torture_pipe_update(old_rp);
...@@ -1206,12 +1203,9 @@ rcu_torture_writer(void *arg) ...@@ -1206,12 +1203,9 @@ rcu_torture_writer(void *arg)
rcu_torture_writer_state = RTWS_POLL_GET; rcu_torture_writer_state = RTWS_POLL_GET;
gp_snap = cur_ops->start_gp_poll(); gp_snap = cur_ops->start_gp_poll();
rcu_torture_writer_state = RTWS_POLL_WAIT; rcu_torture_writer_state = RTWS_POLL_WAIT;
while (!cur_ops->poll_gp_state(gp_snap)) { while (!cur_ops->poll_gp_state(gp_snap))
i = torture_random(&rand) % 16; torture_hrtimeout_jiffies(torture_random(&rand) % 16,
if (i != 0) &rand);
schedule_timeout_interruptible(i);
udelay(torture_random(&rand) % 1000);
}
rcu_torture_pipe_update(old_rp); rcu_torture_pipe_update(old_rp);
break; break;
case RTWS_SYNC: case RTWS_SYNC:
...@@ -1290,7 +1284,6 @@ static int ...@@ -1290,7 +1284,6 @@ static int
rcu_torture_fakewriter(void *arg) rcu_torture_fakewriter(void *arg)
{ {
unsigned long gp_snap; unsigned long gp_snap;
int i;
DEFINE_TORTURE_RANDOM(rand); DEFINE_TORTURE_RANDOM(rand);
VERBOSE_TOROUT_STRING("rcu_torture_fakewriter task started"); VERBOSE_TOROUT_STRING("rcu_torture_fakewriter task started");
...@@ -1311,19 +1304,14 @@ rcu_torture_fakewriter(void *arg) ...@@ -1311,19 +1304,14 @@ rcu_torture_fakewriter(void *arg)
break; break;
case RTWS_COND_GET: case RTWS_COND_GET:
gp_snap = cur_ops->get_gp_state(); gp_snap = cur_ops->get_gp_state();
i = torture_random(&rand) % 16; torture_hrtimeout_jiffies(torture_random(&rand) % 16, &rand);
if (i != 0)
schedule_timeout_interruptible(i);
udelay(torture_random(&rand) % 1000);
cur_ops->cond_sync(gp_snap); cur_ops->cond_sync(gp_snap);
break; break;
case RTWS_POLL_GET: case RTWS_POLL_GET:
gp_snap = cur_ops->start_gp_poll(); gp_snap = cur_ops->start_gp_poll();
while (!cur_ops->poll_gp_state(gp_snap)) { while (!cur_ops->poll_gp_state(gp_snap)) {
i = torture_random(&rand) % 16; torture_hrtimeout_jiffies(torture_random(&rand) % 16,
if (i != 0) &rand);
schedule_timeout_interruptible(i);
udelay(torture_random(&rand) % 1000);
} }
break; break;
case RTWS_SYNC: case RTWS_SYNC:
......
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