From: Frederic Weisbecker <frederic@kernel.org>
To: Zqiang <qiang1.zhang@intel.com>
Cc: paulmck@kernel.org, joel@joelfernandes.org, rcu@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] rcu: Avoid invalid wakeup for rcuc kthreads in RCU_KTHREAD_OFFCPU status
Date: Wed, 16 Nov 2022 13:47:16 +0100 [thread overview]
Message-ID: <20221116124716.GA813995@lothringen> (raw)
In-Reply-To: <20221115131926.3409974-1-qiang1.zhang@intel.com>
On Tue, Nov 15, 2022 at 09:19:26PM +0800, Zqiang wrote:
> For CONFIG_PREEMPT_RT=y kernel, the "use_softirq=0" will be set, the
> RCU_SOFTIRQ processing is moved to per-CPU rcuc kthreads which created
> by smpboot_register_percpu_thread(). when CPU is going offline, the
> corresponding rcu_data.rcu_cpu_kthread_status is set RCU_KTHREAD_OFFCPU,
> and the rcuc kthreads enter TASK_PARKED state, kthreads in TASK_PARKED
> state only accept kthread_unpark() to wakeup.
>
> Therefore, This commit avoid invoke wake_up_process() to rcuc kthreads
> in TASK_PARKED state.
>
> Signed-off-by: Zqiang <qiang1.zhang@intel.com>
> ---
> kernel/rcu/tree.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
> index 3ccad468887e..49dd87356851 100644
> --- a/kernel/rcu/tree.c
> +++ b/kernel/rcu/tree.c
> @@ -2375,7 +2375,8 @@ static void rcu_wake_cond(struct task_struct *t, int status)
> * If the thread is yielding, only wake it when this
> * is invoked from idle
> */
> - if (t && (status != RCU_KTHREAD_YIELDING || is_idle_task(current)))
> + if (t && (status != RCU_KTHREAD_YIELDING || is_idle_task(current)) &&
> + status != RCU_KTHREAD_OFFCPU)
> wake_up_process(t);
There is a tiny window where this can happen (between CPUHP_TEARDOWN_CPU
and CPUHP_AP_SMPBOOT_THREADS) and it can't cause a spurious unpark because
wake_up_process() only wakes up from TASK_[UN]INTERRUPTIBLE states. And even
if it did, the KTHREAD_SHOULD_PARK bit would still be on.
And more important! On unpark time RCU_KTHREAD_OFFCPU isn't cleared. Only the
rcuc kthread does it, and after your patch it couldn't be awaken to perform
that, unless rcuc is lucky enough to have rcu_data.rcu_cpu_has_work = 1
by the time it unparks and that isn't guaranteed. So rcuc may sleep forever.
OTOH one cleanup that could be done is to make rcu_cpu_kthread_park() to use
__this_cpu_write as it's guaranteed that cpu == smp_processor_id().
Thanks.
next prev parent reply other threads:[~2022-11-16 12:47 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-15 13:19 [PATCH] rcu: Avoid invalid wakeup for rcuc kthreads in RCU_KTHREAD_OFFCPU status Zqiang
2022-11-16 12:47 ` Frederic Weisbecker [this message]
2022-11-16 14:07 ` Zhang, Qiang1
2022-11-16 15:01 ` Frederic Weisbecker
2022-11-16 23:23 ` Zhang, Qiang1
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221116124716.GA813995@lothringen \
--to=frederic@kernel.org \
--cc=joel@joelfernandes.org \
--cc=linux-kernel@vger.kernel.org \
--cc=paulmck@kernel.org \
--cc=qiang1.zhang@intel.com \
--cc=rcu@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.