[问题] barrier相关问题

楼主: loach98 (银货两讫)   2016-07-12 15:04:21
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
Linux-3.18 @ ARMv8 CPU
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
X
问题(Question):
大家好, 最近在研究barrier, 搜寻之后好像没找到相近的讨论串, 想请教一点问题..
在linux-3.18/arch/arm64/include/asm/io.h里面
看到它对readl/writel的定义:
/*
* I/O memory access primitives. Reads are ordered relative to any
* following Normal memory access. Writes are ordered relative to any prior
* Normal memory access.
*/
#define readl(c) ({ u32 __v = readl_relaxed(c); __iormb(); __v; })
#define writel(v,c) ({ __iowmb(); writel_relaxed((v),(c)); })
readl这边感觉比较好理解, 在__v承接readl_relaxed的return value之后,
卡一个read的barrier, 然后才return __v出来,
所以能确保最后的__v真的是得到从最后一级所传回来的data
(假设中间的interconnect不会提前做response或把自己cache里的东西传回来)
但是writel这边, 它在执行writel_relaxed之前就先卡了个write barrier,
那我在呼叫这个macro之后,
也只能确保这个write被执行之前, 前面的write跟这个write是区隔开的,
但是不能确保这个write已经被执行完成了, 不是吗?
这边我越看越觉得困惑...
发文若有不妥恳请提醒, 也恳请大大帮忙解惑, 感激
作者: withoutshine (何必帮别人想那么多)   2016-07-12 21:30:00
writel的barrier应该是为了保证v,c 的assign 出现在writel_relaxed之前
作者: yvb   2016-07-20 14:49:00
kernel Documentation/memory-barriers.txt

Links booklink

Contact Us: admin [ a t ] ucptt.com