Skip to content

Commit 6fcc739

Browse files
author
Frederic Weisbecker
committed
Merge branch 'rcu/srcu' into next
_ Properly handle SRCU readers within IRQ disabled sections in tiny SRCU - Preparation to reimplement RCU Tasks Trace on top of SRCU fast: - Introduce API to expedite a grace period and test it through rcutorture. - Split srcu-fast in two flavours: SRCU-fast and SRCU-fast-updown. Both are still targeted toward faster readers (without full barriers on LOCK and UNLOCK) at the expense of heavier write side (using full RCU grace period ordering instead of simply full ordering) as compared to "traditional" non-fast SRCU. But those srcu-fast flavours are going to be optimized in two different ways: - SRCU-fast will become the reimplementation basis for RCU-TASK-TRACE for consolidation. Since RCU-TASK-TRACE must be NMI safe, SRCU-fast must be as well. - SRCU-fast-updown will be needed for uretprobes code in order to get rid of the read-side memory barriers while still allowing entering the reader at task level while exiting it in a timer handler. It is considered semaphore-like in that it can have different owners between LOCK and UNLOCK. However it is not NMI-safe. The actual optimizations are work in progress for the next cycle. Only the new interfaces are added for now, along with related torture and scalability test code. - Create/document/debug/torture new proper initializers for RCU fast: DEFINE_SRCU_FAST() and init_srcu_struct_fast() This allows for using right away the proper ordering on the write side (either full ordering or full RCU grace period ordering) without waiting for the read side to tell which to use. Also this optimizes the read side altogether with moving flavour debug checks to debug config and with removing a costly RmW operation on their first call. - Make some diagnostic functions tracing safe.
2 parents 3a86608 + bfad332 commit 6fcc739

14 files changed

Lines changed: 501 additions & 102 deletions

File tree

Documentation/RCU/Design/Requirements/Requirements.rst

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2637,15 +2637,16 @@ synchronize_srcu() for some other domain ``ss1``, and if an
26372637
that was held across as ``ss``-domain synchronize_srcu(), deadlock
26382638
would again be possible. Such a deadlock cycle could extend across an
26392639
arbitrarily large number of different SRCU domains. Again, with great
2640-
power comes great responsibility.
2640+
power comes great responsibility, though lockdep is now able to detect
2641+
this sort of deadlock.
26412642

2642-
Unlike the other RCU flavors, SRCU read-side critical sections can run
2643-
on idle and even offline CPUs. This ability requires that
2644-
srcu_read_lock() and srcu_read_unlock() contain memory barriers,
2645-
which means that SRCU readers will run a bit slower than would RCU
2646-
readers. It also motivates the smp_mb__after_srcu_read_unlock() API,
2647-
which, in combination with srcu_read_unlock(), guarantees a full
2648-
memory barrier.
2643+
Unlike the other RCU flavors, SRCU read-side critical sections can run on
2644+
idle and even offline CPUs, with the exception of srcu_read_lock_fast()
2645+
and friends. This ability requires that srcu_read_lock() and
2646+
srcu_read_unlock() contain memory barriers, which means that SRCU
2647+
readers will run a bit slower than would RCU readers. It also motivates
2648+
the smp_mb__after_srcu_read_unlock() API, which, in combination with
2649+
srcu_read_unlock(), guarantees a full memory barrier.
26492650

26502651
Also unlike other RCU flavors, synchronize_srcu() may **not** be
26512652
invoked from CPU-hotplug notifiers, due to the fact that SRCU grace
@@ -2681,15 +2682,15 @@ run some tests first. SRCU just might need a few adjustment to deal with
26812682
that sort of load. Of course, your mileage may vary based on the speed
26822683
of your CPUs and the size of your memory.
26832684

