xref: /linux/Documentation/atomic_bitops.txt (revision 8238b457)
149618364SMauro Carvalho Chehab=============
249618364SMauro Carvalho ChehabAtomic bitops
349618364SMauro Carvalho Chehab=============
4706eeb3eSPeter Zijlstra
5706eeb3eSPeter ZijlstraWhile our bitmap_{}() functions are non-atomic, we have a number of operations
6706eeb3eSPeter Zijlstraoperating on single bits in a bitmap that are atomic.
7706eeb3eSPeter Zijlstra
8706eeb3eSPeter Zijlstra
9706eeb3eSPeter ZijlstraAPI
10706eeb3eSPeter Zijlstra---
11706eeb3eSPeter Zijlstra
12706eeb3eSPeter ZijlstraThe single bit operations are:
13706eeb3eSPeter Zijlstra
14706eeb3eSPeter ZijlstraNon-RMW ops:
15706eeb3eSPeter Zijlstra
16706eeb3eSPeter Zijlstra  test_bit()
17706eeb3eSPeter Zijlstra
18706eeb3eSPeter ZijlstraRMW atomic operations without return value:
19706eeb3eSPeter Zijlstra
20706eeb3eSPeter Zijlstra  {set,clear,change}_bit()
21706eeb3eSPeter Zijlstra  clear_bit_unlock()
22706eeb3eSPeter Zijlstra
23706eeb3eSPeter ZijlstraRMW atomic operations with return value:
24706eeb3eSPeter Zijlstra
25706eeb3eSPeter Zijlstra  test_and_{set,clear,change}_bit()
26706eeb3eSPeter Zijlstra  test_and_set_bit_lock()
27706eeb3eSPeter Zijlstra
28706eeb3eSPeter ZijlstraBarriers:
29706eeb3eSPeter Zijlstra
30706eeb3eSPeter Zijlstra  smp_mb__{before,after}_atomic()
31706eeb3eSPeter Zijlstra
32706eeb3eSPeter Zijlstra
33706eeb3eSPeter ZijlstraAll RMW atomic operations have a '__' prefixed variant which is non-atomic.
34706eeb3eSPeter Zijlstra
35706eeb3eSPeter Zijlstra
36706eeb3eSPeter ZijlstraSEMANTICS
37706eeb3eSPeter Zijlstra---------
38706eeb3eSPeter Zijlstra
39706eeb3eSPeter ZijlstraNon-atomic ops:
40706eeb3eSPeter Zijlstra
41706eeb3eSPeter ZijlstraIn particular __clear_bit_unlock() suffers the same issue as atomic_set(),
42706eeb3eSPeter Zijlstrawhich is why the generic version maps to clear_bit_unlock(), see atomic_t.txt.
43706eeb3eSPeter Zijlstra
44706eeb3eSPeter Zijlstra
45706eeb3eSPeter ZijlstraRMW ops:
46706eeb3eSPeter Zijlstra
47706eeb3eSPeter ZijlstraThe test_and_{}_bit() operations return the original value of the bit.
48706eeb3eSPeter Zijlstra
49706eeb3eSPeter Zijlstra
50706eeb3eSPeter ZijlstraORDERING
51706eeb3eSPeter Zijlstra--------
52706eeb3eSPeter Zijlstra
53706eeb3eSPeter ZijlstraLike with atomic_t, the rule of thumb is:
54706eeb3eSPeter Zijlstra
55706eeb3eSPeter Zijlstra - non-RMW operations are unordered;
56706eeb3eSPeter Zijlstra
57706eeb3eSPeter Zijlstra - RMW operations that have no return value are unordered;
58706eeb3eSPeter Zijlstra
59706eeb3eSPeter Zijlstra - RMW operations that have a return value are fully ordered.
60706eeb3eSPeter Zijlstra
61*8238b457SMikulas Patocka - RMW operations that are conditional are fully ordered.
6261e02392SWill Deacon
63*8238b457SMikulas PatockaExcept for a successful test_and_set_bit_lock() which has ACQUIRE semantics,
64*8238b457SMikulas Patockaclear_bit_unlock() which has RELEASE semantics and test_bit_acquire which has
65*8238b457SMikulas PatockaACQUIRE semantics.
66706eeb3eSPeter Zijlstra
67706eeb3eSPeter ZijlstraSince a platform only has a single means of achieving atomic operations
68706eeb3eSPeter Zijlstrathe same barriers as for atomic_t are used, see atomic_t.txt.
69706eeb3eSPeter Zijlstra
70