- 论坛徽章:
- 0
|
最近学习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);
} |
|