Changed signedness of seqlock.sequence fixing comparison-warning
[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 {
ecba19b6 8 volatile unsigned int sequence;
c6bb62bc
JA
9};
10
11static inline void seqlock_init(struct seqlock *s)
12{
13 s->sequence = 0;
14}
15
16static inline unsigned int read_seqlock_begin(struct seqlock *s)
17{
18 unsigned int seq;
19
20 do {
5fa0c063 21 seq = atomic_load_acquire(&s->sequence);
c6bb62bc
JA
22 if (!(seq & 1))
23 break;
24 nop;
25 } while (1);
26
c6bb62bc
JA
27 return seq;
28}
29
30static inline bool read_seqlock_retry(struct seqlock *s, unsigned int seq)
31{
32 read_barrier();
33 return s->sequence != seq;
34}
35
36static inline void write_seqlock_begin(struct seqlock *s)
37{
5fa0c063 38 s->sequence = atomic_load_acquire(&s->sequence) + 1;
c6bb62bc
JA
39}
40
41static inline void write_seqlock_end(struct seqlock *s)
42{
5fa0c063 43 atomic_store_release(&s->sequence, s->sequence + 1);
c6bb62bc
JA
44}
45
46#endif