From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: linux-kernel@vger.kernel.org
Cc: mingo@kernel.org, jiangshanlai@gmail.com, dipankar@in.ibm.com,
akpm@linux-foundation.org, mathieu.desnoyers@efficios.com,
josh@joshtriplett.org, tglx@linutronix.de, peterz@infradead.org,
rostedt@goodmis.org, dhowells@redhat.com, edumazet@google.com,
fweisbec@gmail.com, oleg@redhat.com, joel.opensrc@gmail.com,
torvalds@linux-foundation.org, npiggin@gmail.com
Subject: [PATCH tip/core/rcu 0/21] Contention reduction for v4.18
Date: Sun, 22 Apr 2018 20:02:58 -0700 [thread overview]
Message-ID: <20180423030258.GA23370@linux.vnet.ibm.com> (raw)
Hello!
This series reduces lock contention on the root rcu_node structure,
and is also the first precursor to TBD changes to consolidate the three
RCU flavors (RCU-bh, RCU-preempt, and RCU-sched) into one.
1. Improve non-root rcu_cbs_completed() accuracy, thus reducing the
need to acquire the root rcu_node structure's ->lock. This also
eliminates the need to reassign callbacks to an earlier grace
period, which enables introduction of funnel locking in a later
commit, which further reduces contention.
2. Make rcu_start_future_gp()'s grace-period check more precise,
eliminating one need for forward-progress failsafe checks
that acquire the root rcu_node structure's ->lock.
3. Create (and make use of) accessors for the ->need_future_gp[]
array to enable easy changes in size.
4. Make rcu_gp_kthread() check for early-boot activity, which was
another situation needing failsafe checks.
5. Make rcu_gp_cleanup() more accurately predict need for new GP.
This eliminates the need for both failsafe checks and extra
grace-period kthread wakeups.
6. Avoid losing ->need_future_gp[] values due to GP start/end races
by expanding this array from two elements to four.
7. Make rcu_future_needs_gp() check all ->need_future_gps[] elements,
again to eliminate a need for both failsafe checks and extra
grace-period kthread wakeups.
8. Convert ->need_future_gp[] array to boolean, given that there
is no longer a need to count the number of requests for a
future grace period.
9. Make rcu_migrate_callbacks wake GP kthread when needed, which
again eliminates a need for failsafe checks.
10. Avoid __call_rcu_core() root rcu_node ->lock acquisition, which
was one of the failsafe checks that many of the above patches
were making safe to remove.
11. Switch __rcu_process_callbacks() to rcu_accelerate_cbs(), which
was one of the failsafe checks that many of the above patches
were making safe to remove. (Yes, this one also acquired the
root rcu_node structure's ->lock, and was in fact the lock
acquisition that was showing up in Nick Piggin's traces.)
12. Put ->completed into an unsigned long instead of an int. (The
"int" was harmless because only the low-order bits were used,
but it was still an accident waiting to happen.)
13. Clear requests other than RCU_GP_FLAG_INIT at grace-period end.
This prevents premature quiescent-state forcing that might
otherwise occur due to requests posted when the grace period
was already almost done.
14. Inline rcu_start_gp_advanced() into rcu_start_future_gp().
This brings RCU down to only one function to start a grace
period, in happen contrast to the need to choose correctly
between three of them before this patch series.
15. Make rcu_start_future_gp() caller select grace period to avoid
duplicate grace-period selection. (We are going to like this
grace period so much that we selected it twice!)
16. Add funnel locking to rcu_start_this_gp(), the point being to
reduce lock contention, especially on large systems.
17. Make rcu_start_this_gp() check for out-of-range requests.
If this check triggers, that indicates a bug in a caller of
rcu_start_this_gp() or that the ->need_future_gp[] array needs
to be even bigger, most likely the former. More importantly, it
avoids one possible cause of otherwise silent grace-period hangs.
18. The rcu_gp_cleanup() function does not need cpu_needs_another_gp()
because funnel locking summarizes the need for future
grace periods in the root rcu_node structure's ->lock,
which rcu_gp_cleanup() already holds for other reasons.
19. Simplify and inline cpu_needs_another_gp(), which used to be a key
part of the no-longer-required forward-progress failsafe checks.
20. Drop early GP request check from rcu_gp_kthread(). Yes, it
was added above in order avoid grace-period hangs, but at this
point in the series is no longer needed. All in the name of
bisectability.
21. Update list of rcu_future_grace_period() trace events to reflect
strings added above.
Thanx, Paul
------------------------------------------------------------------------
include/trace/events/rcu.h | 13 -
kernel/rcu/rcu_segcblist.c | 18 -
kernel/rcu/rcu_segcblist.h | 2
kernel/rcu/tree.c | 406 ++++++++++++++++-----------------------------
kernel/rcu/tree.h | 24 ++
kernel/rcu/tree_plugin.h | 28 ---
6 files changed, 182 insertions(+), 309 deletions(-)
next reply other threads:[~2018-04-23 3:01 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-23 3:02 Paul E. McKenney [this message]
2018-04-23 3:03 ` [PATCH tip/core/rcu 01/21] rcu: Improve non-root rcu_cbs_completed() accuracy Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 02/21] rcu: Make rcu_start_future_gp()'s grace-period check more precise Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 03/21] rcu: Add accessor macros for the ->need_future_gp[] array Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 04/21] rcu: Make rcu_gp_kthread() check for early-boot activity Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 05/21] rcu: Make rcu_gp_cleanup() more accurately predict need for new GP Paul E. McKenney
2018-05-10 7:21 ` [tip/core/rcu, " Joel Fernandes
2018-05-10 13:15 ` Paul E. McKenney
2018-05-10 17:22 ` Joel Fernandes
2018-05-11 16:22 ` Paul E. McKenney
2018-05-10 17:37 ` Joel Fernandes
2018-05-11 16:24 ` Paul E. McKenney
2018-05-11 16:27 ` Joel Fernandes
2018-04-23 3:03 ` [PATCH tip/core/rcu 06/21] rcu: Avoid losing ->need_future_gp[] values due to GP start/end races Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 07/21] rcu: Make rcu_future_needs_gp() check all ->need_future_gps[] elements Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 08/21] rcu: Convert ->need_future_gp[] array to boolean Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 09/21] rcu: Make rcu_migrate_callbacks wake GP kthread when needed Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 10/21] rcu: Avoid __call_rcu_core() root rcu_node ->lock acquisition Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 11/21] rcu: Switch __rcu_process_callbacks() to rcu_accelerate_cbs() Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 12/21] rcu: Cleanup, don't put ->completed into an int Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 13/21] rcu: Clear request other than RCU_GP_FLAG_INIT at GP end Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 14/21] rcu: Inline rcu_start_gp_advanced() into rcu_start_future_gp() Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 15/21] rcu: Make rcu_start_future_gp() caller select grace period Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 16/21] rcu: Add funnel locking to rcu_start_this_gp() Paul E. McKenney
2018-05-12 6:03 ` [tip/core/rcu,16/21] " Joel Fernandes
2018-05-12 14:40 ` Paul E. McKenney
2018-05-12 14:44 ` Paul E. McKenney
2018-05-12 23:53 ` Joel Fernandes
2018-05-13 15:38 ` Paul E. McKenney
2018-05-13 16:49 ` Joel Fernandes
2018-05-13 19:09 ` Paul E. McKenney
2018-05-13 19:51 ` Joel Fernandes
2018-05-14 2:22 ` Paul E. McKenney
2018-05-14 5:00 ` Joel Fernandes
2018-05-14 13:23 ` Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 17/21] rcu: Make rcu_start_this_gp() check for out-of-range requests Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 18/21] rcu: The rcu_gp_cleanup() function does not need cpu_needs_another_gp() Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 19/21] rcu: Simplify and inline cpu_needs_another_gp() Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 20/21] rcu: Drop early GP request check from rcu_gp_kthread() Paul E. McKenney
2018-04-23 3:03 ` [PATCH tip/core/rcu 21/21] rcu: Update list of rcu_future_grace_period() trace events Paul E. McKenney
2018-05-14 6:42 ` [PATCH tip/core/rcu 0/21] Contention reduction for v4.18 Nicholas Piggin
2018-05-14 16:09 ` Paul E. McKenney
2018-05-14 22:21 ` Nicholas Piggin
2018-05-14 22:42 ` Paul E. McKenney
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=20180423030258.GA23370@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=dhowells@redhat.com \
--cc=dipankar@in.ibm.com \
--cc=edumazet@google.com \
--cc=fweisbec@gmail.com \
--cc=jiangshanlai@gmail.com \
--cc=joel.opensrc@gmail.com \
--cc=josh@joshtriplett.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mingo@kernel.org \
--cc=npiggin@gmail.com \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).