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()。