]>
Commit | Line | Data |
---|---|---|
49618364 MCC |
1 | ============= |
2 | Atomic bitops | |
3 | ============= | |
706eeb3e PZ |
4 | |
5 | While our bitmap_{}() functions are non-atomic, we have a number of operations | |
6 | operating on single bits in a bitmap that are atomic. | |
7 | ||
8 | ||
9 | API | |
10 | --- | |
11 | ||
12 | The single bit operations are: | |
13 | ||
14 | Non-RMW ops: | |
15 | ||
16 | test_bit() | |
17 | ||
18 | RMW atomic operations without return value: | |
19 | ||
20 | {set,clear,change}_bit() | |
21 | clear_bit_unlock() | |
22 | ||
23 | RMW atomic operations with return value: | |
24 | ||
25 | test_and_{set,clear,change}_bit() | |
26 | test_and_set_bit_lock() | |
27 | ||
28 | Barriers: | |
29 | ||
30 | smp_mb__{before,after}_atomic() | |
31 | ||
32 | ||
33 | All RMW atomic operations have a '__' prefixed variant which is non-atomic. | |
34 | ||
35 | ||
36 | SEMANTICS | |
37 | --------- | |
38 | ||
39 | Non-atomic ops: | |
40 | ||
41 | In particular __clear_bit_unlock() suffers the same issue as atomic_set(), | |
42 | which is why the generic version maps to clear_bit_unlock(), see atomic_t.txt. | |
43 | ||
44 | ||
45 | RMW ops: | |
46 | ||
47 | The test_and_{}_bit() operations return the original value of the bit. | |
48 | ||
49 | ||
50 | ORDERING | |
51 | -------- | |
52 | ||
53 | Like with atomic_t, the rule of thumb is: | |
54 | ||
55 | - non-RMW operations are unordered; | |
56 | ||
57 | - RMW operations that have no return value are unordered; | |
58 | ||
59 | - RMW operations that have a return value are fully ordered. | |
60 | ||
8238b457 | 61 | - RMW operations that are conditional are fully ordered. |
61e02392 | 62 | |
8238b457 MP |
63 | Except for a successful test_and_set_bit_lock() which has ACQUIRE semantics, |
64 | clear_bit_unlock() which has RELEASE semantics and test_bit_acquire which has | |
65 | ACQUIRE semantics. | |
706eeb3e PZ |
66 | |
67 | Since a platform only has a single means of achieving atomic operations | |
68 | the same barriers as for atomic_t are used, see atomic_t.txt. | |
69 |