* Suren Baghdasaryan <surenb@xxxxxxxxxx> [241121 11:28]: > Add raw_seqcount_try_begin() to opens a read critical section of the given > seqcount_t if the counter is even. This enables eliding the critical > section entirely if the counter is odd, instead of doing the speculation > knowing it will fail. > > Suggested-by: Peter Zijlstra <peterz@xxxxxxxxxxxxx> > Signed-off-by: Suren Baghdasaryan <surenb@xxxxxxxxxx> Reviewed-by: Liam R. Howlett <Liam.Howlett@xxxxxxxxxx> > --- > Applies over Linus' ToT > > include/linux/seqlock.h | 22 ++++++++++++++++++++++ > 1 file changed, 22 insertions(+) > > diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h > index 5298765d6ca4..22c2c48b4265 100644 > --- a/include/linux/seqlock.h > +++ b/include/linux/seqlock.h > @@ -318,6 +318,28 @@ SEQCOUNT_LOCKNAME(mutex, struct mutex, true, mutex) > __seq; \ > }) > > +/** > + * raw_seqcount_try_begin() - begin a seqcount_t read critical section > + * w/o lockdep and w/o counter stabilization > + * @s: Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants > + * > + * Similar to raw_seqcount_begin(), except it enables eliding the critical > + * section entirely if odd, instead of doing the speculation knowing it will > + * fail. > + * > + * Useful when counter stabilization is more or less equivalent to taking > + * the lock and there is a slowpath that does that. > + * > + * If true, start will be set to the (even) sequence count read. > + * > + * Return: true when a read critical section is started. > + */ > +#define raw_seqcount_try_begin(s, start) \ > +({ \ > + start = raw_read_seqcount(s); \ > + !(start & 1); \ > +}) > + > /** > * raw_seqcount_begin() - begin a seqcount_t read critical section w/o > * lockdep and w/o counter stabilization > > base-commit: 43fb83c17ba2d63dfb798f0be7453ed55ca3f9c2 > -- > 2.47.0.338.g60cca15819-goog >