免费注册 查看新帖 |

Chinaunix

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

内核同步,优化内存屏障问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-12 19:25 |只看该作者 |倒序浏览
本帖最后由 ruslin 于 2011-10-12 19:29 编辑

沉寂cu多年,最近整理了一下内核同步相关的知识,还没有看完,整理的文档先放出来大家共享一下。
有些问题请教一下cu的高手。
优化屏障 barrier 到底啥作用。内核中用了很多,但是想不通为什么要这样用。
比如:
        while (clps_readl(SYSFLG(port)) & SYSFLG_UTXFF)
                barrier();
       
while ((--i > 0) &&
            (readl(sport->port.membase + URXD0) & URXD_CHARRDY)) {
                barrier();
        }

我的理解是,由于readl系列指令本身已经取的volatile变量,所以没有必要再来防止寄存器优化了。这里主要是一个空操作把。

kernel-synchronization.rar

31.51 KB, 下载次数: 125

评分

参与人数 1可用积分 +8 收起 理由
Godbach + 8 感谢分享

查看全部评分

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2011-10-12 20:00 |只看该作者
支持一下

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2011-10-12 21:26 |只看该作者
回复 1# ruslin

感谢 LZ 分享

论坛徽章:
0
4 [报告]
发表于 2011-10-13 09:00 |只看该作者
顶一下。

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
5 [报告]
发表于 2011-10-13 09:14 |只看该作者
非常感谢!

论坛徽章:
0
6 [报告]
发表于 2011-10-13 10:04 |只看该作者
回复 1# ruslin

这是一个compiler barrier,是为了防止gcc优化,对cpu没什么影响。

这是Documentation/memory-barriers.txt的解释:

COMPILER BARRIER
----------------

The Linux kernel has an explicit compiler barrier function that prevents the
compiler from moving the memory accesses either side of it to the other side:

        barrier();

This is a general barrier - lesser varieties of compiler barrier do not exist.

The compiler barrier has no direct effect on the CPU, which may then reorder
things however it wishes.

论坛徽章:
0
7 [报告]
发表于 2011-10-13 11:33 |只看该作者
本帖最后由 ruslin 于 2011-10-13 11:43 编辑

回复 6# eexplorer


感谢回复。

这些资料我也看过,我的理解是优化屏障barrier共有两个作用,1个是防止编译器重新排列指令顺序(但是不能防止cpu乱序执行)。第二个是防止寄存器优化。

如果在代码中用barrier宏想做第一个作用的来的话,肯定是不行的。(必须内存屏障才有这个能力)
所以,我绝的代码中的barrier宏都是想要做第二个作用来的。不知道对否?就我举得例子来说,编译器也不会去用寄存器优化的,为什么还要用barrier呢?

或许barrier宏很多地方就是一个空操作的作用吗???


还有,即使维护内核代码的同志可能也有不太清楚为什么要用barrier的?比如include/net/dst.h:
static inline u32 dst_mtu(const struct dst_entry *dst)
{
        u32 mtu = dst_metric(dst, RTAX_MTU);
        /*
         * Alexey put it here, so ask him about it
         */
        barrier();
        return mtu;
}

论坛徽章:
0
8 [报告]
发表于 2011-10-13 12:27 |只看该作者
回复 7# ruslin

> 如果在代码中用barrier宏想做第一个作用的来的话,肯定是不行的。(必须内存屏障才有这个能力)

我想这里barrier()就是这个作用,compiler在编译优化的时候是可以move指令的,只要这个move在单cpu上运行的结果是一样的就行了。
有了barrier()就可以告诉compiler不要在编译的时候move memory access的指令越过这个barrier().

memory barrier是cpu在执行compiler编译好的指令时发生作用,不能out of order执行一些memory access指令。

论坛徽章:
0
9 [报告]
发表于 2011-10-13 13:01 |只看该作者
本帖最后由 ruslin 于 2011-10-13 15:31 编辑

回复 8# eexplorer


我还是有点疑惑。
现在就假设是在up上。加了barrier宏使编译器没有重新排序指令,但是cpu还是乱序执行了,那么加了barrier和不加barrier对最终的执行效果不是一样的吗。为什么不去掉,多此一举呢。所以barrier应该是有它的其他意义的吧。

能不能就用实际的代码例子来解释吧,比如说把barrier去了可能会导致怎样的后果。本人愚笨,这样我会比较容易理解一点{:3_193:} 。

论坛徽章:
0
10 [报告]
发表于 2011-10-13 17:54 |只看该作者
mark!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP