membarrier() 系统调用¶
MEMBARRIER_CMD_{PRIVATE,GLOBAL}_EXPEDITED - 架构要求¶
更新 rq->curr 之前的内存屏障¶
命令 MEMBARRIER_CMD_PRIVATE_EXPEDITED 和 MEMBARRIER_CMD_GLOBAL_EXPEDITED 要求每个架构在从用户空间返回后、更新 rq->curr 之前,具有完整的内存屏障。此屏障由 __schedule() 中的 rq_lock(); smp_mb__after_spinlock() 序列隐含。该屏障与 membarrier_{private,global}_expedited() 附近的 membarrier 系统调用出口处的完整屏障匹配。
更新 rq->curr 之后的内存屏障¶
命令 MEMBARRIER_CMD_PRIVATE_EXPEDITED 和 MEMBARRIER_CMD_GLOBAL_EXPEDITED 要求每个架构在更新 rq->curr 之后、返回用户空间之前,具有完整的内存屏障。在各种架构上提供此屏障的方案如下。
alpha、arc、arm、hexagon、mips 依赖于 finish_lock_switch() 中的 spin_unlock() 隐含的完整屏障。
arm64 依赖于 switch_to() 隐含的完整屏障。
powerpc、riscv、s390、sparc、x86 依赖于 switch_mm() 隐含的完整屏障(如果 mm 不为 NULL);否则,它们依赖于 mmdrop() 隐含的完整屏障。在 powerpc 和 riscv 上,switch_mm() 依赖于 membarrier_arch_switch_mm()。
该屏障与 membarrier_{private,global}_expedited() 附近的 membarrier 系统调用入口处的完整屏障匹配。