From: Ahmed S. Darwish Date: Mon, 20 Jul 2020 15:55:12 +0000 (+0200) Subject: seqlock: Implement raw_seqcount_begin() in terms of raw_read_seqcount() X-Git-Tag: v5.9-rc1~203^2~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=932e46365226324d2cf26d8bdec8b51ceb296948;p=thirdparty%2Flinux.git seqlock: Implement raw_seqcount_begin() in terms of raw_read_seqcount() raw_seqcount_begin() has the same code as raw_read_seqcount(), with the exception of masking the sequence counter's LSB before returning it to the caller. Note, raw_seqcount_begin() masks the counter's LSB before returning it to the caller so that read_seqcount_retry() can fail if the counter is odd -- without the overhead of an extra branching instruction. Signed-off-by: Ahmed S. Darwish Signed-off-by: Peter Zijlstra (Intel) Link: https://lkml.kernel.org/r/20200720155530.1173732-7-a.darwish@linutronix.de --- diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h index 85fb3ac93ffb0..e885702d8b827 100644 --- a/include/linux/seqlock.h +++ b/include/linux/seqlock.h @@ -199,10 +199,11 @@ static inline unsigned raw_read_seqcount(const seqcount_t *s) */ static inline unsigned raw_seqcount_begin(const seqcount_t *s) { - unsigned ret = READ_ONCE(s->sequence); - smp_rmb(); - kcsan_atomic_next(KCSAN_SEQLOCK_REGION_MAX); - return ret & ~1; + /* + * If the counter is odd, let read_seqcount_retry() fail + * by decrementing the counter. + */ + return raw_read_seqcount(s) & ~1; } /**