[PATCH RFC rcu 0/19] Further shrink srcu_struct to promote cache locality

From: Paul E. McKenney
Date: Thu Mar 23 2023 - 20:19:13 EST


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(-)