t/zbd: avoid test case 31 failure with small devices
[fio.git] / lib / seqlock.h
CommitLineData
c6bb62bc
JA
1#ifndef FIO_SEQLOCK_H
2#define FIO_SEQLOCK_H
3
64dbaa7e 4#include "types.h"
c6bb62bc
JA
5#include "../arch/arch.h"
6
7struct seqlock {
33ab6905
KC
8#ifdef __cplusplus
9 std::atomic<unsigned int> sequence;
10#else
ecba19b6 11 volatile unsigned int sequence;
33ab6905 12#endif
c6bb62bc
JA
13};
14
15static inline void seqlock_init(struct seqlock *s)
16{
17 s->sequence = 0;
18}
19
20static inline unsigned int read_seqlock_begin(struct seqlock *s)
21{
22 unsigned int seq;
23
24 do {
5fa0c063 25 seq = atomic_load_acquire(&s->sequence);
c6bb62bc
JA
26 if (!(seq & 1))
27 break;
28 nop;
29 } while (1);
30
c6bb62bc
JA
31 return seq;
32}
33
34static inline bool read_seqlock_retry(struct seqlock *s, unsigned int seq)
35{
36 read_barrier();
37 return s->sequence != seq;
38}
39
40static inline void write_seqlock_begin(struct seqlock *s)
41{
5fa0c063 42 s->sequence = atomic_load_acquire(&s->sequence) + 1;
c6bb62bc
JA
43}
44
45static inline void write_seqlock_end(struct seqlock *s)
46{
5fa0c063 47 atomic_store_release(&s->sequence, s->sequence + 1);
c6bb62bc
JA
48}
49
50#endif