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 系统调用退出附近的完整屏障匹配,参见 membarrier_{private,global}_expedited()。

更新 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 系统调用入口附近的完整屏障匹配,参见 membarrier_{private,global}_expedited()。