From: Zqiang <qiang1.zhang@intel.com>
To: paulmck@kernel.org, frederic@kernel.org
Cc: rcu@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH v2] rcu/nocb: Avoid polling when myrdp->nocb_head_rdp list is empty
Date: Tue, 7 Jun 2022 15:50:57 +0800 [thread overview]
Message-ID: <20220607075057.909070-1-qiang1.zhang@intel.com> (raw)
Currently, If the 'rcu_nocb_poll' bootargs is enable, all rcuog kthreads
enter polling mode. however, due to only insert CPU's rdp which belong to
rcu_nocb_mask to 'nocb_head_rdp' list or all CPU's rdp served by rcuog
kthread have been de-offloaded, these cause the 'nocb_head_rdp' list
served by rcuog kthread is empty, when the 'nocb_head_rdp' is empty,
the rcuog kthread in polling mode not actually do anything. fix it by
exiting polling mode when the 'nocb_head_rdp'list is empty, otherwise
entering polling mode.
Signed-off-by: Zqiang <qiang1.zhang@intel.com>
---
v1->v2:
Move rcu_nocb_poll flags check from rdp_offload_toggle() to
rcu_nocb_rdp_offload/deoffload(), avoid unnecessary setting of
rdp_gp->nocb_gp_sleep flags, because when rcu_nocb_poll is set
the rdp_gp->nocb_gp_sleep is not used.
kernel/rcu/tree_nocb.h | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/kernel/rcu/tree_nocb.h b/kernel/rcu/tree_nocb.h
index fa8e4f82e60c..2a52c9abc681 100644
--- a/kernel/rcu/tree_nocb.h
+++ b/kernel/rcu/tree_nocb.h
@@ -698,10 +698,14 @@ static void nocb_gp_wait(struct rcu_data *my_rdp)
TPS("WakeBypassIsDeferred"));
}
if (rcu_nocb_poll) {
- /* Polling, so trace if first poll in the series. */
- if (gotcbs)
- trace_rcu_nocb_wake(rcu_state.name, cpu, TPS("Poll"));
- schedule_timeout_idle(1);
+ if (list_empty(&my_rdp->nocb_head_rdp)) {
+ rcu_wait(READ_ONCE(my_rdp->nocb_toggling_rdp));
+ } else {
+ /* Polling, so trace if first poll in the series. */
+ if (gotcbs)
+ trace_rcu_nocb_wake(rcu_state.name, cpu, TPS("Poll"));
+ schedule_timeout_idle(1);
+ }
} else if (!needwait_gp) {
/* Wait for callbacks to appear. */
trace_rcu_nocb_wake(rcu_state.name, cpu, TPS("Sleep"));
@@ -1030,7 +1034,7 @@ static long rcu_nocb_rdp_deoffload(void *arg)
mutex_lock(&rdp_gp->nocb_gp_kthread_mutex);
if (rdp_gp->nocb_gp_kthread) {
- if (wake_gp)
+ if (wake_gp || rcu_nocb_poll)
wake_up_process(rdp_gp->nocb_gp_kthread);
/*
@@ -1152,7 +1156,7 @@ static long rcu_nocb_rdp_offload(void *arg)
* rcu_nocb_unlock() rcu_nocb_unlock()
*/
wake_gp = rdp_offload_toggle(rdp, true, flags);
- if (wake_gp)
+ if (wake_gp || rcu_nocb_poll)
wake_up_process(rdp_gp->nocb_gp_kthread);
swait_event_exclusive(rdp->nocb_state_wq,
rcu_segcblist_test_flags(cblist, SEGCBLIST_KTHREAD_CB) &&
--
2.25.1
next reply other threads:[~2022-06-07 7:51 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-07 7:50 Zqiang [this message]
2022-06-07 16:16 ` [PATCH v2] rcu/nocb: Avoid polling when myrdp->nocb_head_rdp list is empty Paul E. McKenney
2022-06-08 0:41 ` Zhang, Qiang1
2022-06-08 0:55 ` Paul E. McKenney
2022-06-08 1:01 ` Zhang, Qiang1
2022-06-08 4:06 ` Paul E. McKenney
2022-06-08 6:28 ` Zhang, Qiang1
2022-06-10 12:05 ` Frederic Weisbecker
2022-06-11 5:29 ` 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=20220607075057.909070-1-qiang1.zhang@intel.com \
--to=qiang1.zhang@intel.com \
--cc=frederic@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=paulmck@kernel.org \
--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.