[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <530be59f-96a9-4b2b-8be3-af837d7cbe3a@paulmck-laptop>
Date: Wed, 23 Aug 2023 14:07:55 -0700
From: "Paul E. McKenney" <paulmck@...nel.org>
To: "Joel Fernandes (Google)" <joel@...lfernandes.org>
Cc: linux-kernel@...r.kernel.org, Davidlohr Bueso <dave@...olabs.net>,
Josh Triplett <josh@...htriplett.org>,
Frederic Weisbecker <frederic@...nel.org>,
Neeraj Upadhyay <quic_neeraju@...cinc.com>,
Boqun Feng <boqun.feng@...il.com>,
Steven Rostedt <rostedt@...dmis.org>,
Mathieu Desnoyers <mathieu.desnoyers@...icios.com>,
Lai Jiangshan <jiangshanlai@...il.com>,
Zqiang <qiang.zhang1211@...il.com>, rcu@...r.kernel.org
Subject: Re: [PATCH] rcutorture: Replace schedule_timeout*() 1 jiffie waits
with HZ/20
On Wed, Aug 16, 2023 at 08:49:12PM +0000, Joel Fernandes (Google) wrote:
> In the past, we see that spinning on schedule_timeout* with a wait of 1
> jiffie can hang the kernel. See d52d3a2bf408 ("torture: Fix hang during
> kthread shutdown phase").
>
> Recently again it showed up in torture's stutter code as well. The behavior is
> the the function may instantly return and never go to sleep preempting whatever
> was running under it.
>
> To prevent future issues, apply the same fix mentioned in the above
> commit d52d3a2bf408 to more places.
>
> I took care to only apply it to places where I thought it made sense.
>
> Signed-off-by: Joel Fernandes (Google) <joel@...lfernandes.org>
Hearing no objections, I applied this for further review and testing.
In the future, should some of these become hrtimers?
Thanx, Paul
> ---
> kernel/rcu/rcutorture.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
> index 8dd52ea78b52..a31297f32a2a 100644
> --- a/kernel/rcu/rcutorture.c
> +++ b/kernel/rcu/rcutorture.c
> @@ -1153,7 +1153,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. */
> @@ -1164,7 +1164,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;
> @@ -1187,7 +1187,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 &&
> @@ -2903,7 +2903,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);
> @@ -3204,7 +3204,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;
> }
> @@ -3252,7 +3252,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;
> }
> --
> 2.41.0.694.ge786442a9b-goog
>
Powered by blists - more mailing lists