On Wed, Jul 23, 2025 at 01:27:56PM -0700, Paul E. McKenney wrote: > This commit adds no-trace variants of the srcu_read_lock_fast() and > srcu_read_unlock_fast() functions for tracing use. > > [ paulmck: Apply notrace feedback from Joel Fernandes, Steven Rostedt, and Mathieu Desnoyers. ] > > Link: https://lore.kernel.org/all/20250721162433.10454-1-paulmck@xxxxxxxxxx > Signed-off-by: Paul E. McKenney <paulmck@xxxxxxxxxx> > Reviewed-by: Joel Fernandes <joelagnelf@xxxxxxxxxx> > Cc: Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxxxx> > Cc: Steven Rostedt <rostedt@xxxxxxxxxxx> > Cc: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> > Cc: <bpf@xxxxxxxxxxxxxxx> > --- > include/linux/srcu.h | 30 ++++++++++++++++++++++++++++-- > include/linux/srcutree.h | 5 +++-- > 2 files changed, 31 insertions(+), 4 deletions(-) > > diff --git a/include/linux/srcu.h b/include/linux/srcu.h > index 478c73d067f7d..ec3b8e27d6c5a 100644 > --- a/include/linux/srcu.h > +++ b/include/linux/srcu.h > @@ -271,7 +271,7 @@ static inline int srcu_read_lock(struct srcu_struct *ssp) __acquires(ssp) > * where RCU is watching, that is, from contexts where it would be legal > * to invoke rcu_read_lock(). Otherwise, lockdep will complain. > */ > -static inline struct srcu_ctr __percpu *srcu_read_lock_fast(struct srcu_struct *ssp) __acquires(ssp) > +static inline struct srcu_ctr __percpu notrace *srcu_read_lock_fast(struct srcu_struct *ssp) __acquires(ssp) Hmm.. am I missing something, why do we need ot make srcu_read_lock_fast() notrace? I thought we only need those _notrace() variants notrace? Regards, Boqun > { > struct srcu_ctr __percpu *retval; > > @@ -282,6 +282,20 @@ static inline struct srcu_ctr __percpu *srcu_read_lock_fast(struct srcu_struct * > return retval; > } > > +/* > + * Used by tracing, cannot be traced and cannot call lockdep. > + * See srcu_read_lock_fast() for more information. > + */ > +static inline struct srcu_ctr __percpu *srcu_read_lock_fast_notrace(struct srcu_struct *ssp) > + __acquires(ssp) > +{ > + struct srcu_ctr __percpu *retval; > + > + srcu_check_read_flavor_force(ssp, SRCU_READ_FLAVOR_FAST); > + retval = __srcu_read_lock_fast(ssp); > + return retval; > +} > + > /** > * srcu_down_read_fast - register a new reader for an SRCU-protected structure. > * @ssp: srcu_struct in which to register the new reader. > @@ -385,7 +399,8 @@ static inline void srcu_read_unlock(struct srcu_struct *ssp, int idx) > * > * Exit a light-weight SRCU read-side critical section. > */ > -static inline void srcu_read_unlock_fast(struct srcu_struct *ssp, struct srcu_ctr __percpu *scp) > +static inline void notrace > +srcu_read_unlock_fast(struct srcu_struct *ssp, struct srcu_ctr __percpu *scp) > __releases(ssp) > { > srcu_check_read_flavor(ssp, SRCU_READ_FLAVOR_FAST); > @@ -394,6 +409,17 @@ static inline void srcu_read_unlock_fast(struct srcu_struct *ssp, struct srcu_ct > RCU_LOCKDEP_WARN(!rcu_is_watching(), "RCU must be watching srcu_read_unlock_fast()."); > } > > +/* > + * Used by tracing, cannot be traced and cannot call lockdep. > + * See srcu_read_unlock_fast() for more information. > + */ > +static inline void srcu_read_unlock_fast_notrace(struct srcu_struct *ssp, > + struct srcu_ctr __percpu *scp) __releases(ssp) > +{ > + srcu_check_read_flavor(ssp, SRCU_READ_FLAVOR_FAST); > + __srcu_read_unlock_fast(ssp, scp); > +} > + > /** > * srcu_up_read_fast - unregister a old reader from an SRCU-protected structure. > * @ssp: srcu_struct in which to unregister the old reader. > diff --git a/include/linux/srcutree.h b/include/linux/srcutree.h > index 043b5a67ef71e..4d2fee4d38289 100644 > --- a/include/linux/srcutree.h > +++ b/include/linux/srcutree.h > @@ -240,7 +240,7 @@ static inline struct srcu_ctr __percpu *__srcu_ctr_to_ptr(struct srcu_struct *ss > * on architectures that support NMIs but do not supply NMI-safe > * implementations of this_cpu_inc(). > */ > -static inline struct srcu_ctr __percpu *__srcu_read_lock_fast(struct srcu_struct *ssp) > +static inline struct srcu_ctr __percpu notrace *__srcu_read_lock_fast(struct srcu_struct *ssp) > { > struct srcu_ctr __percpu *scp = READ_ONCE(ssp->srcu_ctrp); > > @@ -267,7 +267,8 @@ static inline struct srcu_ctr __percpu *__srcu_read_lock_fast(struct srcu_struct > * on architectures that support NMIs but do not supply NMI-safe > * implementations of this_cpu_inc(). > */ > -static inline void __srcu_read_unlock_fast(struct srcu_struct *ssp, struct srcu_ctr __percpu *scp) > +static inline void notrace > +__srcu_read_unlock_fast(struct srcu_struct *ssp, struct srcu_ctr __percpu *scp) > { > barrier(); /* Avoid leaking the critical section. */ > if (!IS_ENABLED(CONFIG_NEED_SRCU_NMI_SAFE)) > -- > 2.40.1 > >