Skip to content

Commit ac51c40

Browse files
paulmckrcuFrederic Weisbecker
authored andcommitted
srcu: Make SRCU-fast readers enforce use of SRCU-fast definition/init
This commit makes CONFIG_PROVE_RCU=y kernels enforce the new rule that srcu_struct structures that are passed to srcu_read_lock_fast() and other SRCU-fast read-side markers be either initialized with init_srcu_struct_fast() on the one hand or defined with DEFINE_SRCU_FAST() or DEFINE_STATIC_SRCU_FAST() on the other. This eliminates the read-side test that was formerly included in srcu_read_lock_fast() and friends, speeding these primitives up by about 25% (admittedly only about half of a nanosecond, but when tracing on fastpaths...) Signed-off-by: Paul E. McKenney <paulmck@kernel.org> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Cc: <bpf@vger.kernel.org> Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
1 parent 8235bcf commit ac51c40

3 files changed

Lines changed: 4 additions & 19 deletions

File tree

include/linux/srcu.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ static inline struct srcu_ctr __percpu *srcu_read_lock_fast(struct srcu_struct *
297297
struct srcu_ctr __percpu *retval;
298298

299299
RCU_LOCKDEP_WARN(!rcu_is_watching(), "RCU must be watching srcu_read_lock_fast().");
300-
srcu_check_read_flavor_force(ssp, SRCU_READ_FLAVOR_FAST);
300+
srcu_check_read_flavor(ssp, SRCU_READ_FLAVOR_FAST);
301301
retval = __srcu_read_lock_fast(ssp);
302302
rcu_try_lock_acquire(&ssp->dep_map);
303303
return retval;
@@ -312,7 +312,7 @@ static inline struct srcu_ctr __percpu *srcu_read_lock_fast_notrace(struct srcu_
312312
{
313313
struct srcu_ctr __percpu *retval;
314314

315-
srcu_check_read_flavor_force(ssp, SRCU_READ_FLAVOR_FAST);
315+
srcu_check_read_flavor(ssp, SRCU_READ_FLAVOR_FAST);
316316
retval = __srcu_read_lock_fast(ssp);
317317
return retval;
318318
}
@@ -333,7 +333,7 @@ static inline struct srcu_ctr __percpu *srcu_down_read_fast(struct srcu_struct *
333333
{
334334
WARN_ON_ONCE(IS_ENABLED(CONFIG_PROVE_RCU) && in_nmi());
335335
RCU_LOCKDEP_WARN(!rcu_is_watching(), "RCU must be watching srcu_down_read_fast().");
336-
srcu_check_read_flavor_force(ssp, SRCU_READ_FLAVOR_FAST);
336+
srcu_check_read_flavor(ssp, SRCU_READ_FLAVOR_FAST);
337337
return __srcu_read_lock_fast(ssp);
338338
}
339339

include/linux/srcutiny.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@ static inline void srcu_barrier(struct srcu_struct *ssp)
112112

113113
static inline void srcu_expedite_current(struct srcu_struct *ssp) { }
114114
#define srcu_check_read_flavor(ssp, read_flavor) do { } while (0)
115-
#define srcu_check_read_flavor_force(ssp, read_flavor) do { } while (0)
116115

117116
/* Defined here to avoid size increase for non-torture kernels. */
118117
static inline void srcu_torture_stats_print(struct srcu_struct *ssp,

include/linux/srcutree.h

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -307,21 +307,7 @@ __srcu_read_unlock_fast(struct srcu_struct *ssp, struct srcu_ctr __percpu *scp)
307307

308308
void __srcu_check_read_flavor(struct srcu_struct *ssp, int read_flavor);
309309

310-
// Record reader usage even for CONFIG_PROVE_RCU=n kernels. This is
311-
// needed only for flavors that require grace-period smp_mb() calls to be
312-
// promoted to synchronize_rcu().
313-
static inline void srcu_check_read_flavor_force(struct srcu_struct *ssp, int read_flavor)
314-
{
315-
struct srcu_data *sdp = raw_cpu_ptr(ssp->sda);
316-
317-
if (likely(READ_ONCE(sdp->srcu_reader_flavor) & read_flavor))
318-
return;
319-
320-
// Note that the cmpxchg() in __srcu_check_read_flavor() is fully ordered.
321-
__srcu_check_read_flavor(ssp, read_flavor);
322-
}
323-
324-
// Record non-_lite() usage only for CONFIG_PROVE_RCU=y kernels.
310+
// Record SRCU-reader usage type only for CONFIG_PROVE_RCU=y kernels.
325311
static inline void srcu_check_read_flavor(struct srcu_struct *ssp, int read_flavor)
326312
{
327313
if (IS_ENABLED(CONFIG_PROVE_RCU))

0 commit comments

Comments
 (0)