typedef struct {
// unsigned sequence;
unsigned int sequence;
spinlock_t lock;
} seqlock_t;
#define seqlock_init(x) \
do { \
(x)->sequence = 0; \
// spin_lock_init(&(x)->lock);
pinlock_check(_lock); \
// raw_spin_lock_init(&(_lock)->rlock);
*(lock) = __RAW_SPIN_LOCK_UNLOCKED(lock);
} while (0)
static inline void write_seqlock(seqlock_t *sl) {
// 获取自旋锁
spin_lock(&sl->lock);
// 流水号 +1
++sl->sequence;
// cpu屏障,使得指令无法乱序
// smp_wmb();
__asm__ __volatile__("" ::: "memory")
}
static inline void write_sequnlock(seqlock_t *sl) {
// cpu 指令屏障
// smp_wmb();
__asm__ __volatile__("" ::: "memory")
// 流水号 +1
sl->sequence++;
// 自旋锁解锁
spin_unlock(&sl->lock);
}
static __always_inline unsigned read_seqbegin(const seqlock_t *sl) {
unsigned ret;
repeat:
// 获取当前流水号
ret = sl->sequence;
// 指令屏障
smp_rmb();
// 奇数说明写上锁了
if (unlikely(ret & 1)) {
cpu_relax();
goto repeat;
}
// 可以read了,并返回流水号
return ret;
}
static __always_inline int read_seqretry(const seqlock_t *sl, unsigned start) {
// cpu指令屏障
smp_rmb();
// 流水号不一致
return unlikely(sl->sequence != start);
}