Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1#
2# Legend:
3# R, a Load event
4# W, a Store event
5# F, a Fence event
6# LKR, a Lock-Read event
7# LKW, a Lock-Write event
8# UL, an Unlock event
9# LF, a Lock-Fail event
10# RL, a Read-Locked event
11# RU, a Read-Unlocked event
12# R*, a Load event included in RMW
13# W*, a Store event included in RMW
14# SRCU, a Sleepable-Read-Copy-Update event
15#
16# po, a Program-Order link
17# rmw, a Read-Modify-Write link - every rmw link is a po link
18#
19# By convention, a blank line in a cell means "same as the preceding line".
20#
21# Note that the syntactic representation does not always match the sets and
22# relations in linux-kernel.cat, due to redefinitions in linux-kernel.bell and
23# lock.cat. For example, the po link between LKR and LKW is upgraded to an rmw
24# link, and W[ACQUIRE] are not included in the Acquire set.
25#
26# Disclaimer. The table includes representations of "add" and "and" operations;
27# corresponding/identical representations of "sub", "inc", "dec" and "or", "xor",
28# "andnot" operations are omitted.
29#
30 ------------------------------------------------------------------------------
31 | C macro | Events |
32 ------------------------------------------------------------------------------
33 | Non-RMW ops | |
34 ------------------------------------------------------------------------------
35 | READ_ONCE | R[ONCE] |
36 | atomic_read | |
37 | WRITE_ONCE | W[ONCE] |
38 | atomic_set | |
39 | smp_load_acquire | R[ACQUIRE] |
40 | atomic_read_acquire | |
41 | smp_store_release | W[RELEASE] |
42 | atomic_set_release | |
43 | smp_store_mb | W[ONCE] ->po F[MB] |
44 | smp_mb | F[MB] |
45 | smp_rmb | F[rmb] |
46 | smp_wmb | F[wmb] |
47 | smp_mb__before_atomic | F[before-atomic] |
48 | smp_mb__after_atomic | F[after-atomic] |
49 | spin_unlock | UL |
50 | spin_is_locked | On success: RL |
51 | | On failure: RU |
52 | smp_mb__after_spinlock | F[after-spinlock] |
53 | smp_mb__after_unlock_lock | F[after-unlock-lock] |
54 | rcu_read_lock | F[rcu-lock] |
55 | rcu_read_unlock | F[rcu-unlock] |
56 | synchronize_rcu | F[sync-rcu] |
57 | rcu_dereference | R[ONCE] |
58 | rcu_assign_pointer | W[RELEASE] |
59 | srcu_read_lock | R[srcu-lock] |
60 | srcu_down_read | |
61 | srcu_read_unlock | W[srcu-unlock] |
62 | srcu_up_read | |
63 | synchronize_srcu | SRCU[sync-srcu] |
64 | smp_mb__after_srcu_read_unlock | F[after-srcu-read-unlock] |
65 ------------------------------------------------------------------------------
66 | RMW ops w/o return value | |
67 ------------------------------------------------------------------------------
68 | atomic_add | R*[NORETURN] ->rmw W*[NORETURN] |
69 | atomic_and | |
70 | spin_lock | LKR ->po LKW |
71 ------------------------------------------------------------------------------
72 | RMW ops w/ return value | |
73 ------------------------------------------------------------------------------
74 | atomic_add_return | R*[MB] ->rmw W*[MB] |
75 | atomic_fetch_add | |
76 | atomic_fetch_and | |
77 | atomic_xchg | |
78 | xchg | |
79 | atomic_add_negative | |
80 | atomic_add_return_relaxed | R*[ONCE] ->rmw W*[ONCE] |
81 | atomic_fetch_add_relaxed | |
82 | atomic_fetch_and_relaxed | |
83 | atomic_xchg_relaxed | |
84 | xchg_relaxed | |
85 | atomic_add_negative_relaxed | |
86 | atomic_add_return_acquire | R*[ACQUIRE] ->rmw W*[ACQUIRE] |
87 | atomic_fetch_add_acquire | |
88 | atomic_fetch_and_acquire | |
89 | atomic_xchg_acquire | |
90 | xchg_acquire | |
91 | atomic_add_negative_acquire | |
92 | atomic_add_return_release | R*[RELEASE] ->rmw W*[RELEASE] |
93 | atomic_fetch_add_release | |
94 | atomic_fetch_and_release | |
95 | atomic_xchg_release | |
96 | xchg_release | |
97 | atomic_add_negative_release | |
98 ------------------------------------------------------------------------------
99 | Conditional RMW ops | |
100 ------------------------------------------------------------------------------
101 | atomic_cmpxchg | On success: R*[MB] ->rmw W*[MB] |
102 | | On failure: R*[MB] |
103 | cmpxchg | |
104 | atomic_add_unless | |
105 | atomic_cmpxchg_relaxed | On success: R*[ONCE] ->rmw W*[ONCE] |
106 | | On failure: R*[ONCE] |
107 | atomic_cmpxchg_acquire | On success: R*[ACQUIRE] ->rmw W*[ACQUIRE] |
108 | | On failure: R*[ACQUIRE] |
109 | atomic_cmpxchg_release | On success: R*[RELEASE] ->rmw W*[RELEASE] |
110 | | On failure: R*[RELEASE] |
111 | spin_trylock | On success: LKR ->po LKW |
112 | | On failure: LF |
113 ------------------------------------------------------------------------------