Merge patch series "Support Andes PMU extension"
[linux-2.6-microblaze.git] / Documentation / scheduler / membarrier.rst
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().