- 论坛徽章:
- 0
|
本帖最后由 ruslin 于 2011-10-14 10:41 编辑
回复 15# kouu
>>>>关于LZ举的例子,我在2.6.35的代码里面没有看到readl有volatile变量呀~
比如我说的例子。
while ((--i > 0) &&
(readl(sport->port.membase + URXD0) & URXD_CHARRDY)) {
barrier();
}
看readl的实现(31,35代码都一样):
#define readl(addr) __le32_to_cpu(__raw_readl(addr))
static inline u32 __raw_readl(const volatile void __iomem *addr)
{
return *(const volatile u32 __force *) addr;
}
明显readl访问的是volatile型变量。
---------------------------------------------------------------------------------
对于preempt_disable为什么用barrier,其实跟我发的主题意思一样,起得优化屏障的第二个作用,防止编译器寄存器优化它后面的代码。原因,其他cpu不会访问到这个count(每核心进程相关的thread_info,多线程它们的thread_info也不一样),没有必要处理顺序一致行问题所以没有用内存屏障。
#define preempt_disable() \
do { \
inc_preempt_count(); \
barrier(); \
} while (0)
---------------------------------------------------------------------------------
如果对于一段普通代码,编译器优化后,重新排列指令就会导致问题?我目前还么有想出这样的例子来。
总之,仍然没有解决我的疑惑。 |
|