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