- 论坛徽章:
- 0
|
回复 10# chishanmingshen
应该说我原来的理解有误,barrier函数本身只实现了编译器内存屏障,rmb、wmb 、mb函数则既保证了cpu指令顺序执行也保证了编译器不优化,是barrier函数的超集
其实现在各个架构对这几个函数都已经做了实现,如x86使用的是mfence、lfence、sfence指令- #ifdef CONFIG_X86_32
- /*
- * Some non-Intel clones support out of order store. wmb() ceases to be a
- * nop for these.
- */
- #define mb() alternative("lock; addl $0,0(%%esp)", "mfence", X86_FEATURE_XMM2)
- #define rmb() alternative("lock; addl $0,0(%%esp)", "lfence", X86_FEATURE_XMM2)
- #define wmb() alternative("lock; addl $0,0(%%esp)", "sfence", X86_FEATURE_XMM)
- #else
- #define mb() asm volatile("mfence":::"memory")
- #define rmb() asm volatile("lfence":::"memory")
- #define wmb() asm volatile("sfence" ::: "memory")
- #endif
复制代码 arm使用的是isb、dsb、dmb指令
- #ifdef CONFIG_ARCH_HAS_BARRIERS
- #include <mach/barriers.h>
- #elif __LINUX_ARM_ARCH__ >= 7 || defined(CONFIG_SMP)
- #define mb() do { dsb(); outer_sync(); } while (0)
- #define rmb() dmb()
- #define wmb() mb()
- #else
- #define mb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0)
- #define rmb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0)
- #define wmb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0)
- #endif
复制代码- #if __LINUX_ARM_ARCH__ >= 7
- #define isb() __asm__ __volatile__ ("isb" : : : "memory")
- #define dsb() __asm__ __volatile__ ("dsb" : : : "memory")
- #define dmb() __asm__ __volatile__ ("dmb" : : : "memory")
复制代码 楼主的原意应该是为什么不在preempt_enable时使用mb()函数,而使用只保证了编译器不优化的函数barrier()函数,对于这一点,我现在也没想明白。。。
|
|