| #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 |