48 lines
712 B
C
48 lines
712 B
C
#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
|