요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
rq->curr 갱신 전 barrier
membarrier.rst:10-19Context switch가 rq->curr을 새 task로 바꾸기 전에 이전 user-space memory access가 충분히 ordering되어야 합니다. Architecture switch path가 이 순서를 약하게 만들면 membarrier caller가 CPU를 놓치거나 barrier 이전 access가 뒤로 새어 나갈 수 있습니다.
rq->curr 갱신 후 barrier
membarrier.rst:20-40새 task를 rq->curr에 publish한 뒤 그 task가 user space로 돌아가 memory access를 시작하기 전에도 ordering이 필요합니다. membarrier가 current 관찰과 IPI를 완료했는데 새 task access가 barrier 앞쪽으로 보이면 API의 address-space fence가 깨집니다.
새 architecture context-switch code는 register save/restore만 검증해서는 안 됩니다. switch_mm, rq->curr publication과 return-to-user barrier contract를 함께 확인해야 합니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
.. SPDX-License-Identifier: GPL-2.0
========================
membarrier() System Call
========================
MEMBARRIER_CMD_{PRIVATE,GLOBAL}_EXPEDITED - Architecture requirements
=====================================================================
Memory barriers before updating rq->curr
----------------------------------------
The commands MEMBARRIER_CMD_PRIVATE_EXPEDITED and MEMBARRIER_CMD_GLOBAL_EXPEDITED
require each architecture to have a full memory barrier after coming from
user-space, before updating rq->curr. This barrier is implied by the sequence
rq_lock(); smp_mb__after_spinlock() in __schedule(). The barrier matches a full
barrier in the proximity of the membarrier system call exit, cf.
membarrier_{private,global}_expedited().
Memory barriers after updating rq->curr
---------------------------------------
The commands MEMBARRIER_CMD_PRIVATE_EXPEDITED and MEMBARRIER_CMD_GLOBAL_EXPEDITED
require each architecture to have a full memory barrier after updating rq->curr,
before returning to user-space. The schemes providing this barrier on the various
architectures are as follows.
- alpha, arc, arm, hexagon, mips rely on the full barrier implied by
spin_unlock() in finish_lock_switch().
- arm64 relies on the full barrier implied by switch_to().
- powerpc, riscv, s390, sparc, x86 rely on the full barrier implied by
switch_mm(), if mm is not NULL; they rely on the full barrier implied
by mmdrop(), otherwise. On powerpc and riscv, switch_mm() relies on
membarrier_arch_switch_mm().
The barrier matches a full barrier in the proximity of the membarrier system call
entry, cf. membarrier_{private,global}_expedited().
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
rq->curr 갱신 전 memory barrier
1-17membarrier() system call의 MEMBARRIER_CMD_PRIVATE_EXPEDITED와 MEMBARRIER_CMD_GLOBAL_EXPEDITED command는 각 architecture가 user space에서 돌아온 뒤 rq->curr를 갱신하기 전에 full memory barrier를 수행하도록 요구한다.
이 barrier는 __schedule()의 rq_lock(); smp_mb__after_spinlock() 순서에 의해 암묵적으로 제공된다. 이 barrier는 membarrier_{private,global}_expedited()에서 membarrier system call을 빠져나가는 지점 가까이에 있는 full barrier와 짝을 이룬다.
rq->curr 갱신 후 memory barrier
19-39같은 두 expedited command는 rq->curr를 갱신한 뒤 user space로 돌아가기 전에도 각 architecture가 full memory barrier를 제공하도록 요구한다. Architecture별 제공 방식은 다음과 같다.
- alpha, arc, arm, hexagon, mips는 finish_lock_switch()의 spin_unlock()이 암묵적으로 제공하는 full barrier에 의존한다.
- arm64는 switch_to()가 암묵적으로 제공하는 full barrier에 의존한다.
- powerpc, riscv, s390, sparc, x86은 mm이 NULL이 아니면 switch_mm()이 제공하는 full barrier에 의존하고, mm이 NULL이면 mmdrop()이 제공하는 full barrier에 의존한다.
- powerpc와 riscv에서 switch_mm()은 membarrier_arch_switch_mm()에 의존한다.
이 barrier는 membarrier_{private,global}_expedited()에서 membarrier system call에 진입하는 지점 가까이에 있는 full barrier와 짝을 이룬다.
User-space address-space barrier의 scheduler 의존성
membarrier.rst:4-9MEMBARRIER_CMD_PRIVATE_EXPEDITED와 GLOBAL_EXPEDITED는 대상 task가 실행 중인 CPU에 barrier를 강제하여 user-space memory reclamation과 JIT code publication 같은 protocol을 지원합니다. Kernel은 각 runqueue의 current task를 보고 어떤 CPU가 대상 mm을 실행하는지 판단합니다.