免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: lyl19
打印 上一主题 下一主题

[硬件及驱动] ARMv7中CONFIG_ARM_DMA_MEM_BUFFERABLE的疑问 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2014-03-14 17:15 |显示全部楼层
回复 26# asuka2001


    同意你的观点,dsb不仅是保证顺序,还要保证完成性。

论坛徽章:
0
12 [报告]
发表于 2014-03-14 17:23 |显示全部楼层
回复 25# asuka2001

好,那我们先解决这个问题。
我确实也有看到说,一块内存要是被映射成两个不同的属性,则会出问题,会丢掉一些属性啥的。

但从目前的映射来看,这块内存被映射的是device或者strong order,它也没出什么问题啊。

另外,arm-linux-gcc, 请再查看一下,你的映射关系好像弄错了。

Thanks



   

论坛徽章:
0
13 [报告]
发表于 2014-03-14 17:56 |显示全部楼层
本帖最后由 lyl19 于 2014-03-14 17:56 编辑

Happy weekend guys, thanks for the help all the time.

Thanks

论坛徽章:
0
14 [报告]
发表于 2014-03-16 23:04 |显示全部楼层
回复 33# arm-linux-gcc


    我没有改这个,感觉改动太大了,要改我也是会改那块内存的映射关系, 我修改过使用device和strong order在都不带barrier的情况下跑throughput都正常,当然这里跑得正常并不能说就是正确的,也有可能是在这种场合下没有发生。

   另外我有个疑问:
  
“所以device memory时,iowrite32和writel的定义中的__iowmb的实际定义为dsb,这个dsb可以保证write buffer中的数据完全写入内存之后再执行后面的指令,
也就是打开CONFIG_ARM_DMA_MEM_BUFFERABLE时屏障是不能少的,否则数据可能还在write buffer中;
而strong order时,__iowmb是个空定义,因为uncache+unbuffer,不经过write buffer,所以此时无需dsb。”

device memory和strong order有bufferable的区别,然后决定了是否需要dsb,我觉得这个很重要,这个观点你确定吗,是在哪里看到的,能否帮忙指出来一下,反正在DDI0406C_arm_architecture_reference_manual没有说明device和strong order有bufferable的区别。


Thanks

论坛徽章:
0
15 [报告]
发表于 2014-03-17 21:11 |显示全部楼层
谢谢你的回复。

"strong-order是不需要dsb的,因为不走write buffer经过;而device是需要dsb的", 这个你有印象吗,我有发下如下语句

spec中提到:
The only architecturally-required difference between Device and Strongly-ordered memory is that:
•a write to Strongly-ordered memory can complete only when it reaches the peripheral or memory component
accessed by the write
•a write to Device memory is permitted to complete before it reaches the peripheral or memory component
accessed by the write.

还有,为什么kernel都定义好的东西,我们这边还要修改它,是承认它有错误吗?
我查看了其它我们客户的SDK, 它们在ARM_DMA_MEM_BUFFERABLE使能的情况下,都是strong order并且barrier是使能的,所以我感觉这里的设置是没有问题的,不可能这些大厂商的SDK在这一块都出问题了吧。

Thanks

论坛徽章:
0
16 [报告]
发表于 2014-03-18 17:09 |显示全部楼层
回复 37# arm-linux-gcc


    Hi arm-linux-gcc

Appreciate your explanation,you are excellent.

看了看cpu_v7_set_pte_ext,真是感觉拔云见日了, 真是没想到set_pte_ext是去设置linux pte而不是h/w pte。
所以说,通过linux pte到h/w pte映射,我们得到了如下映射

如果是以uncached去设置页表,(TEX,C,B)=(0,0,0), 这对应的是strong order,所以说IO操作不需要barrier
如果是以bufferable去设置页表,(TXE, C,B)=(0,0,1), 这对应的是normal+noncache, 所以说IO操作必须有barrier

这也是前面askua说bufferable应该映射成normal的原因,以及为什么我把ARM_DMA_MEM_BUFFERABLE关掉后,性能变差的原因(访问strong order显然比normal要消耗多),同时也说明了我在ARM_DMA_MEM_BUFFERABLE打开的情况下,把barrier关掉是危险的,虽然性能得到提升,但其实只是问题没有发生罢了。

其实还不太想结贴,我还有两个疑问。
1. 如askua前面所说的,在DDI0406C文档中3.5.7节,
    “A physical memory location is accessed with mismatched attributes if all accesses to the location do not use a
common definition of all of the following attributes of that location..., 后面是这样操作的危害”
   如果我们使用strong order,那这里会不会有这个危险,因为最开始所有的内存在map_low的时候,都会被映射成normal,现在同样这段内存,我们又要映射成strong order,物理内存一样,不同的只是虚存而已,会不会存在这个问题呢?

2. 还是前面说的那个,在取消ARM_DMA_MEM_BUFFERABLE的情况下,IO操作将不带barrier, 在A3.8DDI0406C文档, Figure A3-5,明确说明对于normal, strong order的两个指令,不能保证其顺序性。
   我们在driver中,如果有如下指令
   int A=XX;
   A=LOAD(addr1).        //从normal内存中读出index, A=YY
  //rmb();
     write32(addr2, A).   //把这个index写入外设中,strong order类型memory。

我们知道现在write32已经不带有barrier了,那这里的rmb是不是也应该必须呢?不然会不会出现把XX而不是YY写入到外设中的情况呢?

Thanks


论坛徽章:
0
17 [报告]
发表于 2014-03-18 22:10 |显示全部楼层
本帖最后由 lyl19 于 2014-03-18 22:20 编辑

回复 39# asuka2001

谢谢你的回复。
第一个问题,也就是说ARMv6以后的,就一定要把这个宏使能了,现在能懂你的意思了。

之所以问第二个问题,是因为前一段时间看了很多的多CPU之间使用barrier同步的问题(smp_mb..),所以给我一个印象是指令间都是有可能乱序的,除了ARM spec提到的address dependency和control dependency。
然后你这里说了一个data dependency, 为什么ARM spec没有提到这一点,这个是一个最基本的保证吗?

Thanks

论坛徽章:
0
18 [报告]
发表于 2014-03-19 15:50 |显示全部楼层
回复 41# asuka2001


    理解了,多谢。
    谢谢两位的回复,结贴。
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP