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: Paul E. McKenney <paulmck@kernel.org>
This commit is contained in:
parent
ae19aaafae
commit
ea31fd9ca8
@ -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)
|
|||||||
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
|
|||||||
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)
|
|||||||
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:
|
||||||
|
Loading…
Reference in New Issue
Block a user