sync seqlock - ceragon/LinuxDoc GitHub Wiki

seqlock

结构体

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)

write lock

static inline void write_seqlock(seqlock_t *sl) {
    // 获取自旋锁
	spin_lock(&sl->lock);
    // 流水号 +1
	++sl->sequence;
    
    // cpu屏障,使得指令无法乱序
//	smp_wmb();
    __asm__ __volatile__("" ::: "memory")
}

write unlock

static inline void write_sequnlock(seqlock_t *sl) {
    // cpu 指令屏障
//	smp_wmb();
    __asm__ __volatile__("" ::: "memory")
    // 流水号 +1
	sl->sequence++;
    // 自旋锁解锁
	spin_unlock(&sl->lock);
}

read begin

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;
}

read retry

static __always_inline int read_seqretry(const seqlock_t *sl, unsigned start) {
    // cpu指令屏障
	smp_rmb();
    // 流水号不一致
	return unlikely(sl->sequence != start);
}
⚠️ **GitHub.com Fallback** ⚠️