2684-
The `SRCU
2685-
API <https://lwn.net/Articles/609973/#RCU%20Per-Flavor%20API%20Table>`__
2685+
The `SRCU API
2686+
<https://lwn.net/Articles/609973/#RCU%20Per-Flavor%20API%20Table>`__
26862687
includes srcu_read_lock(), srcu_read_unlock(),
2687-
srcu_dereference(), srcu_dereference_check(),
2688-
synchronize_srcu(), synchronize_srcu_expedited(),
2689-
call_srcu(), srcu_barrier(), and srcu_read_lock_held(). It
2690-
also includes DEFINE_SRCU(), DEFINE_STATIC_SRCU(), and
2691-
init_srcu_struct() APIs for defining and initializing
2692-
``srcu_struct`` structures.
2688+
srcu_dereference(), srcu_dereference_check(), synchronize_srcu(),
2689+
synchronize_srcu_expedited(), call_srcu(), srcu_barrier(),
2690+
and srcu_read_lock_held(). It also includes DEFINE_SRCU(),
2691+
DEFINE_STATIC_SRCU(), DEFINE_SRCU_FAST(), DEFINE_STATIC_SRCU_FAST(),
2692+
init_srcu_struct(), and init_srcu_struct_fast() APIs for defining and
2693+
initializing ``srcu_struct`` structures.
26932694

26942695
More recently, the SRCU API has added polling interfaces:
26952696

Documentation/RCU/checklist.rst

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -417,11 +417,13 @@ over a rather long period of time, but improvements are always welcome!
417417
you should be using RCU rather than SRCU, because RCU is almost
418418
always faster and easier to use than is SRCU.
419419

420-
Also unlike other forms of RCU, explicit initialization and
421-
cleanup is required either at build time via DEFINE_SRCU()
422-
or DEFINE_STATIC_SRCU() or at runtime via init_srcu_struct()
423-
and cleanup_srcu_struct(). These last two are passed a
424-
"struct srcu_struct" that defines the scope of a given
420+
Also unlike other forms of RCU, explicit initialization
421+
and cleanup is required either at build time via
422+
DEFINE_SRCU(), DEFINE_STATIC_SRCU(), DEFINE_SRCU_FAST(),
423+
or DEFINE_STATIC_SRCU_FAST() or at runtime via either
424+
init_srcu_struct() or init_srcu_struct_fast() and
425+
cleanup_srcu_struct(). These last three are passed a
426+
`struct srcu_struct` that defines the scope of a given
425427
SRCU domain. Once initialized, the srcu_struct is passed
426428
to srcu_read_lock(), srcu_read_unlock() synchronize_srcu(),
427429
synchronize_srcu_expedited(), and call_srcu(). A given

Documentation/RCU/whatisRCU.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1227,7 +1227,10 @@ SRCU: Initialization/cleanup/ordering::
12271227

12281228
DEFINE_SRCU
12291229
DEFINE_STATIC_SRCU
1230+
DEFINE_SRCU_FAST // for srcu_read_lock_fast() and friends
1231+
DEFINE_STATIC_SRCU_FAST // for srcu_read_lock_fast() and friends
12301232
init_srcu_struct
1233+
init_srcu_struct_fast
12311234
cleanup_srcu_struct
12321235
smp_mb__after_srcu_read_unlock
12331236

include/linux/notifier.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ extern void srcu_init_notifier_head(struct srcu_notifier_head *nh);
109109
.mutex = __MUTEX_INITIALIZER(name.mutex), \
110110
.head = NULL, \
111111
.srcuu = __SRCU_USAGE_INIT(name.srcuu), \
112-
.srcu = __SRCU_STRUCT_INIT(name.srcu, name.srcuu, pcpu), \
112+
.srcu = __SRCU_STRUCT_INIT(name.srcu, name.srcuu, pcpu, 0), \
113113
}
114114

115115
#define ATOMIC_NOTIFIER_HEAD(name) \

include/linux/srcu.h

Lines changed: 119 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,12 @@ struct srcu_struct;
2525

2626
#ifdef CONFIG_DEBUG_LOCK_ALLOC
2727

28-
int __init_srcu_struct(struct srcu_struct *ssp, const char *name,
29-
struct lock_class_key *key);
28+
int __init_srcu_struct(struct srcu_struct *ssp, const char *name, struct lock_class_key *key);
29+
#ifndef CONFIG_TINY_SRCU
30+
int __init_srcu_struct_fast(struct srcu_struct *ssp, const char *name, struct lock_class_key *key);
31+
int __init_srcu_struct_fast_updown(struct srcu_struct *ssp, const char *name,
32+
struct lock_class_key *key);
33+
#endif // #ifndef CONFIG_TINY_SRCU
3034

