免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3861 | 回复: 5
打印 上一主题 下一主题

请教关于内存屏障的问题(Linux内核Seq锁实现的代码) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-24 23:08 |只看该作者 |倒序浏览
最近学习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);
}

论坛徽章:
0
2 [报告]
发表于 2011-02-25 01:22 |只看该作者
可以参考下这篇BLOG,讲内存屏障的。

http://blogold.chinaunix.net/u3/93713/showart_2061476.html

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
3 [报告]
发表于 2011-02-25 08:18 |只看该作者
是不是因为这不是一个普通的函数,是一个static inline的,就相当于是宏一样直接插入代码的。所以要用屏障,而不是像普通函数一样通过call调用的。

论坛徽章:
0
4 [报告]
发表于 2011-02-25 22:52 |只看该作者
回复 2# accessory


   你好!

    感觉也没法说清楚write_sequnlock里面的smp_wmb,及read_seqretry里面的smp_rmb,究竟要保证什么~~~

    按照内存屏障的意义,这里要保证的只是sl->sequence,如果正确使用write_seqlock及write_sequnlock, 那么write_sequnlock中的smp_wmb
    就完全没有必要了。因为lock与unlock之间两没有对sl->sequence的操作了。

    所以, 我怀疑是不是防止用户不使用Seq锁函数,直接操作sl->sequence,从而导致问题?

论坛徽章:
0
5 [报告]
发表于 2011-02-26 01:25 |只看该作者
我觉得INLINE 是有关系。

同意这个: “防止用户不使用Seq锁函数,直接操作sl->sequence,从而导致问题”

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
6 [报告]
发表于 2011-02-26 08:05 |只看该作者
内存屏障就是防止代码重排嘛。既然一个函数内的开始和结束当然不需要用内存屏障防止了。

所以我觉得,因为这个是static inline,其作用等价与宏。
所以要用内存屏障防止重排
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP