rcutorture: Replace schedule_timeout*() 1-jiffy waits with HZ/20
In the past, spinning on schedule_timeout* with a wait of 1 jiffy has
hung the kernel. See for example d52d3a2bf4
("torture: Fix hang during
kthread shutdown phase").
This issue recently recurred in torture's stutter code. The result is
that the function instantly returns and never goes to sleep, preempting
whatever might otherwise make useful forward progress.
To prevent future issues, apply the commit-d52d3a2bf408 fix throughout
rcutorture, moving from a 1-jiffy wait to a 50-millisecond wait.
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
This commit is contained in:
parent
30639bfdac
commit
66bcb1321b
@ -1149,7 +1149,7 @@ static int rcu_torture_boost(void *arg)
|
||||
mutex_unlock(&boost_mutex);
|
||||
break;
|
||||
}
|
||||
schedule_timeout_uninterruptible(1);
|
||||
schedule_timeout_uninterruptible(HZ / 20);
|
||||
}
|
||||
|
||||
/* Go do the stutter. */
|
||||
@ -1160,7 +1160,7 @@ checkwait: if (stutter_wait("rcu_torture_boost"))
|
||||
/* Clean up and exit. */
|
||||
while (!kthread_should_stop()) {
|
||||
torture_shutdown_absorb("rcu_torture_boost");
|
||||
schedule_timeout_uninterruptible(1);
|
||||
schedule_timeout_uninterruptible(HZ / 20);
|
||||
}
|
||||
torture_kthread_stopping("rcu_torture_boost");
|
||||
return 0;
|
||||
@ -1183,7 +1183,7 @@ rcu_torture_fqs(void *arg)
|
||||
fqs_resume_time = jiffies + fqs_stutter * HZ;
|
||||
while (time_before(jiffies, fqs_resume_time) &&
|
||||
!kthread_should_stop()) {
|
||||
schedule_timeout_interruptible(1);
|
||||
schedule_timeout_interruptible(HZ / 20);
|
||||
}
|
||||
fqs_burst_remaining = fqs_duration;
|
||||
while (fqs_burst_remaining > 0 &&
|
||||
@ -2899,7 +2899,7 @@ static int rcu_torture_fwd_prog(void *args)
|
||||
WRITE_ONCE(rcu_fwd_seq, rcu_fwd_seq + 1);
|
||||
} else {
|
||||
while (READ_ONCE(rcu_fwd_seq) == oldseq && !torture_must_stop())
|
||||
schedule_timeout_interruptible(1);
|
||||
schedule_timeout_interruptible(HZ / 20);
|
||||
oldseq = READ_ONCE(rcu_fwd_seq);
|
||||
}
|
||||
pr_alert("%s: Starting forward-progress test %d\n", __func__, rfp->rcu_fwd_id);
|
||||
@ -3200,7 +3200,7 @@ static int rcu_torture_read_exit_child(void *trsp_in)
|
||||
set_user_nice(current, MAX_NICE);
|
||||
// Minimize time between reading and exiting.
|
||||
while (!kthread_should_stop())
|
||||
schedule_timeout_uninterruptible(1);
|
||||
schedule_timeout_uninterruptible(HZ / 20);
|
||||
(void)rcu_torture_one_read(trsp, -1);
|
||||
return 0;
|
||||
}
|
||||
@ -3248,7 +3248,7 @@ static int rcu_torture_read_exit(void *unused)
|
||||
smp_mb(); // Store before wakeup.
|
||||
wake_up(&read_exit_wq);
|
||||
while (!torture_must_stop())
|
||||
schedule_timeout_uninterruptible(1);
|
||||
schedule_timeout_uninterruptible(HZ / 20);
|
||||
torture_kthread_stopping("rcu_torture_read_exit");
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user