[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <3db82572-f156-4a5d-b711-841aa28bd996@paulmck-laptop>
Date: Thu, 23 Mar 2023 17:19:08 -0700
From: "Paul E. McKenney" <paulmck@...nel.org>
To: rcu@...r.kernel.org
Cc: linux-kernel@...r.kernel.org, kernel-team@...a.com,
rostedt@...dmis.org, hch@....de
Subject: [PATCH RFC rcu 0/19] Further shrink srcu_struct to promote cache
locality
Hello!
This RFC series shrinks the srcu_struct structure to the bare minimum
required to support SRCU readers, relegating the remaining fields to a new
srcu_usage structure. Statically allocated srcu_struct structures created
by DEFINE_SRCU() and DEFINE_STATIC_SRCU() have statically allocated
srcu_usage structures, but those required for dynamically allocated
srcu_struct structures that are initialized using init_srcu_struct()
are dynamically allocated.
The results is a reduction in the size of an srcu_struct structure from
a couple hundred bytes to just 24 bytes on x86_64 systems. This can be
helpful when SRCU readers are used in a fastpath for which the srcu_struct
structure must be embedded in another structure, and especially where
that fastpath also needs to access fields both before and after the
srcu_struct structure.
This series takes baby steps, in part because breaking SRCU means that
you get absolutely no console output. Yes, I did learn this the hard way.
Why do you ask? ;-)
Here are those baby steps:
1. Add whitespace to __SRCU_STRUCT_INIT() & __DEFINE_SRCU().
2. Use static init for statically allocated in-module srcu_struct.
3. Begin offloading srcu_struct fields to srcu_update. Note that
this affects notifiers, which open-code static allocation of
an srcu_struct structure. (And no, I still do not see a way to
abstract this, sorry!)
4. Move ->level from srcu_struct to srcu_usage.
5. Move ->srcu_size_state from srcu_struct to srcu_usage.
6. Move ->srcu_cb_mutex from srcu_struct to srcu_usage.
7. Move ->lock initialization after srcu_usage allocation.
8. Move ->lock from srcu_struct to srcu_usage.
9. Move ->srcu_gp_mutex from srcu_struct to srcu_usage.
10. Move grace-period fields from srcu_struct to srcu_usage.
11. Move heuristics fields from srcu_struct to srcu_usage.
12. Move ->sda_is_static from srcu_struct to srcu_usage.
13. Move srcu_barrier() fields from srcu_struct to srcu_usage.
14. Move work-scheduling fields from srcu_struct to srcu_usage.
15. Fix long lines in srcu_get_delay().
16. Fix long lines in cleanup_srcu_struct().
17. Fix long lines in srcu_gp_end().
18. Fix long lines in srcu_funnel_gp_start().
19. Remove extraneous parentheses from srcu_read_lock() etc.
Thanx, Paul
------------------------------------------------------------------------
b/include/linux/notifier.h | 5
b/include/linux/srcu.h | 8
b/include/linux/srcutiny.h | 6
b/include/linux/srcutree.h | 28 +-
b/kernel/rcu/rcu.h | 6
b/kernel/rcu/srcutree.c | 19 +
include/linux/srcutree.h | 123 ++++++-----
kernel/rcu/srcutree.c | 488 +++++++++++++++++++++++----------------------
8 files changed, 368 insertions(+), 315 deletions(-)
Powered by blists - more mailing lists