请教关于内存屏障的问题(Linux内核Seq锁实现的代码)

最近学习Linux内核,有以下疑问,请教一下,各位大牛:

static inline void write_seqlock(seqlock_t *sl)
{
        spin_lock(&sl->lock);
        ++sl->sequence;
        smp_wmb(); //这里好理解,++sl->sequence 不会被重排,即smp_wmb之后一定加操作一定执行了。
}

static inline void write_sequnlock(seqlock_t *sl)
{
        smp_wmb(); //但是这里的smp_wmb有什么作用??好像没什么意义
        sl->sequence++;
        spin_unlock(&sl->lock);
}

static inline int write_tryseqlock(seqlock_t *sl)
{
        int ret = spin_trylock(&sl->lock);

        if (ret) {
                ++sl->sequence;
                smp_wmb();
        }
        return ret;
}

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

        return ret;
}

static __always_inline int read_seqretry(const seqlock_t *sl, unsigned start)
{
        smp_rmb(); //这里也是???

        return (sl->sequence != start);
}

作者: zjh2005456   发布时间: 2011-02-24

都是保护多个处理器间lock和unlock间的读写的,倒和那个++没什么关系
代码的串行由SPINLOCK保护,但读写的延迟执行却是不确定的,使用屏障后,配合LOCK让其独立完成在LOCK中

作者: smalloc   发布时间: 2011-02-24