3135
#define init_srcu_struct(ssp) \
3236
({ \
@@ -35,22 +39,42 @@ int __init_srcu_struct(struct srcu_struct *ssp, const char *name,
3539
__init_srcu_struct((ssp), #ssp, &__srcu_key); \
3640
})
3741

42+
#define init_srcu_struct_fast(ssp) \
43+
({ \
44+
static struct lock_class_key __srcu_key; \
45+
\
46+
__init_srcu_struct_fast((ssp), #ssp, &__srcu_key); \
47+
})
48+
49+
#define init_srcu_struct_fast_updown(ssp) \
50+
({ \
51+
static struct lock_class_key __srcu_key; \
52+
\
53+
__init_srcu_struct_fast_updown((ssp), #ssp, &__srcu_key); \
54+
})
55+
3856
#define __SRCU_DEP_MAP_INIT(srcu_name) .dep_map = { .name = #srcu_name },
3957
#else /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */
4058

4159
int init_srcu_struct(struct srcu_struct *ssp);
60+
#ifndef CONFIG_TINY_SRCU
61+
int init_srcu_struct_fast(struct srcu_struct *ssp);
62+
int init_srcu_struct_fast_updown(struct srcu_struct *ssp);
63+
#endif // #ifndef CONFIG_TINY_SRCU
4264

4365
#define __SRCU_DEP_MAP_INIT(srcu_name)
4466
#endif /* #else #ifdef CONFIG_DEBUG_LOCK_ALLOC */
4567

4668
/* Values for SRCU Tree srcu_data ->srcu_reader_flavor, but also used by rcutorture. */
47-
#define SRCU_READ_FLAVOR_NORMAL 0x1 // srcu_read_lock().
48-
#define SRCU_READ_FLAVOR_NMI 0x2 // srcu_read_lock_nmisafe().
49-
// 0x4 // SRCU-lite is no longer with us.
50-
#define SRCU_READ_FLAVOR_FAST 0x8 // srcu_read_lock_fast().
51-
#define SRCU_READ_FLAVOR_ALL (SRCU_READ_FLAVOR_NORMAL | SRCU_READ_FLAVOR_NMI | \
52-
SRCU_READ_FLAVOR_FAST) // All of the above.
53-
#define SRCU_READ_FLAVOR_SLOWGP SRCU_READ_FLAVOR_FAST
69+
#define SRCU_READ_FLAVOR_NORMAL 0x1 // srcu_read_lock().
70+
#define SRCU_READ_FLAVOR_NMI 0x2 // srcu_read_lock_nmisafe().
71+
// 0x4 // SRCU-lite is no longer with us.
72+
#define SRCU_READ_FLAVOR_FAST 0x4 // srcu_read_lock_fast().
73+
#define SRCU_READ_FLAVOR_FAST_UPDOWN 0x8 // srcu_read_lock_fast().
74+
#define SRCU_READ_FLAVOR_ALL (SRCU_READ_FLAVOR_NORMAL | SRCU_READ_FLAVOR_NMI | \
75+
SRCU_READ_FLAVOR_FAST | SRCU_READ_FLAVOR_FAST_UPDOWN)
76+
// All of the above.
77+
#define SRCU_READ_FLAVOR_SLOWGP (SRCU_READ_FLAVOR_FAST | SRCU_READ_FLAVOR_FAST_UPDOWN)
5478
// Flavors requiring synchronize_rcu()
5579
// instead of smp_mb().
5680
void __srcu_read_unlock(struct srcu_struct *ssp, int idx) __releases(ssp);
@@ -259,29 +283,78 @@ static inline int srcu_read_lock(struct srcu_struct *ssp) __acquires(ssp)
259283
* @ssp: srcu_struct in which to register the new reader.
260284
*
261285
* Enter an SRCU read-side critical section, but for a light-weight
262-
* smp_mb()-free reader. See srcu_read_lock() for more information.
263-
*
264-
* If srcu_read_lock_fast() is ever used on an srcu_struct structure,
265-
* then none of the other flavors may be used, whether before, during,
266-
* or after. Note that grace-period auto-expediting is disabled for _fast
267-
* srcu_struct structures because auto-expedited grace periods invoke
268-
* synchronize_rcu_expedited(), IPIs and all.
269-
*
270-
* Note that srcu_read_lock_fast() can be invoked only from those contexts
271-
* where RCU is watching, that is, from contexts where it would be legal
272-
* to invoke rcu_read_lock(). Otherwise, lockdep will complain.
286+
* smp_mb()-free reader. See srcu_read_lock() for more information. This
287+
* function is NMI-safe, in a manner similar to srcu_read_lock_nmisafe().
288+
*
289+
* For srcu_read_lock_fast() to be used on an srcu_struct structure,
290+
* that structure must have been defined using either DEFINE_SRCU_FAST()
291+
* or DEFINE_STATIC_SRCU_FAST() on the one hand or initialized with
292+
* init_srcu_struct_fast() on the other. Such an srcu_struct structure
293+
* cannot be passed to any non-fast variant of srcu_read_{,un}lock() or
294+
* srcu_{down,up}_read(). In kernels built with CONFIG_PROVE_RCU=y,
295+
* __srcu_check_read_flavor() will complain bitterly if you ignore this
296+
* restriction.
297+
*
298+
* Grace-period auto-expediting is disabled for SRCU-fast srcu_struct
299+
* structures because SRCU-fast expedited grace periods invoke
300+
* synchronize_rcu_expedited(), IPIs and all. If you need expedited
301+
* SRCU-fast grace periods, use synchronize_srcu_expedited().
302+
*
303+
* The srcu_read_lock_fast() function can be invoked only from those
304+
* contexts where RCU is watching, that is, from contexts where it would
305+
* be legal to invoke rcu_read_lock(). Otherwise, lockdep will complain.
273306
*/
274307
static inline struct srcu_ctr __percpu *srcu_read_lock_fast(struct srcu_struct *ssp) __acquires(ssp)
275308
{
276309
struct srcu_ctr __percpu *retval;
277310

278311
RCU_LOCKDEP_WARN(!rcu_is_watching(), "RCU must be watching srcu_read_lock_fast().");
279-
srcu_check_read_flavor_force(ssp, SRCU_READ_FLAVOR_FAST);
312+
srcu_check_read_flavor(ssp, SRCU_READ_FLAVOR_FAST);
280313
retval = __srcu_read_lock_fast(ssp);
281314
rcu_try_lock_acquire(&ssp->dep_map);
282315
return retval;
283316
}
284317

318+
/**
319+
* srcu_read_lock_fast_updown - register a new reader for an SRCU-fast-updown structure.
320+
* @ssp: srcu_struct in which to register the new reader.
321+
*
322+
* Enter an SRCU read-side critical section, but for a light-weight
323+
* smp_mb()-free reader. See srcu_read_lock() for more information.
324+
* This function is compatible with srcu_down_read_fast(), but is not
325+
* NMI-safe.
326+
*
327+
* For srcu_read_lock_fast_updown() to be used on an srcu_struct
328+
* structure, that structure must have been defined using either
329+
* DEFINE_SRCU_FAST_UPDOWN() or DEFINE_STATIC_SRCU_FAST_UPDOWN() on the one
330+
* hand or initialized with init_srcu_struct_fast_updown() on the other.
331+
* Such an srcu_struct structure cannot be passed to any non-fast-updown
332+
* variant of srcu_read_{,un}lock() or srcu_{down,up}_read(). In kernels
333+
* built with CONFIG_PROVE_RCU=y, __srcu_check_read_flavor() will complain
334+
* bitterly if you ignore this * restriction.
335+
*
336+
* Grace-period auto-expediting is disabled for SRCU-fast-updown
337+
* srcu_struct structures because SRCU-fast-updown expedited grace periods
338+
* invoke synchronize_rcu_expedited(), IPIs and all. If you need expedited
339+
* SRCU-fast-updown grace periods, use synchronize_srcu_expedited().
340+
*
341+
* The srcu_read_lock_fast_updown() function can be invoked only from
342+
* those contexts where RCU is watching, that is, from contexts where
343+
* it would be legal to invoke rcu_read_lock(). Otherwise, lockdep will
344+
* complain.
345+
*/
346+
static inline struct srcu_ctr __percpu *srcu_read_lock_fast_updown(struct srcu_struct *ssp)
347+
__acquires(ssp)
348+
{
349+
struct srcu_ctr __percpu *retval;
350+
351+
RCU_LOCKDEP_WARN(!rcu_is_watching(), "RCU must be watching srcu_read_lock_fast_updown().");
352+
srcu_check_read_flavor(ssp, SRCU_READ_FLAVOR_FAST_UPDOWN);
353+
retval = __srcu_read_lock_fast_updown(ssp);
354+
rcu_try_lock_acquire(&ssp->dep_map);
355+
return retval;
356+
}
357+
285358
/*
286359
* Used by tracing, cannot be traced and cannot call lockdep.
287360
* See srcu_read_lock_fast() for more information.
@@ -291,7 +364,7 @@ static inline struct srcu_ctr __percpu *srcu_read_lock_fast_notrace(struct srcu_
291364
{
292365
struct srcu_ctr __percpu *retval;
293366

294-
srcu_check_read_flavor_force(ssp, SRCU_READ_FLAVOR_FAST);
367+
srcu_check_read_flavor(ssp, SRCU_READ_FLAVOR_FAST);
295368
retval = __srcu_read_lock_fast(ssp);
296369
return retval;
297370
}
@@ -305,14 +378,15 @@ static inline struct srcu_ctr __percpu *srcu_read_lock_fast_notrace(struct srcu_
305378
* srcu_down_read() for more information.
306379
*
307380
* The same srcu_struct may be used concurrently by srcu_down_read_fast()
308-
* and srcu_read_lock_fast().
381+
* and srcu_read_lock_fast(). However, the same definition/initialization
382+
* requirements called out for srcu_read_lock_safe() apply.
309383
*/
310384
static inline struct srcu_ctr __percpu *srcu_down_read_fast(struct srcu_struct *ssp) __acquires(ssp)
311385
{
312386
WARN_ON_ONCE(IS_ENABLED(CONFIG_PROVE_RCU) && in_nmi());
313387
RCU_LOCKDEP_WARN(!rcu_is_watching(), "RCU must be watching srcu_down_read_fast().");
314-
srcu_check_read_flavor_force(ssp, SRCU_READ_FLAVOR_FAST);
315-
return __srcu_read_lock_fast(ssp);
388+
srcu_check_read_flavor(ssp, SRCU_READ_FLAVOR_FAST_UPDOWN);
389+
return __srcu_read_lock_fast_updown(ssp);
316390
}
317391

318392
/**
@@ -408,6 +482,23 @@ static inline void srcu_read_unlock_fast(struct srcu_struct *ssp, struct srcu_ct
408482
RCU_LOCKDEP_WARN(!rcu_is_watching(), "RCU must be watching srcu_read_unlock_fast().");
409483
}
410484

485+
/**
486+
* srcu_read_unlock_fast_updown - unregister a old reader from an SRCU-fast-updown structure.
487+
* @ssp: srcu_struct in which to unregister the old reader.
488+
* @scp: return value from corresponding srcu_read_lock_fast_updown().
489+
*
490+
* Exit an SRCU-fast-updown read-side critical section.
491+
*/
492+
static inline void
493+
srcu_read_unlock_fast_updown(struct srcu_struct *ssp, struct srcu_ctr __percpu *scp) __releases(ssp)
494+
{
495+
srcu_check_read_flavor(ssp, SRCU_READ_FLAVOR_FAST_UPDOWN);
496+
srcu_lock_release(&ssp->dep_map);
497+
__srcu_read_unlock_fast_updown(ssp, scp);
498+
RCU_LOCKDEP_WARN(!rcu_is_watching(),
499+
"RCU must be watching srcu_read_unlock_fast_updown().");
500+
}
501+
411502
/*
412503
* Used by tracing, cannot be traced and cannot call lockdep.
413504
* See srcu_read_unlock_fast() for more information.
@@ -431,9 +522,9 @@ static inline void srcu_up_read_fast(struct srcu_struct *ssp, struct srcu_ctr __
431522
__releases(ssp)
432523
{
433524
WARN_ON_ONCE(IS_ENABLED(CONFIG_PROVE_RCU) && in_nmi());
434-
srcu_check_read_flavor(ssp, SRCU_READ_FLAVOR_FAST);
435-
__srcu_read_unlock_fast(ssp, scp);
436-
RCU_LOCKDEP_WARN(!rcu_is_watching(), "RCU must be watching srcu_up_read_fast().");
525+
srcu_check_read_flavor(ssp, SRCU_READ_FLAVOR_FAST_UPDOWN);
526+
__srcu_read_unlock_fast_updown(ssp, scp);
527+
RCU_LOCKDEP_WARN(!rcu_is_watching(), "RCU must be watching srcu_up_read_fast_updown().");
437528
}
438529

439530
/**

include/linux/srcutiny.h

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ struct srcu_struct {
3131

3232
void srcu_drive_gp(struct work_struct *wp);
3333

34-
#define __SRCU_STRUCT_INIT(name, __ignored, ___ignored) \
34+
#define __SRCU_STRUCT_INIT(name, __ignored, ___ignored, ____ignored) \
3535
{ \
3636
.srcu_wq = __SWAIT_QUEUE_HEAD_INITIALIZER(name.srcu_wq), \
3737
.srcu_cb_tail = &name.srcu_cb_head, \
@@ -44,13 +44,25 @@ void srcu_drive_gp(struct work_struct *wp);
4444
* Tree SRCU, which needs some per-CPU data.
4545
*/
4646
#define DEFINE_SRCU(name) \
47-
struct srcu_struct name = __SRCU_STRUCT_INIT(name, name, name)
47+
struct srcu_struct name = __SRCU_STRUCT_INIT(name, name, name, name)
4848
#define DEFINE_STATIC_SRCU(name) \
49-
static struct srcu_struct name = __SRCU_STRUCT_INIT(name, name, name)
49+
static struct srcu_struct name = __SRCU_STRUCT_INIT(name, name, name, name)
50+
#define DEFINE_SRCU_FAST(name) DEFINE_SRCU(name)
51+
#define DEFINE_STATIC_SRCU_FAST(name) \
52+
static struct srcu_struct name = __SRCU_STRUCT_INIT(name, name, name, name)
53+
#define DEFINE_SRCU_FAST_UPDOWN(name) DEFINE_SRCU(name)
54+
#define DEFINE_STATIC_SRCU_FAST_UPDOWN(name) \
55+
static struct srcu_struct name = __SRCU_STRUCT_INIT(name, name, name, name)
5056

5157
// Dummy structure for srcu_notifier_head.
5258
struct srcu_usage { };
5359
#define __SRCU_USAGE_INIT(name) { }
60+
#define __init_srcu_struct_fast __init_srcu_struct
61+
#define __init_srcu_struct_fast_updown __init_srcu_struct
62+
#ifndef CONFIG_DEBUG_LOCK_ALLOC
63+
#define init_srcu_struct_fast init_srcu_struct
64+
#define init_srcu_struct_fast_updown init_srcu_struct
65+
#endif // #ifndef CONFIG_DEBUG_LOCK_ALLOC
5466

5567
void synchronize_srcu(struct srcu_struct *ssp);
5668

@@ -93,6 +105,17 @@ static inline void __srcu_read_unlock_fast(struct srcu_struct *ssp, struct srcu_
93105
__srcu_read_unlock(ssp, __srcu_ptr_to_ctr(ssp, scp));
94106
}
95107

108+
static inline struct srcu_ctr __percpu *__srcu_read_lock_fast_updown(struct srcu_struct *ssp)
109+
{
110+
return __srcu_ctr_to_ptr(ssp, __srcu_read_lock(ssp));
111+
}
112+
113+
static inline
114+
void __srcu_read_unlock_fast_updown(struct srcu_struct *ssp, struct srcu_ctr __percpu *scp)
115+
{
116+
__srcu_read_unlock(ssp, __srcu_ptr_to_ctr(ssp, scp));
117+
}
118+
96119
static inline void synchronize_srcu_expedited(struct srcu_struct *ssp)
97120
{
98121
synchronize_srcu(ssp);
@@ -103,8 +126,8 @@ static inline void srcu_barrier(struct srcu_struct *ssp)
103126
synchronize_srcu(ssp);
104127
}
105128

129+
static inline void srcu_expedite_current(struct srcu_struct *ssp) { }
106130
#define srcu_check_read_flavor(ssp, read_flavor) do { } while (0)
107-
#define srcu_check_read_flavor_force(ssp, read_flavor) do { } while (0)
108131

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

0 commit comments

Comments
 (0)