On Wed, Sep 09, 2026 at 10:34:16AM +0800, Kunwu Chan wrote:
> On Tue, 8 Sep 2026 16:36:11 -0700 "Paul E. McKenney" <[email protected]> 
> wrote:
> 
> > On Mon, Sep 07, 2026 at 03:58:22PM +0800, Kunwu Chan wrote:
> > > From: Kunwu Chan <[email protected]>
> > > 
> > > The is_atomic parameter of init_srcu_struct_fields() exists so that
> > > atomic SRCU never transitions to big, but neither
> > > init_srcu_struct_atomic() nor its lockdep counterpart
> > > __init_srcu_struct_atomic() sets it.
> > > 
> > > On systems where srcutree.convert_to_big selects SRCU_SIZING_INIT,
> > > this needlessly allocates a full srcu_node combining tree for any
> > > dynamically initialized atomic srcu_struct, despite atomic SRCU
> > > having neither callbacks nor srcu_barrier() operations.
> > > 
> > > Pass true from both atomic entry points, adding an is_atomic parameter
> > > to __init_srcu_struct_common().
> > > 
> > > Signed-off-by: Kunwu Chan <[email protected]>
> > 
> > Given that we have this commit, is this patch needed?
> > 
> > 4e01d5320a2f ("srcutree: Suppress to-big transition for atomic SRCU")
> > 
> > If so, please tell me what I am missing.
> 
> Yes, this patch is still needed. The is_atomic mechanism is there, but 
> the atomic initialization paths still pass false.
> 
> In particular, init_srcu_struct_atomic() passes false directly, while the 
> lockdep path goes through __init_srcu_struct_common(), which also passes 
> false.
> 
> This patch makes both atomic entry points propagate true.

Very good, queued and pushed!

                                                        Thanx, Paul

> Thanks,
> KunWu
> 
> > 
> >                                             Thanx, Paul
> > 
> > > ---
> > >  kernel/rcu/srcutree.c | 15 ++++++++-------
> > >  1 file changed, 8 insertions(+), 7 deletions(-)
> > > 
> > > diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c
> > > index 2af36db37fa9..01f224a56b41 100644
> > > --- a/kernel/rcu/srcutree.c
> > > +++ b/kernel/rcu/srcutree.c
> > > @@ -305,26 +305,27 @@ static int init_srcu_struct_fields(struct 
> > > srcu_struct *ssp, bool is_static, bool
> > >  #ifdef CONFIG_DEBUG_LOCK_ALLOC
> > >  
> > >  static int
> > > -__init_srcu_struct_common(struct srcu_struct *ssp, const char *name, 
> > > struct lock_class_key *key)
> > > +__init_srcu_struct_common(struct srcu_struct *ssp, const char *name,
> > > +                   struct lock_class_key *key, bool is_atomic)
> > >  {
> > >   /* Don't re-initialize a lock while it is held. */
> > >   debug_check_no_locks_freed((void *)ssp, sizeof(*ssp));
> > >   lockdep_init_map(&ssp->dep_map, name, key, 0);
> > > - return init_srcu_struct_fields(ssp, false, false);
> > > + return init_srcu_struct_fields(ssp, false, is_atomic);
> > >  }
> > >  
> > >  int init_srcu_struct_lockdep(struct srcu_struct *ssp, const char *name,
> > >                        struct lock_class_key *key)
> > >  {
> > >   ssp->srcu_reader_flavor = 0;
> > > - return __init_srcu_struct_common(ssp, name, key);
> > > + return __init_srcu_struct_common(ssp, name, key, false);
> > >  }
> > >  EXPORT_SYMBOL_GPL(init_srcu_struct_lockdep);
> > >  
> > >  int __init_srcu_struct_fast(struct srcu_struct *ssp, const char *name, 
> > > struct lock_class_key *key)
> > >  {
> > >   ssp->srcu_reader_flavor = SRCU_READ_FLAVOR_FAST;
> > > - return __init_srcu_struct_common(ssp, name, key);
> > > + return __init_srcu_struct_common(ssp, name, key, false);
> > >  }
> > >  EXPORT_SYMBOL_GPL(__init_srcu_struct_fast);
> > >  
> > > @@ -332,14 +333,14 @@ int __init_srcu_struct_fast_updown(struct 
> > > srcu_struct *ssp, const char *name,
> > >                              struct lock_class_key *key)
> > >  {
> > >   ssp->srcu_reader_flavor = SRCU_READ_FLAVOR_FAST_UPDOWN;
> > > - return __init_srcu_struct_common(ssp, name, key);
> > > + return __init_srcu_struct_common(ssp, name, key, false);
> > >  }
> > >  EXPORT_SYMBOL_GPL(__init_srcu_struct_fast_updown);
> > >  
> > >  int __init_srcu_struct_atomic(struct srcu_struct *ssp, const char *name, 
> > > struct lock_class_key *key)
> > >  {
> > >   ssp->srcu_reader_flavor = SRCU_READ_FLAVOR_ATOMIC;
> > > - return __init_srcu_struct_common(ssp, name, key);
> > > + return __init_srcu_struct_common(ssp, name, key, true);
> > >  }
> > >  EXPORT_SYMBOL_GPL(__init_srcu_struct_atomic);
> > >  
> > > @@ -414,7 +415,7 @@ EXPORT_SYMBOL_GPL(init_srcu_struct_fast_updown);
> > >  int init_srcu_struct_atomic(struct srcu_struct *ssp)
> > >  {
> > >   ssp->srcu_reader_flavor = SRCU_READ_FLAVOR_ATOMIC;
> > > - return init_srcu_struct_fields(ssp, false, false);
> > > + return init_srcu_struct_fields(ssp, false, true);
> > >  }
> > >  EXPORT_SYMBOL_GPL(init_srcu_struct_atomic);
> > >  
> > > -- 
> > > 2.43.0
> > > 
> > 
> 

Reply via email to