← Documents Documentation/scheduler/membarrier.rst GitHub 원문 ↗

Linux 6.18.37 · Scheduler

membarrier와 scheduler rq->curr ordering

Expedited membarrier가 context switch의 rq->curr 갱신 전후 architecture memory barrier에 의존하는 이유를 설명합니다.

Source pathDocumentation/scheduler/membarrier.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

User-space address-space barrier의 scheduler 의존성

membarrier.rst:4-9

MEMBARRIER_CMD_PRIVATE_EXPEDITED와 GLOBAL_EXPEDITED는 대상 task가 실행 중인 CPU에 barrier를 강제하여 user-space memory reclamation과 JIT code publication 같은 protocol을 지원합니다. Kernel은 각 runqueue의 current task를 보고 어떤 CPU가 대상 mm을 실행하는지 판단합니다.

rq->curr 갱신 전 barrier

membarrier.rst:10-19

Context 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 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 .. SPDX-License-Identifier: GPL-2.0
2
3 ========================
4 membarrier() System Call
5 ========================
6
7 MEMBARRIER_CMD_{PRIVATE,GLOBAL}_EXPEDITED - Architecture requirements
8 =====================================================================
9
10 Memory barriers before updating rq->curr
11 ----------------------------------------
12
13 The commands MEMBARRIER_CMD_PRIVATE_EXPEDITED and MEMBARRIER_CMD_GLOBAL_EXPEDITED
14 require each architecture to have a full memory barrier after coming from
15 user-space, before updating rq->curr. This barrier is implied by the sequence
16 rq_lock(); smp_mb__after_spinlock() in __schedule(). The barrier matches a full
17 barrier in the proximity of the membarrier system call exit, cf.
18 membarrier_{private,global}_expedited().
19
20 Memory barriers after updating rq->curr
21 ---------------------------------------
22
23 The commands MEMBARRIER_CMD_PRIVATE_EXPEDITED and MEMBARRIER_CMD_GLOBAL_EXPEDITED
24 require each architecture to have a full memory barrier after updating rq->curr,
25 before returning to user-space. The schemes providing this barrier on the various
26 architectures are as follows.
27
28 - alpha, arc, arm, hexagon, mips rely on the full barrier implied by
29 spin_unlock() in finish_lock_switch().
30
31 - arm64 relies on the full barrier implied by switch_to().
32
33 - powerpc, riscv, s390, sparc, x86 rely on the full barrier implied by
34 switch_mm(), if mm is not NULL; they rely on the full barrier implied
35 by mmdrop(), otherwise. On powerpc and riscv, switch_mm() relies on
36 membarrier_arch_switch_mm().
37
38 The barrier matches a full barrier in the proximity of the membarrier system call
39 entry, cf. membarrier_{private,global}_expedited().
40

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

rq->curr 갱신 전 memory barrier

1-17

membarrier() 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와 짝을 이룬다.