Messages in this thread Patch in this message | | | Date | Sun, 13 Dec 2020 19:01:10 -0000 | From | "tip-bot2 for Paul E. McKenney" <> | Subject | [tip: core/rcu] torture: Make torture_stutter() use hrtimer |
| |
The following commit has been merged into the core/rcu branch of tip:
Commit-ID: fda5ba9ed254727ac5761b81455d8e93c78eba4a Gitweb: https://git.kernel.org/tip/fda5ba9ed254727ac5761b81455d8e93c78eba4a Author: Paul E. McKenney <paulmck@kernel.org> AuthorDate: Wed, 02 Sep 2020 21:08:41 -07:00 Committer: Paul E. McKenney <paulmck@kernel.org> CommitterDate: Fri, 06 Nov 2020 17:13:49 -08:00
torture: Make torture_stutter() use hrtimer
The torture_stutter() function uses schedule_timeout_interruptible() to time the stutter duration, but this can miss race conditions due to its being time-synchronized with everything else that is based on the timer wheels. This commit therefore converts torture_stutter() to use the high-resolution timers via schedule_hrtimeout(), and also to fuzz the stutter interval. While in the area, this commit also limits the spin-loop portion of the stutter_wait() function's wait loop to two jiffies, down from about one second.
Signed-off-by: Paul E. McKenney <paulmck@kernel.org> --- kernel/torture.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/kernel/torture.c b/kernel/torture.c index be09377..56ff02b 100644 --- a/kernel/torture.c +++ b/kernel/torture.c @@ -641,20 +641,27 @@ EXPORT_SYMBOL_GPL(stutter_wait); */ static int torture_stutter(void *arg) { + ktime_t delay; + DEFINE_TORTURE_RANDOM(rand); int wtime; VERBOSE_TOROUT_STRING("torture_stutter task started"); do { if (!torture_must_stop() && stutter > 1) { wtime = stutter; - if (stutter > HZ + 1) { + if (stutter > 2) { WRITE_ONCE(stutter_pause_test, 1); - wtime = stutter - HZ - 1; - schedule_timeout_interruptible(wtime); - wtime = HZ + 1; + wtime = stutter - 3; + delay = ktime_divns(NSEC_PER_SEC * wtime, HZ); + delay += (torture_random(&rand) >> 3) % NSEC_PER_MSEC; + set_current_state(TASK_INTERRUPTIBLE); + schedule_hrtimeout(&delay, HRTIMER_MODE_REL); + wtime = 2; } WRITE_ONCE(stutter_pause_test, 2); - schedule_timeout_interruptible(wtime); + delay = ktime_divns(NSEC_PER_SEC * wtime, HZ); + set_current_state(TASK_INTERRUPTIBLE); + schedule_hrtimeout(&delay, HRTIMER_MODE_REL); } WRITE_ONCE(stutter_pause_test, 0); if (!torture_must_stop())
| |