On Thu, Nov 21, 2024 at 7:23 AM Peter Zijlstra <peterz@xxxxxxxxxxxxx> wrote: > > On Thu, Nov 21, 2024 at 03:44:42PM +0100, Peter Zijlstra wrote: > > > But perhaps it makes even more sense to add this functionality to > > seqcount itself. The same argument can be made for seqcount_mutex and > > seqcount_rwlock users. > > Something like so I suppose. Ok, let me put this all together. Thanks! > > --- > diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h > index 5298765d6ca4..102afdf8c7db 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 > + * > + * Very like 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