From: Jens Axboe Date: Wed, 26 Apr 2017 20:20:21 +0000 (-0600) Subject: seqlock: add simple user space code for sequence locks X-Git-Tag: fio-2.20~34 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=c6bb62bc0140d7e5dd90481420cdc40dd9955225;hp=10c37df111032901e790cd57e7df43a42edd8ba8;ds=sidebyside seqlock: add simple user space code for sequence locks Signed-off-by: Jens Axboe --- diff --git a/lib/seqlock.h b/lib/seqlock.h new file mode 100644 index 00000000..1ac1eb6b --- /dev/null +++ b/lib/seqlock.h @@ -0,0 +1,48 @@ +#ifndef FIO_SEQLOCK_H +#define FIO_SEQLOCK_H + +#include "../arch/arch.h" + +struct seqlock { + volatile int sequence; +}; + +static inline void seqlock_init(struct seqlock *s) +{ + s->sequence = 0; +} + +static inline unsigned int read_seqlock_begin(struct seqlock *s) +{ + unsigned int seq; + + do { + seq = s->sequence; + if (!(seq & 1)) + break; + nop; + } while (1); + + read_barrier(); + return seq; +} + +static inline bool read_seqlock_retry(struct seqlock *s, unsigned int seq) +{ + read_barrier(); + return s->sequence != seq; +} + +static inline void write_seqlock_begin(struct seqlock *s) +{ + s->sequence++; + write_barrier(); +} + +static inline void write_seqlock_end(struct seqlock *s) +{ + write_barrier(); + s->sequence++; +} + +#endif