~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/atomic/atomic-instrumented.h

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /include/linux/atomic/atomic-instrumented.h (Architecture m68k) and /include/linux/atomic/atomic-instrumented.h (Architecture mips)


  1 // SPDX-License-Identifier: GPL-2.0                 1 // SPDX-License-Identifier: GPL-2.0
  2                                                     2 
  3 // Generated by scripts/atomic/gen-atomic-inst      3 // Generated by scripts/atomic/gen-atomic-instrumented.sh
  4 // DO NOT MODIFY THIS FILE DIRECTLY                 4 // DO NOT MODIFY THIS FILE DIRECTLY
  5                                                     5 
  6 /*                                                  6 /*
  7  * This file provoides atomic operations with       7  * This file provoides atomic operations with explicit instrumentation (e.g.
  8  * KASAN, KCSAN), which should be used unless       8  * KASAN, KCSAN), which should be used unless it is necessary to avoid
  9  * instrumentation. Where it is necessary to a      9  * instrumentation. Where it is necessary to aovid instrumenation, the
 10  * raw_atomic*() operations should be used.        10  * raw_atomic*() operations should be used.
 11  */                                                11  */
 12 #ifndef _LINUX_ATOMIC_INSTRUMENTED_H               12 #ifndef _LINUX_ATOMIC_INSTRUMENTED_H
 13 #define _LINUX_ATOMIC_INSTRUMENTED_H               13 #define _LINUX_ATOMIC_INSTRUMENTED_H
 14                                                    14 
 15 #include <linux/build_bug.h>                       15 #include <linux/build_bug.h>
 16 #include <linux/compiler.h>                        16 #include <linux/compiler.h>
 17 #include <linux/instrumented.h>                    17 #include <linux/instrumented.h>
 18                                                    18 
 19 /**                                                19 /**
 20  * atomic_read() - atomic load with relaxed or     20  * atomic_read() - atomic load with relaxed ordering
 21  * @v: pointer to atomic_t                         21  * @v: pointer to atomic_t
 22  *                                                 22  *
 23  * Atomically loads the value of @v with relax     23  * Atomically loads the value of @v with relaxed ordering.
 24  *                                                 24  *
 25  * Unsafe to use in noinstr code; use raw_atom     25  * Unsafe to use in noinstr code; use raw_atomic_read() there.
 26  *                                                 26  *
 27  * Return: The value loaded from @v.               27  * Return: The value loaded from @v.
 28  */                                                28  */
 29 static __always_inline int                         29 static __always_inline int
 30 atomic_read(const atomic_t *v)                     30 atomic_read(const atomic_t *v)
 31 {                                                  31 {
 32         instrument_atomic_read(v, sizeof(*v));     32         instrument_atomic_read(v, sizeof(*v));
 33         return raw_atomic_read(v);                 33         return raw_atomic_read(v);
 34 }                                                  34 }
 35                                                    35 
 36 /**                                                36 /**
 37  * atomic_read_acquire() - atomic load with ac     37  * atomic_read_acquire() - atomic load with acquire ordering
 38  * @v: pointer to atomic_t                         38  * @v: pointer to atomic_t
 39  *                                                 39  *
 40  * Atomically loads the value of @v with acqui     40  * Atomically loads the value of @v with acquire ordering.
 41  *                                                 41  *
 42  * Unsafe to use in noinstr code; use raw_atom     42  * Unsafe to use in noinstr code; use raw_atomic_read_acquire() there.
 43  *                                                 43  *
 44  * Return: The value loaded from @v.               44  * Return: The value loaded from @v.
 45  */                                                45  */
 46 static __always_inline int                         46 static __always_inline int
 47 atomic_read_acquire(const atomic_t *v)             47 atomic_read_acquire(const atomic_t *v)
 48 {                                                  48 {
 49         instrument_atomic_read(v, sizeof(*v));     49         instrument_atomic_read(v, sizeof(*v));
 50         return raw_atomic_read_acquire(v);         50         return raw_atomic_read_acquire(v);
 51 }                                                  51 }
 52                                                    52 
 53 /**                                                53 /**
 54  * atomic_set() - atomic set with relaxed orde     54  * atomic_set() - atomic set with relaxed ordering
 55  * @v: pointer to atomic_t                         55  * @v: pointer to atomic_t
 56  * @i: int value to assign                         56  * @i: int value to assign
 57  *                                                 57  *
 58  * Atomically sets @v to @i with relaxed order     58  * Atomically sets @v to @i with relaxed ordering.
 59  *                                                 59  *
 60  * Unsafe to use in noinstr code; use raw_atom     60  * Unsafe to use in noinstr code; use raw_atomic_set() there.
 61  *                                                 61  *
 62  * Return: Nothing.                                62  * Return: Nothing.
 63  */                                                63  */
 64 static __always_inline void                        64 static __always_inline void
 65 atomic_set(atomic_t *v, int i)                     65 atomic_set(atomic_t *v, int i)
 66 {                                                  66 {
 67         instrument_atomic_write(v, sizeof(*v))     67         instrument_atomic_write(v, sizeof(*v));
 68         raw_atomic_set(v, i);                      68         raw_atomic_set(v, i);
 69 }                                                  69 }
 70                                                    70 
 71 /**                                                71 /**
 72  * atomic_set_release() - atomic set with rele     72  * atomic_set_release() - atomic set with release ordering
 73  * @v: pointer to atomic_t                         73  * @v: pointer to atomic_t
 74  * @i: int value to assign                         74  * @i: int value to assign
 75  *                                                 75  *
 76  * Atomically sets @v to @i with release order     76  * Atomically sets @v to @i with release ordering.
 77  *                                                 77  *
 78  * Unsafe to use in noinstr code; use raw_atom     78  * Unsafe to use in noinstr code; use raw_atomic_set_release() there.
 79  *                                                 79  *
 80  * Return: Nothing.                                80  * Return: Nothing.
 81  */                                                81  */
 82 static __always_inline void                        82 static __always_inline void
 83 atomic_set_release(atomic_t *v, int i)             83 atomic_set_release(atomic_t *v, int i)
 84 {                                                  84 {
 85         kcsan_release();                           85         kcsan_release();
 86         instrument_atomic_write(v, sizeof(*v))     86         instrument_atomic_write(v, sizeof(*v));
 87         raw_atomic_set_release(v, i);              87         raw_atomic_set_release(v, i);
 88 }                                                  88 }
 89                                                    89 
 90 /**                                                90 /**
 91  * atomic_add() - atomic add with relaxed orde     91  * atomic_add() - atomic add with relaxed ordering
 92  * @i: int value to add                            92  * @i: int value to add
 93  * @v: pointer to atomic_t                         93  * @v: pointer to atomic_t
 94  *                                                 94  *
 95  * Atomically updates @v to (@v + @i) with rel     95  * Atomically updates @v to (@v + @i) with relaxed ordering.
 96  *                                                 96  *
 97  * Unsafe to use in noinstr code; use raw_atom     97  * Unsafe to use in noinstr code; use raw_atomic_add() there.
 98  *                                                 98  *
 99  * Return: Nothing.                                99  * Return: Nothing.
100  */                                               100  */
101 static __always_inline void                       101 static __always_inline void
102 atomic_add(int i, atomic_t *v)                    102 atomic_add(int i, atomic_t *v)
103 {                                                 103 {
104         instrument_atomic_read_write(v, sizeof    104         instrument_atomic_read_write(v, sizeof(*v));
105         raw_atomic_add(i, v);                     105         raw_atomic_add(i, v);
106 }                                                 106 }
107                                                   107 
108 /**                                               108 /**
109  * atomic_add_return() - atomic add with full     109  * atomic_add_return() - atomic add with full ordering
110  * @i: int value to add                           110  * @i: int value to add
111  * @v: pointer to atomic_t                        111  * @v: pointer to atomic_t
112  *                                                112  *
113  * Atomically updates @v to (@v + @i) with ful    113  * Atomically updates @v to (@v + @i) with full ordering.
114  *                                                114  *
115  * Unsafe to use in noinstr code; use raw_atom    115  * Unsafe to use in noinstr code; use raw_atomic_add_return() there.
116  *                                                116  *
117  * Return: The updated value of @v.               117  * Return: The updated value of @v.
118  */                                               118  */
119 static __always_inline int                        119 static __always_inline int
120 atomic_add_return(int i, atomic_t *v)             120 atomic_add_return(int i, atomic_t *v)
121 {                                                 121 {
122         kcsan_mb();                               122         kcsan_mb();
123         instrument_atomic_read_write(v, sizeof    123         instrument_atomic_read_write(v, sizeof(*v));
124         return raw_atomic_add_return(i, v);       124         return raw_atomic_add_return(i, v);
125 }                                                 125 }
126                                                   126 
127 /**                                               127 /**
128  * atomic_add_return_acquire() - atomic add wi    128  * atomic_add_return_acquire() - atomic add with acquire ordering
129  * @i: int value to add                           129  * @i: int value to add
130  * @v: pointer to atomic_t                        130  * @v: pointer to atomic_t
131  *                                                131  *
132  * Atomically updates @v to (@v + @i) with acq    132  * Atomically updates @v to (@v + @i) with acquire ordering.
133  *                                                133  *
134  * Unsafe to use in noinstr code; use raw_atom    134  * Unsafe to use in noinstr code; use raw_atomic_add_return_acquire() there.
135  *                                                135  *
136  * Return: The updated value of @v.               136  * Return: The updated value of @v.
137  */                                               137  */
138 static __always_inline int                        138 static __always_inline int
139 atomic_add_return_acquire(int i, atomic_t *v)     139 atomic_add_return_acquire(int i, atomic_t *v)
140 {                                                 140 {
141         instrument_atomic_read_write(v, sizeof    141         instrument_atomic_read_write(v, sizeof(*v));
142         return raw_atomic_add_return_acquire(i    142         return raw_atomic_add_return_acquire(i, v);
143 }                                                 143 }
144                                                   144 
145 /**                                               145 /**
146  * atomic_add_return_release() - atomic add wi    146  * atomic_add_return_release() - atomic add with release ordering
147  * @i: int value to add                           147  * @i: int value to add
148  * @v: pointer to atomic_t                        148  * @v: pointer to atomic_t
149  *                                                149  *
150  * Atomically updates @v to (@v + @i) with rel    150  * Atomically updates @v to (@v + @i) with release ordering.
151  *                                                151  *
152  * Unsafe to use in noinstr code; use raw_atom    152  * Unsafe to use in noinstr code; use raw_atomic_add_return_release() there.
153  *                                                153  *
154  * Return: The updated value of @v.               154  * Return: The updated value of @v.
155  */                                               155  */
156 static __always_inline int                        156 static __always_inline int
157 atomic_add_return_release(int i, atomic_t *v)     157 atomic_add_return_release(int i, atomic_t *v)
158 {                                                 158 {
159         kcsan_release();                          159         kcsan_release();
160         instrument_atomic_read_write(v, sizeof    160         instrument_atomic_read_write(v, sizeof(*v));
161         return raw_atomic_add_return_release(i    161         return raw_atomic_add_return_release(i, v);
162 }                                                 162 }
163                                                   163 
164 /**                                               164 /**
165  * atomic_add_return_relaxed() - atomic add wi    165  * atomic_add_return_relaxed() - atomic add with relaxed ordering
166  * @i: int value to add                           166  * @i: int value to add
167  * @v: pointer to atomic_t                        167  * @v: pointer to atomic_t
168  *                                                168  *
169  * Atomically updates @v to (@v + @i) with rel    169  * Atomically updates @v to (@v + @i) with relaxed ordering.
170  *                                                170  *
171  * Unsafe to use in noinstr code; use raw_atom    171  * Unsafe to use in noinstr code; use raw_atomic_add_return_relaxed() there.
172  *                                                172  *
173  * Return: The updated value of @v.               173  * Return: The updated value of @v.
174  */                                               174  */
175 static __always_inline int                        175 static __always_inline int
176 atomic_add_return_relaxed(int i, atomic_t *v)     176 atomic_add_return_relaxed(int i, atomic_t *v)
177 {                                                 177 {
178         instrument_atomic_read_write(v, sizeof    178         instrument_atomic_read_write(v, sizeof(*v));
179         return raw_atomic_add_return_relaxed(i    179         return raw_atomic_add_return_relaxed(i, v);
180 }                                                 180 }
181                                                   181 
182 /**                                               182 /**
183  * atomic_fetch_add() - atomic add with full o    183  * atomic_fetch_add() - atomic add with full ordering
184  * @i: int value to add                           184  * @i: int value to add
185  * @v: pointer to atomic_t                        185  * @v: pointer to atomic_t
186  *                                                186  *
187  * Atomically updates @v to (@v + @i) with ful    187  * Atomically updates @v to (@v + @i) with full ordering.
188  *                                                188  *
189  * Unsafe to use in noinstr code; use raw_atom    189  * Unsafe to use in noinstr code; use raw_atomic_fetch_add() there.
190  *                                                190  *
191  * Return: The original value of @v.              191  * Return: The original value of @v.
192  */                                               192  */
193 static __always_inline int                        193 static __always_inline int
194 atomic_fetch_add(int i, atomic_t *v)              194 atomic_fetch_add(int i, atomic_t *v)
195 {                                                 195 {
196         kcsan_mb();                               196         kcsan_mb();
197         instrument_atomic_read_write(v, sizeof    197         instrument_atomic_read_write(v, sizeof(*v));
198         return raw_atomic_fetch_add(i, v);        198         return raw_atomic_fetch_add(i, v);
199 }                                                 199 }
200                                                   200 
201 /**                                               201 /**
202  * atomic_fetch_add_acquire() - atomic add wit    202  * atomic_fetch_add_acquire() - atomic add with acquire ordering
203  * @i: int value to add                           203  * @i: int value to add
204  * @v: pointer to atomic_t                        204  * @v: pointer to atomic_t
205  *                                                205  *
206  * Atomically updates @v to (@v + @i) with acq    206  * Atomically updates @v to (@v + @i) with acquire ordering.
207  *                                                207  *
208  * Unsafe to use in noinstr code; use raw_atom    208  * Unsafe to use in noinstr code; use raw_atomic_fetch_add_acquire() there.
209  *                                                209  *
210  * Return: The original value of @v.              210  * Return: The original value of @v.
211  */                                               211  */
212 static __always_inline int                        212 static __always_inline int
213 atomic_fetch_add_acquire(int i, atomic_t *v)      213 atomic_fetch_add_acquire(int i, atomic_t *v)
214 {                                                 214 {
215         instrument_atomic_read_write(v, sizeof    215         instrument_atomic_read_write(v, sizeof(*v));
216         return raw_atomic_fetch_add_acquire(i,    216         return raw_atomic_fetch_add_acquire(i, v);
217 }                                                 217 }
218                                                   218 
219 /**                                               219 /**
220  * atomic_fetch_add_release() - atomic add wit    220  * atomic_fetch_add_release() - atomic add with release ordering
221  * @i: int value to add                           221  * @i: int value to add
222  * @v: pointer to atomic_t                        222  * @v: pointer to atomic_t
223  *                                                223  *
224  * Atomically updates @v to (@v + @i) with rel    224  * Atomically updates @v to (@v + @i) with release ordering.
225  *                                                225  *
226  * Unsafe to use in noinstr code; use raw_atom    226  * Unsafe to use in noinstr code; use raw_atomic_fetch_add_release() there.
227  *                                                227  *
228  * Return: The original value of @v.              228  * Return: The original value of @v.
229  */                                               229  */
230 static __always_inline int                        230 static __always_inline int
231 atomic_fetch_add_release(int i, atomic_t *v)      231 atomic_fetch_add_release(int i, atomic_t *v)
232 {                                                 232 {
233         kcsan_release();                          233         kcsan_release();
234         instrument_atomic_read_write(v, sizeof    234         instrument_atomic_read_write(v, sizeof(*v));
235         return raw_atomic_fetch_add_release(i,    235         return raw_atomic_fetch_add_release(i, v);
236 }                                                 236 }
237                                                   237 
238 /**                                               238 /**
239  * atomic_fetch_add_relaxed() - atomic add wit    239  * atomic_fetch_add_relaxed() - atomic add with relaxed ordering
240  * @i: int value to add                           240  * @i: int value to add
241  * @v: pointer to atomic_t                        241  * @v: pointer to atomic_t
242  *                                                242  *
243  * Atomically updates @v to (@v + @i) with rel    243  * Atomically updates @v to (@v + @i) with relaxed ordering.
244  *                                                244  *
245  * Unsafe to use in noinstr code; use raw_atom    245  * Unsafe to use in noinstr code; use raw_atomic_fetch_add_relaxed() there.
246  *                                                246  *
247  * Return: The original value of @v.              247  * Return: The original value of @v.
248  */                                               248  */
249 static __always_inline int                        249 static __always_inline int
250 atomic_fetch_add_relaxed(int i, atomic_t *v)      250 atomic_fetch_add_relaxed(int i, atomic_t *v)
251 {                                                 251 {
252         instrument_atomic_read_write(v, sizeof    252         instrument_atomic_read_write(v, sizeof(*v));
253         return raw_atomic_fetch_add_relaxed(i,    253         return raw_atomic_fetch_add_relaxed(i, v);
254 }                                                 254 }
255                                                   255 
256 /**                                               256 /**
257  * atomic_sub() - atomic subtract with relaxed    257  * atomic_sub() - atomic subtract with relaxed ordering
258  * @i: int value to subtract                      258  * @i: int value to subtract
259  * @v: pointer to atomic_t                        259  * @v: pointer to atomic_t
260  *                                                260  *
261  * Atomically updates @v to (@v - @i) with rel    261  * Atomically updates @v to (@v - @i) with relaxed ordering.
262  *                                                262  *
263  * Unsafe to use in noinstr code; use raw_atom    263  * Unsafe to use in noinstr code; use raw_atomic_sub() there.
264  *                                                264  *
265  * Return: Nothing.                               265  * Return: Nothing.
266  */                                               266  */
267 static __always_inline void                       267 static __always_inline void
268 atomic_sub(int i, atomic_t *v)                    268 atomic_sub(int i, atomic_t *v)
269 {                                                 269 {
270         instrument_atomic_read_write(v, sizeof    270         instrument_atomic_read_write(v, sizeof(*v));
271         raw_atomic_sub(i, v);                     271         raw_atomic_sub(i, v);
272 }                                                 272 }
273                                                   273 
274 /**                                               274 /**
275  * atomic_sub_return() - atomic subtract with     275  * atomic_sub_return() - atomic subtract with full ordering
276  * @i: int value to subtract                      276  * @i: int value to subtract
277  * @v: pointer to atomic_t                        277  * @v: pointer to atomic_t
278  *                                                278  *
279  * Atomically updates @v to (@v - @i) with ful    279  * Atomically updates @v to (@v - @i) with full ordering.
280  *                                                280  *
281  * Unsafe to use in noinstr code; use raw_atom    281  * Unsafe to use in noinstr code; use raw_atomic_sub_return() there.
282  *                                                282  *
283  * Return: The updated value of @v.               283  * Return: The updated value of @v.
284  */                                               284  */
285 static __always_inline int                        285 static __always_inline int
286 atomic_sub_return(int i, atomic_t *v)             286 atomic_sub_return(int i, atomic_t *v)
287 {                                                 287 {
288         kcsan_mb();                               288         kcsan_mb();
289         instrument_atomic_read_write(v, sizeof    289         instrument_atomic_read_write(v, sizeof(*v));
290         return raw_atomic_sub_return(i, v);       290         return raw_atomic_sub_return(i, v);
291 }                                                 291 }
292                                                   292 
293 /**                                               293 /**
294  * atomic_sub_return_acquire() - atomic subtra    294  * atomic_sub_return_acquire() - atomic subtract with acquire ordering
295  * @i: int value to subtract                      295  * @i: int value to subtract
296  * @v: pointer to atomic_t                        296  * @v: pointer to atomic_t
297  *                                                297  *
298  * Atomically updates @v to (@v - @i) with acq    298  * Atomically updates @v to (@v - @i) with acquire ordering.
299  *                                                299  *
300  * Unsafe to use in noinstr code; use raw_atom    300  * Unsafe to use in noinstr code; use raw_atomic_sub_return_acquire() there.
301  *                                                301  *
302  * Return: The updated value of @v.               302  * Return: The updated value of @v.
303  */                                               303  */
304 static __always_inline int                        304 static __always_inline int
305 atomic_sub_return_acquire(int i, atomic_t *v)     305 atomic_sub_return_acquire(int i, atomic_t *v)
306 {                                                 306 {
307         instrument_atomic_read_write(v, sizeof    307         instrument_atomic_read_write(v, sizeof(*v));
308         return raw_atomic_sub_return_acquire(i    308         return raw_atomic_sub_return_acquire(i, v);
309 }                                                 309 }
310                                                   310 
311 /**                                               311 /**
312  * atomic_sub_return_release() - atomic subtra    312  * atomic_sub_return_release() - atomic subtract with release ordering
313  * @i: int value to subtract                      313  * @i: int value to subtract
314  * @v: pointer to atomic_t                        314  * @v: pointer to atomic_t
315  *                                                315  *
316  * Atomically updates @v to (@v - @i) with rel    316  * Atomically updates @v to (@v - @i) with release ordering.
317  *                                                317  *
318  * Unsafe to use in noinstr code; use raw_atom    318  * Unsafe to use in noinstr code; use raw_atomic_sub_return_release() there.
319  *                                                319  *
320  * Return: The updated value of @v.               320  * Return: The updated value of @v.
321  */                                               321  */
322 static __always_inline int                        322 static __always_inline int
323 atomic_sub_return_release(int i, atomic_t *v)     323 atomic_sub_return_release(int i, atomic_t *v)
324 {                                                 324 {
325         kcsan_release();                          325         kcsan_release();
326         instrument_atomic_read_write(v, sizeof    326         instrument_atomic_read_write(v, sizeof(*v));
327         return raw_atomic_sub_return_release(i    327         return raw_atomic_sub_return_release(i, v);
328 }                                                 328 }
329                                                   329 
330 /**                                               330 /**
331  * atomic_sub_return_relaxed() - atomic subtra    331  * atomic_sub_return_relaxed() - atomic subtract with relaxed ordering
332  * @i: int value to subtract                      332  * @i: int value to subtract
333  * @v: pointer to atomic_t                        333  * @v: pointer to atomic_t
334  *                                                334  *
335  * Atomically updates @v to (@v - @i) with rel    335  * Atomically updates @v to (@v - @i) with relaxed ordering.
336  *                                                336  *
337  * Unsafe to use in noinstr code; use raw_atom    337  * Unsafe to use in noinstr code; use raw_atomic_sub_return_relaxed() there.
338  *                                                338  *
339  * Return: The updated value of @v.               339  * Return: The updated value of @v.
340  */                                               340  */
341 static __always_inline int                        341 static __always_inline int
342 atomic_sub_return_relaxed(int i, atomic_t *v)     342 atomic_sub_return_relaxed(int i, atomic_t *v)
343 {                                                 343 {
344         instrument_atomic_read_write(v, sizeof    344         instrument_atomic_read_write(v, sizeof(*v));
345         return raw_atomic_sub_return_relaxed(i    345         return raw_atomic_sub_return_relaxed(i, v);
346 }                                                 346 }
347                                                   347 
348 /**                                               348 /**
349  * atomic_fetch_sub() - atomic subtract with f    349  * atomic_fetch_sub() - atomic subtract with full ordering
350  * @i: int value to subtract                      350  * @i: int value to subtract
351  * @v: pointer to atomic_t                        351  * @v: pointer to atomic_t
352  *                                                352  *
353  * Atomically updates @v to (@v - @i) with ful    353  * Atomically updates @v to (@v - @i) with full ordering.
354  *                                                354  *
355  * Unsafe to use in noinstr code; use raw_atom    355  * Unsafe to use in noinstr code; use raw_atomic_fetch_sub() there.
356  *                                                356  *
357  * Return: The original value of @v.              357  * Return: The original value of @v.
358  */                                               358  */
359 static __always_inline int                        359 static __always_inline int
360 atomic_fetch_sub(int i, atomic_t *v)              360 atomic_fetch_sub(int i, atomic_t *v)
361 {                                                 361 {
362         kcsan_mb();                               362         kcsan_mb();
363         instrument_atomic_read_write(v, sizeof    363         instrument_atomic_read_write(v, sizeof(*v));
364         return raw_atomic_fetch_sub(i, v);        364         return raw_atomic_fetch_sub(i, v);
365 }                                                 365 }
366                                                   366 
367 /**                                               367 /**
368  * atomic_fetch_sub_acquire() - atomic subtrac    368  * atomic_fetch_sub_acquire() - atomic subtract with acquire ordering
369  * @i: int value to subtract                      369  * @i: int value to subtract
370  * @v: pointer to atomic_t                        370  * @v: pointer to atomic_t
371  *                                                371  *
372  * Atomically updates @v to (@v - @i) with acq    372  * Atomically updates @v to (@v - @i) with acquire ordering.
373  *                                                373  *
374  * Unsafe to use in noinstr code; use raw_atom    374  * Unsafe to use in noinstr code; use raw_atomic_fetch_sub_acquire() there.
375  *                                                375  *
376  * Return: The original value of @v.              376  * Return: The original value of @v.
377  */                                               377  */
378 static __always_inline int                        378 static __always_inline int
379 atomic_fetch_sub_acquire(int i, atomic_t *v)      379 atomic_fetch_sub_acquire(int i, atomic_t *v)
380 {                                                 380 {
381         instrument_atomic_read_write(v, sizeof    381         instrument_atomic_read_write(v, sizeof(*v));
382         return raw_atomic_fetch_sub_acquire(i,    382         return raw_atomic_fetch_sub_acquire(i, v);
383 }                                                 383 }
384                                                   384 
385 /**                                               385 /**
386  * atomic_fetch_sub_release() - atomic subtrac    386  * atomic_fetch_sub_release() - atomic subtract with release ordering
387  * @i: int value to subtract                      387  * @i: int value to subtract
388  * @v: pointer to atomic_t                        388  * @v: pointer to atomic_t
389  *                                                389  *
390  * Atomically updates @v to (@v - @i) with rel    390  * Atomically updates @v to (@v - @i) with release ordering.
391  *                                                391  *
392  * Unsafe to use in noinstr code; use raw_atom    392  * Unsafe to use in noinstr code; use raw_atomic_fetch_sub_release() there.
393  *                                                393  *
394  * Return: The original value of @v.              394  * Return: The original value of @v.
395  */                                               395  */
396 static __always_inline int                        396 static __always_inline int
397 atomic_fetch_sub_release(int i, atomic_t *v)      397 atomic_fetch_sub_release(int i, atomic_t *v)
398 {                                                 398 {
399         kcsan_release();                          399         kcsan_release();
400         instrument_atomic_read_write(v, sizeof    400         instrument_atomic_read_write(v, sizeof(*v));
401         return raw_atomic_fetch_sub_release(i,    401         return raw_atomic_fetch_sub_release(i, v);
402 }                                                 402 }
403                                                   403 
404 /**                                               404 /**
405  * atomic_fetch_sub_relaxed() - atomic subtrac    405  * atomic_fetch_sub_relaxed() - atomic subtract with relaxed ordering
406  * @i: int value to subtract                      406  * @i: int value to subtract
407  * @v: pointer to atomic_t                        407  * @v: pointer to atomic_t
408  *                                                408  *
409  * Atomically updates @v to (@v - @i) with rel    409  * Atomically updates @v to (@v - @i) with relaxed ordering.
410  *                                                410  *
411  * Unsafe to use in noinstr code; use raw_atom    411  * Unsafe to use in noinstr code; use raw_atomic_fetch_sub_relaxed() there.
412  *                                                412  *
413  * Return: The original value of @v.              413  * Return: The original value of @v.
414  */                                               414  */
415 static __always_inline int                        415 static __always_inline int
416 atomic_fetch_sub_relaxed(int i, atomic_t *v)      416 atomic_fetch_sub_relaxed(int i, atomic_t *v)
417 {                                                 417 {
418         instrument_atomic_read_write(v, sizeof    418         instrument_atomic_read_write(v, sizeof(*v));
419         return raw_atomic_fetch_sub_relaxed(i,    419         return raw_atomic_fetch_sub_relaxed(i, v);
420 }                                                 420 }
421                                                   421 
422 /**                                               422 /**
423  * atomic_inc() - atomic increment with relaxe    423  * atomic_inc() - atomic increment with relaxed ordering
424  * @v: pointer to atomic_t                        424  * @v: pointer to atomic_t
425  *                                                425  *
426  * Atomically updates @v to (@v + 1) with rela    426  * Atomically updates @v to (@v + 1) with relaxed ordering.
427  *                                                427  *
428  * Unsafe to use in noinstr code; use raw_atom    428  * Unsafe to use in noinstr code; use raw_atomic_inc() there.
429  *                                                429  *
430  * Return: Nothing.                               430  * Return: Nothing.
431  */                                               431  */
432 static __always_inline void                       432 static __always_inline void
433 atomic_inc(atomic_t *v)                           433 atomic_inc(atomic_t *v)
434 {                                                 434 {
435         instrument_atomic_read_write(v, sizeof    435         instrument_atomic_read_write(v, sizeof(*v));
436         raw_atomic_inc(v);                        436         raw_atomic_inc(v);
437 }                                                 437 }
438                                                   438 
439 /**                                               439 /**
440  * atomic_inc_return() - atomic increment with    440  * atomic_inc_return() - atomic increment with full ordering
441  * @v: pointer to atomic_t                        441  * @v: pointer to atomic_t
442  *                                                442  *
443  * Atomically updates @v to (@v + 1) with full    443  * Atomically updates @v to (@v + 1) with full ordering.
444  *                                                444  *
445  * Unsafe to use in noinstr code; use raw_atom    445  * Unsafe to use in noinstr code; use raw_atomic_inc_return() there.
446  *                                                446  *
447  * Return: The updated value of @v.               447  * Return: The updated value of @v.
448  */                                               448  */
449 static __always_inline int                        449 static __always_inline int
450 atomic_inc_return(atomic_t *v)                    450 atomic_inc_return(atomic_t *v)
451 {                                                 451 {
452         kcsan_mb();                               452         kcsan_mb();
453         instrument_atomic_read_write(v, sizeof    453         instrument_atomic_read_write(v, sizeof(*v));
454         return raw_atomic_inc_return(v);          454         return raw_atomic_inc_return(v);
455 }                                                 455 }
456                                                   456 
457 /**                                               457 /**
458  * atomic_inc_return_acquire() - atomic increm    458  * atomic_inc_return_acquire() - atomic increment with acquire ordering
459  * @v: pointer to atomic_t                        459  * @v: pointer to atomic_t
460  *                                                460  *
461  * Atomically updates @v to (@v + 1) with acqu    461  * Atomically updates @v to (@v + 1) with acquire ordering.
462  *                                                462  *
463  * Unsafe to use in noinstr code; use raw_atom    463  * Unsafe to use in noinstr code; use raw_atomic_inc_return_acquire() there.
464  *                                                464  *
465  * Return: The updated value of @v.               465  * Return: The updated value of @v.
466  */                                               466  */
467 static __always_inline int                        467 static __always_inline int
468 atomic_inc_return_acquire(atomic_t *v)            468 atomic_inc_return_acquire(atomic_t *v)
469 {                                                 469 {
470         instrument_atomic_read_write(v, sizeof    470         instrument_atomic_read_write(v, sizeof(*v));
471         return raw_atomic_inc_return_acquire(v    471         return raw_atomic_inc_return_acquire(v);
472 }                                                 472 }
473                                                   473 
474 /**                                               474 /**
475  * atomic_inc_return_release() - atomic increm    475  * atomic_inc_return_release() - atomic increment with release ordering
476  * @v: pointer to atomic_t                        476  * @v: pointer to atomic_t
477  *                                                477  *
478  * Atomically updates @v to (@v + 1) with rele    478  * Atomically updates @v to (@v + 1) with release ordering.
479  *                                                479  *
480  * Unsafe to use in noinstr code; use raw_atom    480  * Unsafe to use in noinstr code; use raw_atomic_inc_return_release() there.
481  *                                                481  *
482  * Return: The updated value of @v.               482  * Return: The updated value of @v.
483  */                                               483  */
484 static __always_inline int                        484 static __always_inline int
485 atomic_inc_return_release(atomic_t *v)            485 atomic_inc_return_release(atomic_t *v)
486 {                                                 486 {
487         kcsan_release();                          487         kcsan_release();
488         instrument_atomic_read_write(v, sizeof    488         instrument_atomic_read_write(v, sizeof(*v));
489         return raw_atomic_inc_return_release(v    489         return raw_atomic_inc_return_release(v);
490 }                                                 490 }
491                                                   491 
492 /**                                               492 /**
493  * atomic_inc_return_relaxed() - atomic increm    493  * atomic_inc_return_relaxed() - atomic increment with relaxed ordering
494  * @v: pointer to atomic_t                        494  * @v: pointer to atomic_t
495  *                                                495  *
496  * Atomically updates @v to (@v + 1) with rela    496  * Atomically updates @v to (@v + 1) with relaxed ordering.
497  *                                                497  *
498  * Unsafe to use in noinstr code; use raw_atom    498  * Unsafe to use in noinstr code; use raw_atomic_inc_return_relaxed() there.
499  *                                                499  *
500  * Return: The updated value of @v.               500  * Return: The updated value of @v.
501  */                                               501  */
502 static __always_inline int                        502 static __always_inline int
503 atomic_inc_return_relaxed(atomic_t *v)            503 atomic_inc_return_relaxed(atomic_t *v)
504 {                                                 504 {
505         instrument_atomic_read_write(v, sizeof    505         instrument_atomic_read_write(v, sizeof(*v));
506         return raw_atomic_inc_return_relaxed(v    506         return raw_atomic_inc_return_relaxed(v);
507 }                                                 507 }
508                                                   508 
509 /**                                               509 /**
510  * atomic_fetch_inc() - atomic increment with     510  * atomic_fetch_inc() - atomic increment with full ordering
511  * @v: pointer to atomic_t                        511  * @v: pointer to atomic_t
512  *                                                512  *
513  * Atomically updates @v to (@v + 1) with full    513  * Atomically updates @v to (@v + 1) with full ordering.
514  *                                                514  *
515  * Unsafe to use in noinstr code; use raw_atom    515  * Unsafe to use in noinstr code; use raw_atomic_fetch_inc() there.
516  *                                                516  *
517  * Return: The original value of @v.              517  * Return: The original value of @v.
518  */                                               518  */
519 static __always_inline int                        519 static __always_inline int
520 atomic_fetch_inc(atomic_t *v)                     520 atomic_fetch_inc(atomic_t *v)
521 {                                                 521 {
522         kcsan_mb();                               522         kcsan_mb();
523         instrument_atomic_read_write(v, sizeof    523         instrument_atomic_read_write(v, sizeof(*v));
524         return raw_atomic_fetch_inc(v);           524         return raw_atomic_fetch_inc(v);
525 }                                                 525 }
526                                                   526 
527 /**                                               527 /**
528  * atomic_fetch_inc_acquire() - atomic increme    528  * atomic_fetch_inc_acquire() - atomic increment with acquire ordering
529  * @v: pointer to atomic_t                        529  * @v: pointer to atomic_t
530  *                                                530  *
531  * Atomically updates @v to (@v + 1) with acqu    531  * Atomically updates @v to (@v + 1) with acquire ordering.
532  *                                                532  *
533  * Unsafe to use in noinstr code; use raw_atom    533  * Unsafe to use in noinstr code; use raw_atomic_fetch_inc_acquire() there.
534  *                                                534  *
535  * Return: The original value of @v.              535  * Return: The original value of @v.
536  */                                               536  */
537 static __always_inline int                        537 static __always_inline int
538 atomic_fetch_inc_acquire(atomic_t *v)             538 atomic_fetch_inc_acquire(atomic_t *v)
539 {                                                 539 {
540         instrument_atomic_read_write(v, sizeof    540         instrument_atomic_read_write(v, sizeof(*v));
541         return raw_atomic_fetch_inc_acquire(v)    541         return raw_atomic_fetch_inc_acquire(v);
542 }                                                 542 }
543                                                   543 
544 /**                                               544 /**
545  * atomic_fetch_inc_release() - atomic increme    545  * atomic_fetch_inc_release() - atomic increment with release ordering
546  * @v: pointer to atomic_t                        546  * @v: pointer to atomic_t
547  *                                                547  *
548  * Atomically updates @v to (@v + 1) with rele    548  * Atomically updates @v to (@v + 1) with release ordering.
549  *                                                549  *
550  * Unsafe to use in noinstr code; use raw_atom    550  * Unsafe to use in noinstr code; use raw_atomic_fetch_inc_release() there.
551  *                                                551  *
552  * Return: The original value of @v.              552  * Return: The original value of @v.
553  */                                               553  */
554 static __always_inline int                        554 static __always_inline int
555 atomic_fetch_inc_release(atomic_t *v)             555 atomic_fetch_inc_release(atomic_t *v)
556 {                                                 556 {
557         kcsan_release();                          557         kcsan_release();
558         instrument_atomic_read_write(v, sizeof    558         instrument_atomic_read_write(v, sizeof(*v));
559         return raw_atomic_fetch_inc_release(v)    559         return raw_atomic_fetch_inc_release(v);
560 }                                                 560 }
561                                                   561 
562 /**                                               562 /**
563  * atomic_fetch_inc_relaxed() - atomic increme    563  * atomic_fetch_inc_relaxed() - atomic increment with relaxed ordering
564  * @v: pointer to atomic_t                        564  * @v: pointer to atomic_t
565  *                                                565  *
566  * Atomically updates @v to (@v + 1) with rela    566  * Atomically updates @v to (@v + 1) with relaxed ordering.
567  *                                                567  *
568  * Unsafe to use in noinstr code; use raw_atom    568  * Unsafe to use in noinstr code; use raw_atomic_fetch_inc_relaxed() there.
569  *                                                569  *
570  * Return: The original value of @v.              570  * Return: The original value of @v.
571  */                                               571  */
572 static __always_inline int                        572 static __always_inline int
573 atomic_fetch_inc_relaxed(atomic_t *v)             573 atomic_fetch_inc_relaxed(atomic_t *v)
574 {                                                 574 {
575         instrument_atomic_read_write(v, sizeof    575         instrument_atomic_read_write(v, sizeof(*v));
576         return raw_atomic_fetch_inc_relaxed(v)    576         return raw_atomic_fetch_inc_relaxed(v);
577 }                                                 577 }
578                                                   578 
579 /**                                               579 /**
580  * atomic_dec() - atomic decrement with relaxe    580  * atomic_dec() - atomic decrement with relaxed ordering
581  * @v: pointer to atomic_t                        581  * @v: pointer to atomic_t
582  *                                                582  *
583  * Atomically updates @v to (@v - 1) with rela    583  * Atomically updates @v to (@v - 1) with relaxed ordering.
584  *                                                584  *
585  * Unsafe to use in noinstr code; use raw_atom    585  * Unsafe to use in noinstr code; use raw_atomic_dec() there.
586  *                                                586  *
587  * Return: Nothing.                               587  * Return: Nothing.
588  */                                               588  */
589 static __always_inline void                       589 static __always_inline void
590 atomic_dec(atomic_t *v)                           590 atomic_dec(atomic_t *v)
591 {                                                 591 {
592         instrument_atomic_read_write(v, sizeof    592         instrument_atomic_read_write(v, sizeof(*v));
593         raw_atomic_dec(v);                        593         raw_atomic_dec(v);
594 }                                                 594 }
595                                                   595 
596 /**                                               596 /**
597  * atomic_dec_return() - atomic decrement with    597  * atomic_dec_return() - atomic decrement with full ordering
598  * @v: pointer to atomic_t                        598  * @v: pointer to atomic_t
599  *                                                599  *
600  * Atomically updates @v to (@v - 1) with full    600  * Atomically updates @v to (@v - 1) with full ordering.
601  *                                                601  *
602  * Unsafe to use in noinstr code; use raw_atom    602  * Unsafe to use in noinstr code; use raw_atomic_dec_return() there.
603  *                                                603  *
604  * Return: The updated value of @v.               604  * Return: The updated value of @v.
605  */                                               605  */
606 static __always_inline int                        606 static __always_inline int
607 atomic_dec_return(atomic_t *v)                    607 atomic_dec_return(atomic_t *v)
608 {                                                 608 {
609         kcsan_mb();                               609         kcsan_mb();
610         instrument_atomic_read_write(v, sizeof    610         instrument_atomic_read_write(v, sizeof(*v));
611         return raw_atomic_dec_return(v);          611         return raw_atomic_dec_return(v);
612 }                                                 612 }
613                                                   613 
614 /**                                               614 /**
615  * atomic_dec_return_acquire() - atomic decrem    615  * atomic_dec_return_acquire() - atomic decrement with acquire ordering
616  * @v: pointer to atomic_t                        616  * @v: pointer to atomic_t
617  *                                                617  *
618  * Atomically updates @v to (@v - 1) with acqu    618  * Atomically updates @v to (@v - 1) with acquire ordering.
619  *                                                619  *
620  * Unsafe to use in noinstr code; use raw_atom    620  * Unsafe to use in noinstr code; use raw_atomic_dec_return_acquire() there.
621  *                                                621  *
622  * Return: The updated value of @v.               622  * Return: The updated value of @v.
623  */                                               623  */
624 static __always_inline int                        624 static __always_inline int
625 atomic_dec_return_acquire(atomic_t *v)            625 atomic_dec_return_acquire(atomic_t *v)
626 {                                                 626 {
627         instrument_atomic_read_write(v, sizeof    627         instrument_atomic_read_write(v, sizeof(*v));
628         return raw_atomic_dec_return_acquire(v    628         return raw_atomic_dec_return_acquire(v);
629 }                                                 629 }
630                                                   630 
631 /**                                               631 /**
632  * atomic_dec_return_release() - atomic decrem    632  * atomic_dec_return_release() - atomic decrement with release ordering
633  * @v: pointer to atomic_t                        633  * @v: pointer to atomic_t
634  *                                                634  *
635  * Atomically updates @v to (@v - 1) with rele    635  * Atomically updates @v to (@v - 1) with release ordering.
636  *                                                636  *
637  * Unsafe to use in noinstr code; use raw_atom    637  * Unsafe to use in noinstr code; use raw_atomic_dec_return_release() there.
638  *                                                638  *
639  * Return: The updated value of @v.               639  * Return: The updated value of @v.
640  */                                               640  */
641 static __always_inline int                        641 static __always_inline int
642 atomic_dec_return_release(atomic_t *v)            642 atomic_dec_return_release(atomic_t *v)
643 {                                                 643 {
644         kcsan_release();                          644         kcsan_release();
645         instrument_atomic_read_write(v, sizeof    645         instrument_atomic_read_write(v, sizeof(*v));
646         return raw_atomic_dec_return_release(v    646         return raw_atomic_dec_return_release(v);
647 }                                                 647 }
648                                                   648 
649 /**                                               649 /**
650  * atomic_dec_return_relaxed() - atomic decrem    650  * atomic_dec_return_relaxed() - atomic decrement with relaxed ordering
651  * @v: pointer to atomic_t                        651  * @v: pointer to atomic_t
652  *                                                652  *
653  * Atomically updates @v to (@v - 1) with rela    653  * Atomically updates @v to (@v - 1) with relaxed ordering.
654  *                                                654  *
655  * Unsafe to use in noinstr code; use raw_atom    655  * Unsafe to use in noinstr code; use raw_atomic_dec_return_relaxed() there.
656  *                                                656  *
657  * Return: The updated value of @v.               657  * Return: The updated value of @v.
658  */                                               658  */
659 static __always_inline int                        659 static __always_inline int
660 atomic_dec_return_relaxed(atomic_t *v)            660 atomic_dec_return_relaxed(atomic_t *v)
661 {                                                 661 {
662         instrument_atomic_read_write(v, sizeof    662         instrument_atomic_read_write(v, sizeof(*v));
663         return raw_atomic_dec_return_relaxed(v    663         return raw_atomic_dec_return_relaxed(v);
664 }                                                 664 }
665                                                   665 
666 /**                                               666 /**
667  * atomic_fetch_dec() - atomic decrement with     667  * atomic_fetch_dec() - atomic decrement with full ordering
668  * @v: pointer to atomic_t                        668  * @v: pointer to atomic_t
669  *                                                669  *
670  * Atomically updates @v to (@v - 1) with full    670  * Atomically updates @v to (@v - 1) with full ordering.
671  *                                                671  *
672  * Unsafe to use in noinstr code; use raw_atom    672  * Unsafe to use in noinstr code; use raw_atomic_fetch_dec() there.
673  *                                                673  *
674  * Return: The original value of @v.              674  * Return: The original value of @v.
675  */                                               675  */
676 static __always_inline int                        676 static __always_inline int
677 atomic_fetch_dec(atomic_t *v)                     677 atomic_fetch_dec(atomic_t *v)
678 {                                                 678 {
679         kcsan_mb();                               679         kcsan_mb();
680         instrument_atomic_read_write(v, sizeof    680         instrument_atomic_read_write(v, sizeof(*v));
681         return raw_atomic_fetch_dec(v);           681         return raw_atomic_fetch_dec(v);
682 }                                                 682 }
683                                                   683 
684 /**                                               684 /**
685  * atomic_fetch_dec_acquire() - atomic decreme    685  * atomic_fetch_dec_acquire() - atomic decrement with acquire ordering
686  * @v: pointer to atomic_t                        686  * @v: pointer to atomic_t
687  *                                                687  *
688  * Atomically updates @v to (@v - 1) with acqu    688  * Atomically updates @v to (@v - 1) with acquire ordering.
689  *                                                689  *
690  * Unsafe to use in noinstr code; use raw_atom    690  * Unsafe to use in noinstr code; use raw_atomic_fetch_dec_acquire() there.
691  *                                                691  *
692  * Return: The original value of @v.              692  * Return: The original value of @v.
693  */                                               693  */
694 static __always_inline int                        694 static __always_inline int
695 atomic_fetch_dec_acquire(atomic_t *v)             695 atomic_fetch_dec_acquire(atomic_t *v)
696 {                                                 696 {
697         instrument_atomic_read_write(v, sizeof    697         instrument_atomic_read_write(v, sizeof(*v));
698         return raw_atomic_fetch_dec_acquire(v)    698         return raw_atomic_fetch_dec_acquire(v);
699 }                                                 699 }
700                                                   700 
701 /**                                               701 /**
702  * atomic_fetch_dec_release() - atomic decreme    702  * atomic_fetch_dec_release() - atomic decrement with release ordering
703  * @v: pointer to atomic_t                        703  * @v: pointer to atomic_t
704  *                                                704  *
705  * Atomically updates @v to (@v - 1) with rele    705  * Atomically updates @v to (@v - 1) with release ordering.
706  *                                                706  *
707  * Unsafe to use in noinstr code; use raw_atom    707  * Unsafe to use in noinstr code; use raw_atomic_fetch_dec_release() there.
708  *                                                708  *
709  * Return: The original value of @v.              709  * Return: The original value of @v.
710  */                                               710  */
711 static __always_inline int                        711 static __always_inline int
712 atomic_fetch_dec_release(atomic_t *v)             712 atomic_fetch_dec_release(atomic_t *v)
713 {                                                 713 {
714         kcsan_release();                          714         kcsan_release();
715         instrument_atomic_read_write(v, sizeof    715         instrument_atomic_read_write(v, sizeof(*v));
716         return raw_atomic_fetch_dec_release(v)    716         return raw_atomic_fetch_dec_release(v);
717 }                                                 717 }
718                                                   718 
719 /**                                               719 /**
720  * atomic_fetch_dec_relaxed() - atomic decreme    720  * atomic_fetch_dec_relaxed() - atomic decrement with relaxed ordering
721  * @v: pointer to atomic_t                        721  * @v: pointer to atomic_t
722  *                                                722  *
723  * Atomically updates @v to (@v - 1) with rela    723  * Atomically updates @v to (@v - 1) with relaxed ordering.
724  *                                                724  *
725  * Unsafe to use in noinstr code; use raw_atom    725  * Unsafe to use in noinstr code; use raw_atomic_fetch_dec_relaxed() there.
726  *                                                726  *
727  * Return: The original value of @v.              727  * Return: The original value of @v.
728  */                                               728  */
729 static __always_inline int                        729 static __always_inline int
730 atomic_fetch_dec_relaxed(atomic_t *v)             730 atomic_fetch_dec_relaxed(atomic_t *v)
731 {                                                 731 {
732         instrument_atomic_read_write(v, sizeof    732         instrument_atomic_read_write(v, sizeof(*v));
733         return raw_atomic_fetch_dec_relaxed(v)    733         return raw_atomic_fetch_dec_relaxed(v);
734 }                                                 734 }
735                                                   735 
736 /**                                               736 /**
737  * atomic_and() - atomic bitwise AND with rela    737  * atomic_and() - atomic bitwise AND with relaxed ordering
738  * @i: int value                                  738  * @i: int value
739  * @v: pointer to atomic_t                        739  * @v: pointer to atomic_t
740  *                                                740  *
741  * Atomically updates @v to (@v & @i) with rel    741  * Atomically updates @v to (@v & @i) with relaxed ordering.
742  *                                                742  *
743  * Unsafe to use in noinstr code; use raw_atom    743  * Unsafe to use in noinstr code; use raw_atomic_and() there.
744  *                                                744  *
745  * Return: Nothing.                               745  * Return: Nothing.
746  */                                               746  */
747 static __always_inline void                       747 static __always_inline void
748 atomic_and(int i, atomic_t *v)                    748 atomic_and(int i, atomic_t *v)
749 {                                                 749 {
750         instrument_atomic_read_write(v, sizeof    750         instrument_atomic_read_write(v, sizeof(*v));
751         raw_atomic_and(i, v);                     751         raw_atomic_and(i, v);
752 }                                                 752 }
753                                                   753 
754 /**                                               754 /**
755  * atomic_fetch_and() - atomic bitwise AND wit    755  * atomic_fetch_and() - atomic bitwise AND with full ordering
756  * @i: int value                                  756  * @i: int value
757  * @v: pointer to atomic_t                        757  * @v: pointer to atomic_t
758  *                                                758  *
759  * Atomically updates @v to (@v & @i) with ful    759  * Atomically updates @v to (@v & @i) with full ordering.
760  *                                                760  *
761  * Unsafe to use in noinstr code; use raw_atom    761  * Unsafe to use in noinstr code; use raw_atomic_fetch_and() there.
762  *                                                762  *
763  * Return: The original value of @v.              763  * Return: The original value of @v.
764  */                                               764  */
765 static __always_inline int                        765 static __always_inline int
766 atomic_fetch_and(int i, atomic_t *v)              766 atomic_fetch_and(int i, atomic_t *v)
767 {                                                 767 {
768         kcsan_mb();                               768         kcsan_mb();
769         instrument_atomic_read_write(v, sizeof    769         instrument_atomic_read_write(v, sizeof(*v));
770         return raw_atomic_fetch_and(i, v);        770         return raw_atomic_fetch_and(i, v);
771 }                                                 771 }
772                                                   772 
773 /**                                               773 /**
774  * atomic_fetch_and_acquire() - atomic bitwise    774  * atomic_fetch_and_acquire() - atomic bitwise AND with acquire ordering
775  * @i: int value                                  775  * @i: int value
776  * @v: pointer to atomic_t                        776  * @v: pointer to atomic_t
777  *                                                777  *
778  * Atomically updates @v to (@v & @i) with acq    778  * Atomically updates @v to (@v & @i) with acquire ordering.
779  *                                                779  *
780  * Unsafe to use in noinstr code; use raw_atom    780  * Unsafe to use in noinstr code; use raw_atomic_fetch_and_acquire() there.
781  *                                                781  *
782  * Return: The original value of @v.              782  * Return: The original value of @v.
783  */                                               783  */
784 static __always_inline int                        784 static __always_inline int
785 atomic_fetch_and_acquire(int i, atomic_t *v)      785 atomic_fetch_and_acquire(int i, atomic_t *v)
786 {                                                 786 {
787         instrument_atomic_read_write(v, sizeof    787         instrument_atomic_read_write(v, sizeof(*v));
788         return raw_atomic_fetch_and_acquire(i,    788         return raw_atomic_fetch_and_acquire(i, v);
789 }                                                 789 }
790                                                   790 
791 /**                                               791 /**
792  * atomic_fetch_and_release() - atomic bitwise    792  * atomic_fetch_and_release() - atomic bitwise AND with release ordering
793  * @i: int value                                  793  * @i: int value
794  * @v: pointer to atomic_t                        794  * @v: pointer to atomic_t
795  *                                                795  *
796  * Atomically updates @v to (@v & @i) with rel    796  * Atomically updates @v to (@v & @i) with release ordering.
797  *                                                797  *
798  * Unsafe to use in noinstr code; use raw_atom    798  * Unsafe to use in noinstr code; use raw_atomic_fetch_and_release() there.
799  *                                                799  *
800  * Return: The original value of @v.              800  * Return: The original value of @v.
801  */                                               801  */
802 static __always_inline int                        802 static __always_inline int
803 atomic_fetch_and_release(int i, atomic_t *v)      803 atomic_fetch_and_release(int i, atomic_t *v)
804 {                                                 804 {
805         kcsan_release();                          805         kcsan_release();
806         instrument_atomic_read_write(v, sizeof    806         instrument_atomic_read_write(v, sizeof(*v));
807         return raw_atomic_fetch_and_release(i,    807         return raw_atomic_fetch_and_release(i, v);
808 }                                                 808 }
809                                                   809 
810 /**                                               810 /**
811  * atomic_fetch_and_relaxed() - atomic bitwise    811  * atomic_fetch_and_relaxed() - atomic bitwise AND with relaxed ordering
812  * @i: int value                                  812  * @i: int value
813  * @v: pointer to atomic_t                        813  * @v: pointer to atomic_t
814  *                                                814  *
815  * Atomically updates @v to (@v & @i) with rel    815  * Atomically updates @v to (@v & @i) with relaxed ordering.
816  *                                                816  *
817  * Unsafe to use in noinstr code; use raw_atom    817  * Unsafe to use in noinstr code; use raw_atomic_fetch_and_relaxed() there.
818  *                                                818  *
819  * Return: The original value of @v.              819  * Return: The original value of @v.
820  */                                               820  */
821 static __always_inline int                        821 static __always_inline int
822 atomic_fetch_and_relaxed(int i, atomic_t *v)      822 atomic_fetch_and_relaxed(int i, atomic_t *v)
823 {                                                 823 {
824         instrument_atomic_read_write(v, sizeof    824         instrument_atomic_read_write(v, sizeof(*v));
825         return raw_atomic_fetch_and_relaxed(i,    825         return raw_atomic_fetch_and_relaxed(i, v);
826 }                                                 826 }
827                                                   827 
828 /**                                               828 /**
829  * atomic_andnot() - atomic bitwise AND NOT wi    829  * atomic_andnot() - atomic bitwise AND NOT with relaxed ordering
830  * @i: int value                                  830  * @i: int value
831  * @v: pointer to atomic_t                        831  * @v: pointer to atomic_t
832  *                                                832  *
833  * Atomically updates @v to (@v & ~@i) with re    833  * Atomically updates @v to (@v & ~@i) with relaxed ordering.
834  *                                                834  *
835  * Unsafe to use in noinstr code; use raw_atom    835  * Unsafe to use in noinstr code; use raw_atomic_andnot() there.
836  *                                                836  *
837  * Return: Nothing.                               837  * Return: Nothing.
838  */                                               838  */
839 static __always_inline void                       839 static __always_inline void
840 atomic_andnot(int i, atomic_t *v)                 840 atomic_andnot(int i, atomic_t *v)
841 {                                                 841 {
842         instrument_atomic_read_write(v, sizeof    842         instrument_atomic_read_write(v, sizeof(*v));
843         raw_atomic_andnot(i, v);                  843         raw_atomic_andnot(i, v);
844 }                                                 844 }
845                                                   845 
846 /**                                               846 /**
847  * atomic_fetch_andnot() - atomic bitwise AND     847  * atomic_fetch_andnot() - atomic bitwise AND NOT with full ordering
848  * @i: int value                                  848  * @i: int value
849  * @v: pointer to atomic_t                        849  * @v: pointer to atomic_t
850  *                                                850  *
851  * Atomically updates @v to (@v & ~@i) with fu    851  * Atomically updates @v to (@v & ~@i) with full ordering.
852  *                                                852  *
853  * Unsafe to use in noinstr code; use raw_atom    853  * Unsafe to use in noinstr code; use raw_atomic_fetch_andnot() there.
854  *                                                854  *
855  * Return: The original value of @v.              855  * Return: The original value of @v.
856  */                                               856  */
857 static __always_inline int                        857 static __always_inline int
858 atomic_fetch_andnot(int i, atomic_t *v)           858 atomic_fetch_andnot(int i, atomic_t *v)
859 {                                                 859 {
860         kcsan_mb();                               860         kcsan_mb();
861         instrument_atomic_read_write(v, sizeof    861         instrument_atomic_read_write(v, sizeof(*v));
862         return raw_atomic_fetch_andnot(i, v);     862         return raw_atomic_fetch_andnot(i, v);
863 }                                                 863 }
864                                                   864 
865 /**                                               865 /**
866  * atomic_fetch_andnot_acquire() - atomic bitw    866  * atomic_fetch_andnot_acquire() - atomic bitwise AND NOT with acquire ordering
867  * @i: int value                                  867  * @i: int value
868  * @v: pointer to atomic_t                        868  * @v: pointer to atomic_t
869  *                                                869  *
870  * Atomically updates @v to (@v & ~@i) with ac    870  * Atomically updates @v to (@v & ~@i) with acquire ordering.
871  *                                                871  *
872  * Unsafe to use in noinstr code; use raw_atom    872  * Unsafe to use in noinstr code; use raw_atomic_fetch_andnot_acquire() there.
873  *                                                873  *
874  * Return: The original value of @v.              874  * Return: The original value of @v.
875  */                                               875  */
876 static __always_inline int                        876 static __always_inline int
877 atomic_fetch_andnot_acquire(int i, atomic_t *v    877 atomic_fetch_andnot_acquire(int i, atomic_t *v)
878 {                                                 878 {
879         instrument_atomic_read_write(v, sizeof    879         instrument_atomic_read_write(v, sizeof(*v));
880         return raw_atomic_fetch_andnot_acquire    880         return raw_atomic_fetch_andnot_acquire(i, v);
881 }                                                 881 }
882                                                   882 
883 /**                                               883 /**
884  * atomic_fetch_andnot_release() - atomic bitw    884  * atomic_fetch_andnot_release() - atomic bitwise AND NOT with release ordering
885  * @i: int value                                  885  * @i: int value
886  * @v: pointer to atomic_t                        886  * @v: pointer to atomic_t
887  *                                                887  *
888  * Atomically updates @v to (@v & ~@i) with re    888  * Atomically updates @v to (@v & ~@i) with release ordering.
889  *                                                889  *
890  * Unsafe to use in noinstr code; use raw_atom    890  * Unsafe to use in noinstr code; use raw_atomic_fetch_andnot_release() there.
891  *                                                891  *
892  * Return: The original value of @v.              892  * Return: The original value of @v.
893  */                                               893  */
894 static __always_inline int                        894 static __always_inline int
895 atomic_fetch_andnot_release(int i, atomic_t *v    895 atomic_fetch_andnot_release(int i, atomic_t *v)
896 {                                                 896 {
897         kcsan_release();                          897         kcsan_release();
898         instrument_atomic_read_write(v, sizeof    898         instrument_atomic_read_write(v, sizeof(*v));
899         return raw_atomic_fetch_andnot_release    899         return raw_atomic_fetch_andnot_release(i, v);
900 }                                                 900 }
901                                                   901 
902 /**                                               902 /**
903  * atomic_fetch_andnot_relaxed() - atomic bitw    903  * atomic_fetch_andnot_relaxed() - atomic bitwise AND NOT with relaxed ordering
904  * @i: int value                                  904  * @i: int value
905  * @v: pointer to atomic_t                        905  * @v: pointer to atomic_t
906  *                                                906  *
907  * Atomically updates @v to (@v & ~@i) with re    907  * Atomically updates @v to (@v & ~@i) with relaxed ordering.
908  *                                                908  *
909  * Unsafe to use in noinstr code; use raw_atom    909  * Unsafe to use in noinstr code; use raw_atomic_fetch_andnot_relaxed() there.
910  *                                                910  *
911  * Return: The original value of @v.              911  * Return: The original value of @v.
912  */                                               912  */
913 static __always_inline int                        913 static __always_inline int
914 atomic_fetch_andnot_relaxed(int i, atomic_t *v    914 atomic_fetch_andnot_relaxed(int i, atomic_t *v)
915 {                                                 915 {
916         instrument_atomic_read_write(v, sizeof    916         instrument_atomic_read_write(v, sizeof(*v));
917         return raw_atomic_fetch_andnot_relaxed    917         return raw_atomic_fetch_andnot_relaxed(i, v);
918 }                                                 918 }
919                                                   919 
920 /**                                               920 /**
921  * atomic_or() - atomic bitwise OR with relaxe    921  * atomic_or() - atomic bitwise OR with relaxed ordering
922  * @i: int value                                  922  * @i: int value
923  * @v: pointer to atomic_t                        923  * @v: pointer to atomic_t
924  *                                                924  *
925  * Atomically updates @v to (@v | @i) with rel    925  * Atomically updates @v to (@v | @i) with relaxed ordering.
926  *                                                926  *
927  * Unsafe to use in noinstr code; use raw_atom    927  * Unsafe to use in noinstr code; use raw_atomic_or() there.
928  *                                                928  *
929  * Return: Nothing.                               929  * Return: Nothing.
930  */                                               930  */
931 static __always_inline void                       931 static __always_inline void
932 atomic_or(int i, atomic_t *v)                     932 atomic_or(int i, atomic_t *v)
933 {                                                 933 {
934         instrument_atomic_read_write(v, sizeof    934         instrument_atomic_read_write(v, sizeof(*v));
935         raw_atomic_or(i, v);                      935         raw_atomic_or(i, v);
936 }                                                 936 }
937                                                   937 
938 /**                                               938 /**
939  * atomic_fetch_or() - atomic bitwise OR with     939  * atomic_fetch_or() - atomic bitwise OR with full ordering
940  * @i: int value                                  940  * @i: int value
941  * @v: pointer to atomic_t                        941  * @v: pointer to atomic_t
942  *                                                942  *
943  * Atomically updates @v to (@v | @i) with ful    943  * Atomically updates @v to (@v | @i) with full ordering.
944  *                                                944  *
945  * Unsafe to use in noinstr code; use raw_atom    945  * Unsafe to use in noinstr code; use raw_atomic_fetch_or() there.
946  *                                                946  *
947  * Return: The original value of @v.              947  * Return: The original value of @v.
948  */                                               948  */
949 static __always_inline int                        949 static __always_inline int
950 atomic_fetch_or(int i, atomic_t *v)               950 atomic_fetch_or(int i, atomic_t *v)
951 {                                                 951 {
952         kcsan_mb();                               952         kcsan_mb();
953         instrument_atomic_read_write(v, sizeof    953         instrument_atomic_read_write(v, sizeof(*v));
954         return raw_atomic_fetch_or(i, v);         954         return raw_atomic_fetch_or(i, v);
955 }                                                 955 }
956                                                   956 
957 /**                                               957 /**
958  * atomic_fetch_or_acquire() - atomic bitwise     958  * atomic_fetch_or_acquire() - atomic bitwise OR with acquire ordering
959  * @i: int value                                  959  * @i: int value
960  * @v: pointer to atomic_t                        960  * @v: pointer to atomic_t
961  *                                                961  *
962  * Atomically updates @v to (@v | @i) with acq    962  * Atomically updates @v to (@v | @i) with acquire ordering.
963  *                                                963  *
964  * Unsafe to use in noinstr code; use raw_atom    964  * Unsafe to use in noinstr code; use raw_atomic_fetch_or_acquire() there.
965  *                                                965  *
966  * Return: The original value of @v.              966  * Return: The original value of @v.
967  */                                               967  */
968 static __always_inline int                        968 static __always_inline int
969 atomic_fetch_or_acquire(int i, atomic_t *v)       969 atomic_fetch_or_acquire(int i, atomic_t *v)
970 {                                                 970 {
971         instrument_atomic_read_write(v, sizeof    971         instrument_atomic_read_write(v, sizeof(*v));
972         return raw_atomic_fetch_or_acquire(i,     972         return raw_atomic_fetch_or_acquire(i, v);
973 }                                                 973 }
974                                                   974 
975 /**                                               975 /**
976  * atomic_fetch_or_release() - atomic bitwise     976  * atomic_fetch_or_release() - atomic bitwise OR with release ordering
977  * @i: int value                                  977  * @i: int value
978  * @v: pointer to atomic_t                        978  * @v: pointer to atomic_t
979  *                                                979  *
980  * Atomically updates @v to (@v | @i) with rel    980  * Atomically updates @v to (@v | @i) with release ordering.
981  *                                                981  *
982  * Unsafe to use in noinstr code; use raw_atom    982  * Unsafe to use in noinstr code; use raw_atomic_fetch_or_release() there.
983  *                                                983  *
984  * Return: The original value of @v.              984  * Return: The original value of @v.
985  */                                               985  */
986 static __always_inline int                        986 static __always_inline int
987 atomic_fetch_or_release(int i, atomic_t *v)       987 atomic_fetch_or_release(int i, atomic_t *v)
988 {                                                 988 {
989         kcsan_release();                          989         kcsan_release();
990         instrument_atomic_read_write(v, sizeof    990         instrument_atomic_read_write(v, sizeof(*v));
991         return raw_atomic_fetch_or_release(i,     991         return raw_atomic_fetch_or_release(i, v);
992 }                                                 992 }
993                                                   993 
994 /**                                               994 /**
995  * atomic_fetch_or_relaxed() - atomic bitwise     995  * atomic_fetch_or_relaxed() - atomic bitwise OR with relaxed ordering
996  * @i: int value                                  996  * @i: int value
997  * @v: pointer to atomic_t                        997  * @v: pointer to atomic_t
998  *                                                998  *
999  * Atomically updates @v to (@v | @i) with rel    999  * Atomically updates @v to (@v | @i) with relaxed ordering.
1000  *                                               1000  *
1001  * Unsafe to use in noinstr code; use raw_ato    1001  * Unsafe to use in noinstr code; use raw_atomic_fetch_or_relaxed() there.
1002  *                                               1002  *
1003  * Return: The original value of @v.             1003  * Return: The original value of @v.
1004  */                                              1004  */
1005 static __always_inline int                       1005 static __always_inline int
1006 atomic_fetch_or_relaxed(int i, atomic_t *v)      1006 atomic_fetch_or_relaxed(int i, atomic_t *v)
1007 {                                                1007 {
1008         instrument_atomic_read_write(v, sizeo    1008         instrument_atomic_read_write(v, sizeof(*v));
1009         return raw_atomic_fetch_or_relaxed(i,    1009         return raw_atomic_fetch_or_relaxed(i, v);
1010 }                                                1010 }
1011                                                  1011 
1012 /**                                              1012 /**
1013  * atomic_xor() - atomic bitwise XOR with rel    1013  * atomic_xor() - atomic bitwise XOR with relaxed ordering
1014  * @i: int value                                 1014  * @i: int value
1015  * @v: pointer to atomic_t                       1015  * @v: pointer to atomic_t
1016  *                                               1016  *
1017  * Atomically updates @v to (@v ^ @i) with re    1017  * Atomically updates @v to (@v ^ @i) with relaxed ordering.
1018  *                                               1018  *
1019  * Unsafe to use in noinstr code; use raw_ato    1019  * Unsafe to use in noinstr code; use raw_atomic_xor() there.
1020  *                                               1020  *
1021  * Return: Nothing.                              1021  * Return: Nothing.
1022  */                                              1022  */
1023 static __always_inline void                      1023 static __always_inline void
1024 atomic_xor(int i, atomic_t *v)                   1024 atomic_xor(int i, atomic_t *v)
1025 {                                                1025 {
1026         instrument_atomic_read_write(v, sizeo    1026         instrument_atomic_read_write(v, sizeof(*v));
1027         raw_atomic_xor(i, v);                    1027         raw_atomic_xor(i, v);
1028 }                                                1028 }
1029                                                  1029 
1030 /**                                              1030 /**
1031  * atomic_fetch_xor() - atomic bitwise XOR wi    1031  * atomic_fetch_xor() - atomic bitwise XOR with full ordering
1032  * @i: int value                                 1032  * @i: int value
1033  * @v: pointer to atomic_t                       1033  * @v: pointer to atomic_t
1034  *                                               1034  *
1035  * Atomically updates @v to (@v ^ @i) with fu    1035  * Atomically updates @v to (@v ^ @i) with full ordering.
1036  *                                               1036  *
1037  * Unsafe to use in noinstr code; use raw_ato    1037  * Unsafe to use in noinstr code; use raw_atomic_fetch_xor() there.
1038  *                                               1038  *
1039  * Return: The original value of @v.             1039  * Return: The original value of @v.
1040  */                                              1040  */
1041 static __always_inline int                       1041 static __always_inline int
1042 atomic_fetch_xor(int i, atomic_t *v)             1042 atomic_fetch_xor(int i, atomic_t *v)
1043 {                                                1043 {
1044         kcsan_mb();                              1044         kcsan_mb();
1045         instrument_atomic_read_write(v, sizeo    1045         instrument_atomic_read_write(v, sizeof(*v));
1046         return raw_atomic_fetch_xor(i, v);       1046         return raw_atomic_fetch_xor(i, v);
1047 }                                                1047 }
1048                                                  1048 
1049 /**                                              1049 /**
1050  * atomic_fetch_xor_acquire() - atomic bitwis    1050  * atomic_fetch_xor_acquire() - atomic bitwise XOR with acquire ordering
1051  * @i: int value                                 1051  * @i: int value
1052  * @v: pointer to atomic_t                       1052  * @v: pointer to atomic_t
1053  *                                               1053  *
1054  * Atomically updates @v to (@v ^ @i) with ac    1054  * Atomically updates @v to (@v ^ @i) with acquire ordering.
1055  *                                               1055  *
1056  * Unsafe to use in noinstr code; use raw_ato    1056  * Unsafe to use in noinstr code; use raw_atomic_fetch_xor_acquire() there.
1057  *                                               1057  *
1058  * Return: The original value of @v.             1058  * Return: The original value of @v.
1059  */                                              1059  */
1060 static __always_inline int                       1060 static __always_inline int
1061 atomic_fetch_xor_acquire(int i, atomic_t *v)     1061 atomic_fetch_xor_acquire(int i, atomic_t *v)
1062 {                                                1062 {
1063         instrument_atomic_read_write(v, sizeo    1063         instrument_atomic_read_write(v, sizeof(*v));
1064         return raw_atomic_fetch_xor_acquire(i    1064         return raw_atomic_fetch_xor_acquire(i, v);
1065 }                                                1065 }
1066                                                  1066 
1067 /**                                              1067 /**
1068  * atomic_fetch_xor_release() - atomic bitwis    1068  * atomic_fetch_xor_release() - atomic bitwise XOR with release ordering
1069  * @i: int value                                 1069  * @i: int value
1070  * @v: pointer to atomic_t                       1070  * @v: pointer to atomic_t
1071  *                                               1071  *
1072  * Atomically updates @v to (@v ^ @i) with re    1072  * Atomically updates @v to (@v ^ @i) with release ordering.
1073  *                                               1073  *
1074  * Unsafe to use in noinstr code; use raw_ato    1074  * Unsafe to use in noinstr code; use raw_atomic_fetch_xor_release() there.
1075  *                                               1075  *
1076  * Return: The original value of @v.             1076  * Return: The original value of @v.
1077  */                                              1077  */
1078 static __always_inline int                       1078 static __always_inline int
1079 atomic_fetch_xor_release(int i, atomic_t *v)     1079 atomic_fetch_xor_release(int i, atomic_t *v)
1080 {                                                1080 {
1081         kcsan_release();                         1081         kcsan_release();
1082         instrument_atomic_read_write(v, sizeo    1082         instrument_atomic_read_write(v, sizeof(*v));
1083         return raw_atomic_fetch_xor_release(i    1083         return raw_atomic_fetch_xor_release(i, v);
1084 }                                                1084 }
1085                                                  1085 
1086 /**                                              1086 /**
1087  * atomic_fetch_xor_relaxed() - atomic bitwis    1087  * atomic_fetch_xor_relaxed() - atomic bitwise XOR with relaxed ordering
1088  * @i: int value                                 1088  * @i: int value
1089  * @v: pointer to atomic_t                       1089  * @v: pointer to atomic_t
1090  *                                               1090  *
1091  * Atomically updates @v to (@v ^ @i) with re    1091  * Atomically updates @v to (@v ^ @i) with relaxed ordering.
1092  *                                               1092  *
1093  * Unsafe to use in noinstr code; use raw_ato    1093  * Unsafe to use in noinstr code; use raw_atomic_fetch_xor_relaxed() there.
1094  *                                               1094  *
1095  * Return: The original value of @v.             1095  * Return: The original value of @v.
1096  */                                              1096  */
1097 static __always_inline int                       1097 static __always_inline int
1098 atomic_fetch_xor_relaxed(int i, atomic_t *v)     1098 atomic_fetch_xor_relaxed(int i, atomic_t *v)
1099 {                                                1099 {
1100         instrument_atomic_read_write(v, sizeo    1100         instrument_atomic_read_write(v, sizeof(*v));
1101         return raw_atomic_fetch_xor_relaxed(i    1101         return raw_atomic_fetch_xor_relaxed(i, v);
1102 }                                                1102 }
1103                                                  1103 
1104 /**                                              1104 /**
1105  * atomic_xchg() - atomic exchange with full     1105  * atomic_xchg() - atomic exchange with full ordering
1106  * @v: pointer to atomic_t                       1106  * @v: pointer to atomic_t
1107  * @new: int value to assign                     1107  * @new: int value to assign
1108  *                                               1108  *
1109  * Atomically updates @v to @new with full or    1109  * Atomically updates @v to @new with full ordering.
1110  *                                               1110  *
1111  * Unsafe to use in noinstr code; use raw_ato    1111  * Unsafe to use in noinstr code; use raw_atomic_xchg() there.
1112  *                                               1112  *
1113  * Return: The original value of @v.             1113  * Return: The original value of @v.
1114  */                                              1114  */
1115 static __always_inline int                       1115 static __always_inline int
1116 atomic_xchg(atomic_t *v, int new)                1116 atomic_xchg(atomic_t *v, int new)
1117 {                                                1117 {
1118         kcsan_mb();                              1118         kcsan_mb();
1119         instrument_atomic_read_write(v, sizeo    1119         instrument_atomic_read_write(v, sizeof(*v));
1120         return raw_atomic_xchg(v, new);          1120         return raw_atomic_xchg(v, new);
1121 }                                                1121 }
1122                                                  1122 
1123 /**                                              1123 /**
1124  * atomic_xchg_acquire() - atomic exchange wi    1124  * atomic_xchg_acquire() - atomic exchange with acquire ordering
1125  * @v: pointer to atomic_t                       1125  * @v: pointer to atomic_t
1126  * @new: int value to assign                     1126  * @new: int value to assign
1127  *                                               1127  *
1128  * Atomically updates @v to @new with acquire    1128  * Atomically updates @v to @new with acquire ordering.
1129  *                                               1129  *
1130  * Unsafe to use in noinstr code; use raw_ato    1130  * Unsafe to use in noinstr code; use raw_atomic_xchg_acquire() there.
1131  *                                               1131  *
1132  * Return: The original value of @v.             1132  * Return: The original value of @v.
1133  */                                              1133  */
1134 static __always_inline int                       1134 static __always_inline int
1135 atomic_xchg_acquire(atomic_t *v, int new)        1135 atomic_xchg_acquire(atomic_t *v, int new)
1136 {                                                1136 {
1137         instrument_atomic_read_write(v, sizeo    1137         instrument_atomic_read_write(v, sizeof(*v));
1138         return raw_atomic_xchg_acquire(v, new    1138         return raw_atomic_xchg_acquire(v, new);
1139 }                                                1139 }
1140                                                  1140 
1141 /**                                              1141 /**
1142  * atomic_xchg_release() - atomic exchange wi    1142  * atomic_xchg_release() - atomic exchange with release ordering
1143  * @v: pointer to atomic_t                       1143  * @v: pointer to atomic_t
1144  * @new: int value to assign                     1144  * @new: int value to assign
1145  *                                               1145  *
1146  * Atomically updates @v to @new with release    1146  * Atomically updates @v to @new with release ordering.
1147  *                                               1147  *
1148  * Unsafe to use in noinstr code; use raw_ato    1148  * Unsafe to use in noinstr code; use raw_atomic_xchg_release() there.
1149  *                                               1149  *
1150  * Return: The original value of @v.             1150  * Return: The original value of @v.
1151  */                                              1151  */
1152 static __always_inline int                       1152 static __always_inline int
1153 atomic_xchg_release(atomic_t *v, int new)        1153 atomic_xchg_release(atomic_t *v, int new)
1154 {                                                1154 {
1155         kcsan_release();                         1155         kcsan_release();
1156         instrument_atomic_read_write(v, sizeo    1156         instrument_atomic_read_write(v, sizeof(*v));
1157         return raw_atomic_xchg_release(v, new    1157         return raw_atomic_xchg_release(v, new);
1158 }                                                1158 }
1159                                                  1159 
1160 /**                                              1160 /**
1161  * atomic_xchg_relaxed() - atomic exchange wi    1161  * atomic_xchg_relaxed() - atomic exchange with relaxed ordering
1162  * @v: pointer to atomic_t                       1162  * @v: pointer to atomic_t
1163  * @new: int value to assign                     1163  * @new: int value to assign
1164  *                                               1164  *
1165  * Atomically updates @v to @new with relaxed    1165  * Atomically updates @v to @new with relaxed ordering.
1166  *                                               1166  *
1167  * Unsafe to use in noinstr code; use raw_ato    1167  * Unsafe to use in noinstr code; use raw_atomic_xchg_relaxed() there.
1168  *                                               1168  *
1169  * Return: The original value of @v.             1169  * Return: The original value of @v.
1170  */                                              1170  */
1171 static __always_inline int                       1171 static __always_inline int
1172 atomic_xchg_relaxed(atomic_t *v, int new)        1172 atomic_xchg_relaxed(atomic_t *v, int new)
1173 {                                                1173 {
1174         instrument_atomic_read_write(v, sizeo    1174         instrument_atomic_read_write(v, sizeof(*v));
1175         return raw_atomic_xchg_relaxed(v, new    1175         return raw_atomic_xchg_relaxed(v, new);
1176 }                                                1176 }
1177                                                  1177 
1178 /**                                              1178 /**
1179  * atomic_cmpxchg() - atomic compare and exch    1179  * atomic_cmpxchg() - atomic compare and exchange with full ordering
1180  * @v: pointer to atomic_t                       1180  * @v: pointer to atomic_t
1181  * @old: int value to compare with               1181  * @old: int value to compare with
1182  * @new: int value to assign                     1182  * @new: int value to assign
1183  *                                               1183  *
1184  * If (@v == @old), atomically updates @v to     1184  * If (@v == @old), atomically updates @v to @new with full ordering.
1185  * Otherwise, @v is not modified and relaxed     1185  * Otherwise, @v is not modified and relaxed ordering is provided.
1186  *                                               1186  *
1187  * Unsafe to use in noinstr code; use raw_ato    1187  * Unsafe to use in noinstr code; use raw_atomic_cmpxchg() there.
1188  *                                               1188  *
1189  * Return: The original value of @v.             1189  * Return: The original value of @v.
1190  */                                              1190  */
1191 static __always_inline int                       1191 static __always_inline int
1192 atomic_cmpxchg(atomic_t *v, int old, int new)    1192 atomic_cmpxchg(atomic_t *v, int old, int new)
1193 {                                                1193 {
1194         kcsan_mb();                              1194         kcsan_mb();
1195         instrument_atomic_read_write(v, sizeo    1195         instrument_atomic_read_write(v, sizeof(*v));
1196         return raw_atomic_cmpxchg(v, old, new    1196         return raw_atomic_cmpxchg(v, old, new);
1197 }                                                1197 }
1198                                                  1198 
1199 /**                                              1199 /**
1200  * atomic_cmpxchg_acquire() - atomic compare     1200  * atomic_cmpxchg_acquire() - atomic compare and exchange with acquire ordering
1201  * @v: pointer to atomic_t                       1201  * @v: pointer to atomic_t
1202  * @old: int value to compare with               1202  * @old: int value to compare with
1203  * @new: int value to assign                     1203  * @new: int value to assign
1204  *                                               1204  *
1205  * If (@v == @old), atomically updates @v to     1205  * If (@v == @old), atomically updates @v to @new with acquire ordering.
1206  * Otherwise, @v is not modified and relaxed     1206  * Otherwise, @v is not modified and relaxed ordering is provided.
1207  *                                               1207  *
1208  * Unsafe to use in noinstr code; use raw_ato    1208  * Unsafe to use in noinstr code; use raw_atomic_cmpxchg_acquire() there.
1209  *                                               1209  *
1210  * Return: The original value of @v.             1210  * Return: The original value of @v.
1211  */                                              1211  */
1212 static __always_inline int                       1212 static __always_inline int
1213 atomic_cmpxchg_acquire(atomic_t *v, int old,     1213 atomic_cmpxchg_acquire(atomic_t *v, int old, int new)
1214 {                                                1214 {
1215         instrument_atomic_read_write(v, sizeo    1215         instrument_atomic_read_write(v, sizeof(*v));
1216         return raw_atomic_cmpxchg_acquire(v,     1216         return raw_atomic_cmpxchg_acquire(v, old, new);
1217 }                                                1217 }
1218                                                  1218 
1219 /**                                              1219 /**
1220  * atomic_cmpxchg_release() - atomic compare     1220  * atomic_cmpxchg_release() - atomic compare and exchange with release ordering
1221  * @v: pointer to atomic_t                       1221  * @v: pointer to atomic_t
1222  * @old: int value to compare with               1222  * @old: int value to compare with
1223  * @new: int value to assign                     1223  * @new: int value to assign
1224  *                                               1224  *
1225  * If (@v == @old), atomically updates @v to     1225  * If (@v == @old), atomically updates @v to @new with release ordering.
1226  * Otherwise, @v is not modified and relaxed     1226  * Otherwise, @v is not modified and relaxed ordering is provided.
1227  *                                               1227  *
1228  * Unsafe to use in noinstr code; use raw_ato    1228  * Unsafe to use in noinstr code; use raw_atomic_cmpxchg_release() there.
1229  *                                               1229  *
1230  * Return: The original value of @v.             1230  * Return: The original value of @v.
1231  */                                              1231  */
1232 static __always_inline int                       1232 static __always_inline int
1233 atomic_cmpxchg_release(atomic_t *v, int old,     1233 atomic_cmpxchg_release(atomic_t *v, int old, int new)
1234 {                                                1234 {
1235         kcsan_release();                         1235         kcsan_release();
1236         instrument_atomic_read_write(v, sizeo    1236         instrument_atomic_read_write(v, sizeof(*v));
1237         return raw_atomic_cmpxchg_release(v,     1237         return raw_atomic_cmpxchg_release(v, old, new);
1238 }                                                1238 }
1239                                                  1239 
1240 /**                                              1240 /**
1241  * atomic_cmpxchg_relaxed() - atomic compare     1241  * atomic_cmpxchg_relaxed() - atomic compare and exchange with relaxed ordering
1242  * @v: pointer to atomic_t                       1242  * @v: pointer to atomic_t
1243  * @old: int value to compare with               1243  * @old: int value to compare with
1244  * @new: int value to assign                     1244  * @new: int value to assign
1245  *                                               1245  *
1246  * If (@v == @old), atomically updates @v to     1246  * If (@v == @old), atomically updates @v to @new with relaxed ordering.
1247  * Otherwise, @v is not modified and relaxed     1247  * Otherwise, @v is not modified and relaxed ordering is provided.
1248  *                                               1248  *
1249  * Unsafe to use in noinstr code; use raw_ato    1249  * Unsafe to use in noinstr code; use raw_atomic_cmpxchg_relaxed() there.
1250  *                                               1250  *
1251  * Return: The original value of @v.             1251  * Return: The original value of @v.
1252  */                                              1252  */
1253 static __always_inline int                       1253 static __always_inline int
1254 atomic_cmpxchg_relaxed(atomic_t *v, int old,     1254 atomic_cmpxchg_relaxed(atomic_t *v, int old, int new)
1255 {                                                1255 {
1256         instrument_atomic_read_write(v, sizeo    1256         instrument_atomic_read_write(v, sizeof(*v));
1257         return raw_atomic_cmpxchg_relaxed(v,     1257         return raw_atomic_cmpxchg_relaxed(v, old, new);
1258 }                                                1258 }
1259                                                  1259 
1260 /**                                              1260 /**
1261  * atomic_try_cmpxchg() - atomic compare and     1261  * atomic_try_cmpxchg() - atomic compare and exchange with full ordering
1262  * @v: pointer to atomic_t                       1262  * @v: pointer to atomic_t
1263  * @old: pointer to int value to compare with    1263  * @old: pointer to int value to compare with
1264  * @new: int value to assign                     1264  * @new: int value to assign
1265  *                                               1265  *
1266  * If (@v == @old), atomically updates @v to     1266  * If (@v == @old), atomically updates @v to @new with full ordering.
1267  * Otherwise, @v is not modified, @old is upd    1267  * Otherwise, @v is not modified, @old is updated to the current value of @v,
1268  * and relaxed ordering is provided.             1268  * and relaxed ordering is provided.
1269  *                                               1269  *
1270  * Unsafe to use in noinstr code; use raw_ato    1270  * Unsafe to use in noinstr code; use raw_atomic_try_cmpxchg() there.
1271  *                                               1271  *
1272  * Return: @true if the exchange occured, @fa    1272  * Return: @true if the exchange occured, @false otherwise.
1273  */                                              1273  */
1274 static __always_inline bool                      1274 static __always_inline bool
1275 atomic_try_cmpxchg(atomic_t *v, int *old, int    1275 atomic_try_cmpxchg(atomic_t *v, int *old, int new)
1276 {                                                1276 {
1277         kcsan_mb();                              1277         kcsan_mb();
1278         instrument_atomic_read_write(v, sizeo    1278         instrument_atomic_read_write(v, sizeof(*v));
1279         instrument_atomic_read_write(old, siz    1279         instrument_atomic_read_write(old, sizeof(*old));
1280         return raw_atomic_try_cmpxchg(v, old,    1280         return raw_atomic_try_cmpxchg(v, old, new);
1281 }                                                1281 }
1282                                                  1282 
1283 /**                                              1283 /**
1284  * atomic_try_cmpxchg_acquire() - atomic comp    1284  * atomic_try_cmpxchg_acquire() - atomic compare and exchange with acquire ordering
1285  * @v: pointer to atomic_t                       1285  * @v: pointer to atomic_t
1286  * @old: pointer to int value to compare with    1286  * @old: pointer to int value to compare with
1287  * @new: int value to assign                     1287  * @new: int value to assign
1288  *                                               1288  *
1289  * If (@v == @old), atomically updates @v to     1289  * If (@v == @old), atomically updates @v to @new with acquire ordering.
1290  * Otherwise, @v is not modified, @old is upd    1290  * Otherwise, @v is not modified, @old is updated to the current value of @v,
1291  * and relaxed ordering is provided.             1291  * and relaxed ordering is provided.
1292  *                                               1292  *
1293  * Unsafe to use in noinstr code; use raw_ato    1293  * Unsafe to use in noinstr code; use raw_atomic_try_cmpxchg_acquire() there.
1294  *                                               1294  *
1295  * Return: @true if the exchange occured, @fa    1295  * Return: @true if the exchange occured, @false otherwise.
1296  */                                              1296  */
1297 static __always_inline bool                      1297 static __always_inline bool
1298 atomic_try_cmpxchg_acquire(atomic_t *v, int *    1298 atomic_try_cmpxchg_acquire(atomic_t *v, int *old, int new)
1299 {                                                1299 {
1300         instrument_atomic_read_write(v, sizeo    1300         instrument_atomic_read_write(v, sizeof(*v));
1301         instrument_atomic_read_write(old, siz    1301         instrument_atomic_read_write(old, sizeof(*old));
1302         return raw_atomic_try_cmpxchg_acquire    1302         return raw_atomic_try_cmpxchg_acquire(v, old, new);
1303 }                                                1303 }
1304                                                  1304 
1305 /**                                              1305 /**
1306  * atomic_try_cmpxchg_release() - atomic comp    1306  * atomic_try_cmpxchg_release() - atomic compare and exchange with release ordering
1307  * @v: pointer to atomic_t                       1307  * @v: pointer to atomic_t
1308  * @old: pointer to int value to compare with    1308  * @old: pointer to int value to compare with
1309  * @new: int value to assign                     1309  * @new: int value to assign
1310  *                                               1310  *
1311  * If (@v == @old), atomically updates @v to     1311  * If (@v == @old), atomically updates @v to @new with release ordering.
1312  * Otherwise, @v is not modified, @old is upd    1312  * Otherwise, @v is not modified, @old is updated to the current value of @v,
1313  * and relaxed ordering is provided.             1313  * and relaxed ordering is provided.
1314  *                                               1314  *
1315  * Unsafe to use in noinstr code; use raw_ato    1315  * Unsafe to use in noinstr code; use raw_atomic_try_cmpxchg_release() there.
1316  *                                               1316  *
1317  * Return: @true if the exchange occured, @fa    1317  * Return: @true if the exchange occured, @false otherwise.
1318  */                                              1318  */
1319 static __always_inline bool                      1319 static __always_inline bool
1320 atomic_try_cmpxchg_release(atomic_t *v, int *    1320 atomic_try_cmpxchg_release(atomic_t *v, int *old, int new)
1321 {                                                1321 {
1322         kcsan_release();                         1322         kcsan_release();
1323         instrument_atomic_read_write(v, sizeo    1323         instrument_atomic_read_write(v, sizeof(*v));
1324         instrument_atomic_read_write(old, siz    1324         instrument_atomic_read_write(old, sizeof(*old));
1325         return raw_atomic_try_cmpxchg_release    1325         return raw_atomic_try_cmpxchg_release(v, old, new);
1326 }                                                1326 }
1327                                                  1327 
1328 /**                                              1328 /**
1329  * atomic_try_cmpxchg_relaxed() - atomic comp    1329  * atomic_try_cmpxchg_relaxed() - atomic compare and exchange with relaxed ordering
1330  * @v: pointer to atomic_t                       1330  * @v: pointer to atomic_t
1331  * @old: pointer to int value to compare with    1331  * @old: pointer to int value to compare with
1332  * @new: int value to assign                     1332  * @new: int value to assign
1333  *                                               1333  *
1334  * If (@v == @old), atomically updates @v to     1334  * If (@v == @old), atomically updates @v to @new with relaxed ordering.
1335  * Otherwise, @v is not modified, @old is upd    1335  * Otherwise, @v is not modified, @old is updated to the current value of @v,
1336  * and relaxed ordering is provided.             1336  * and relaxed ordering is provided.
1337  *                                               1337  *
1338  * Unsafe to use in noinstr code; use raw_ato    1338  * Unsafe to use in noinstr code; use raw_atomic_try_cmpxchg_relaxed() there.
1339  *                                               1339  *
1340  * Return: @true if the exchange occured, @fa    1340  * Return: @true if the exchange occured, @false otherwise.
1341  */                                              1341  */
1342 static __always_inline bool                      1342 static __always_inline bool
1343 atomic_try_cmpxchg_relaxed(atomic_t *v, int *    1343 atomic_try_cmpxchg_relaxed(atomic_t *v, int *old, int new)
1344 {                                                1344 {
1345         instrument_atomic_read_write(v, sizeo    1345         instrument_atomic_read_write(v, sizeof(*v));
1346         instrument_atomic_read_write(old, siz    1346         instrument_atomic_read_write(old, sizeof(*old));
1347         return raw_atomic_try_cmpxchg_relaxed    1347         return raw_atomic_try_cmpxchg_relaxed(v, old, new);
1348 }                                                1348 }
1349                                                  1349 
1350 /**                                              1350 /**
1351  * atomic_sub_and_test() - atomic subtract an    1351  * atomic_sub_and_test() - atomic subtract and test if zero with full ordering
1352  * @i: int value to subtract                     1352  * @i: int value to subtract
1353  * @v: pointer to atomic_t                       1353  * @v: pointer to atomic_t
1354  *                                               1354  *
1355  * Atomically updates @v to (@v - @i) with fu    1355  * Atomically updates @v to (@v - @i) with full ordering.
1356  *                                               1356  *
1357  * Unsafe to use in noinstr code; use raw_ato    1357  * Unsafe to use in noinstr code; use raw_atomic_sub_and_test() there.
1358  *                                               1358  *
1359  * Return: @true if the resulting value of @v    1359  * Return: @true if the resulting value of @v is zero, @false otherwise.
1360  */                                              1360  */
1361 static __always_inline bool                      1361 static __always_inline bool
1362 atomic_sub_and_test(int i, atomic_t *v)          1362 atomic_sub_and_test(int i, atomic_t *v)
1363 {                                                1363 {
1364         kcsan_mb();                              1364         kcsan_mb();
1365         instrument_atomic_read_write(v, sizeo    1365         instrument_atomic_read_write(v, sizeof(*v));
1366         return raw_atomic_sub_and_test(i, v);    1366         return raw_atomic_sub_and_test(i, v);
1367 }                                                1367 }
1368                                                  1368 
1369 /**                                              1369 /**
1370  * atomic_dec_and_test() - atomic decrement a    1370  * atomic_dec_and_test() - atomic decrement and test if zero with full ordering
1371  * @v: pointer to atomic_t                       1371  * @v: pointer to atomic_t
1372  *                                               1372  *
1373  * Atomically updates @v to (@v - 1) with ful    1373  * Atomically updates @v to (@v - 1) with full ordering.
1374  *                                               1374  *
1375  * Unsafe to use in noinstr code; use raw_ato    1375  * Unsafe to use in noinstr code; use raw_atomic_dec_and_test() there.
1376  *                                               1376  *
1377  * Return: @true if the resulting value of @v    1377  * Return: @true if the resulting value of @v is zero, @false otherwise.
1378  */                                              1378  */
1379 static __always_inline bool                      1379 static __always_inline bool
1380 atomic_dec_and_test(atomic_t *v)                 1380 atomic_dec_and_test(atomic_t *v)
1381 {                                                1381 {
1382         kcsan_mb();                              1382         kcsan_mb();
1383         instrument_atomic_read_write(v, sizeo    1383         instrument_atomic_read_write(v, sizeof(*v));
1384         return raw_atomic_dec_and_test(v);       1384         return raw_atomic_dec_and_test(v);
1385 }                                                1385 }
1386                                                  1386 
1387 /**                                              1387 /**
1388  * atomic_inc_and_test() - atomic increment a    1388  * atomic_inc_and_test() - atomic increment and test if zero with full ordering
1389  * @v: pointer to atomic_t                       1389  * @v: pointer to atomic_t
1390  *                                               1390  *
1391  * Atomically updates @v to (@v + 1) with ful    1391  * Atomically updates @v to (@v + 1) with full ordering.
1392  *                                               1392  *
1393  * Unsafe to use in noinstr code; use raw_ato    1393  * Unsafe to use in noinstr code; use raw_atomic_inc_and_test() there.
1394  *                                               1394  *
1395  * Return: @true if the resulting value of @v    1395  * Return: @true if the resulting value of @v is zero, @false otherwise.
1396  */                                              1396  */
1397 static __always_inline bool                      1397 static __always_inline bool
1398 atomic_inc_and_test(atomic_t *v)                 1398 atomic_inc_and_test(atomic_t *v)
1399 {                                                1399 {
1400         kcsan_mb();                              1400         kcsan_mb();
1401         instrument_atomic_read_write(v, sizeo    1401         instrument_atomic_read_write(v, sizeof(*v));
1402         return raw_atomic_inc_and_test(v);       1402         return raw_atomic_inc_and_test(v);
1403 }                                                1403 }
1404                                                  1404 
1405 /**                                              1405 /**
1406  * atomic_add_negative() - atomic add and tes    1406  * atomic_add_negative() - atomic add and test if negative with full ordering
1407  * @i: int value to add                          1407  * @i: int value to add
1408  * @v: pointer to atomic_t                       1408  * @v: pointer to atomic_t
1409  *                                               1409  *
1410  * Atomically updates @v to (@v + @i) with fu    1410  * Atomically updates @v to (@v + @i) with full ordering.
1411  *                                               1411  *
1412  * Unsafe to use in noinstr code; use raw_ato    1412  * Unsafe to use in noinstr code; use raw_atomic_add_negative() there.
1413  *                                               1413  *
1414  * Return: @true if the resulting value of @v    1414  * Return: @true if the resulting value of @v is negative, @false otherwise.
1415  */                                              1415  */
1416 static __always_inline bool                      1416 static __always_inline bool
1417 atomic_add_negative(int i, atomic_t *v)          1417 atomic_add_negative(int i, atomic_t *v)
1418 {                                                1418 {
1419         kcsan_mb();                              1419         kcsan_mb();
1420         instrument_atomic_read_write(v, sizeo    1420         instrument_atomic_read_write(v, sizeof(*v));
1421         return raw_atomic_add_negative(i, v);    1421         return raw_atomic_add_negative(i, v);
1422 }                                                1422 }
1423                                                  1423 
1424 /**                                              1424 /**
1425  * atomic_add_negative_acquire() - atomic add    1425  * atomic_add_negative_acquire() - atomic add and test if negative with acquire ordering
1426  * @i: int value to add                          1426  * @i: int value to add
1427  * @v: pointer to atomic_t                       1427  * @v: pointer to atomic_t
1428  *                                               1428  *
1429  * Atomically updates @v to (@v + @i) with ac    1429  * Atomically updates @v to (@v + @i) with acquire ordering.
1430  *                                               1430  *
1431  * Unsafe to use in noinstr code; use raw_ato    1431  * Unsafe to use in noinstr code; use raw_atomic_add_negative_acquire() there.
1432  *                                               1432  *
1433  * Return: @true if the resulting value of @v    1433  * Return: @true if the resulting value of @v is negative, @false otherwise.
1434  */                                              1434  */
1435 static __always_inline bool                      1435 static __always_inline bool
1436 atomic_add_negative_acquire(int i, atomic_t *    1436 atomic_add_negative_acquire(int i, atomic_t *v)
1437 {                                                1437 {
1438         instrument_atomic_read_write(v, sizeo    1438         instrument_atomic_read_write(v, sizeof(*v));
1439         return raw_atomic_add_negative_acquir    1439         return raw_atomic_add_negative_acquire(i, v);
1440 }                                                1440 }
1441                                                  1441 
1442 /**                                              1442 /**
1443  * atomic_add_negative_release() - atomic add    1443  * atomic_add_negative_release() - atomic add and test if negative with release ordering
1444  * @i: int value to add                          1444  * @i: int value to add
1445  * @v: pointer to atomic_t                       1445  * @v: pointer to atomic_t
1446  *                                               1446  *
1447  * Atomically updates @v to (@v + @i) with re    1447  * Atomically updates @v to (@v + @i) with release ordering.
1448  *                                               1448  *
1449  * Unsafe to use in noinstr code; use raw_ato    1449  * Unsafe to use in noinstr code; use raw_atomic_add_negative_release() there.
1450  *                                               1450  *
1451  * Return: @true if the resulting value of @v    1451  * Return: @true if the resulting value of @v is negative, @false otherwise.
1452  */                                              1452  */
1453 static __always_inline bool                      1453 static __always_inline bool
1454 atomic_add_negative_release(int i, atomic_t *    1454 atomic_add_negative_release(int i, atomic_t *v)
1455 {                                                1455 {
1456         kcsan_release();                         1456         kcsan_release();
1457         instrument_atomic_read_write(v, sizeo    1457         instrument_atomic_read_write(v, sizeof(*v));
1458         return raw_atomic_add_negative_releas    1458         return raw_atomic_add_negative_release(i, v);
1459 }                                                1459 }
1460                                                  1460 
1461 /**                                              1461 /**
1462  * atomic_add_negative_relaxed() - atomic add    1462  * atomic_add_negative_relaxed() - atomic add and test if negative with relaxed ordering
1463  * @i: int value to add                          1463  * @i: int value to add
1464  * @v: pointer to atomic_t                       1464  * @v: pointer to atomic_t
1465  *                                               1465  *
1466  * Atomically updates @v to (@v + @i) with re    1466  * Atomically updates @v to (@v + @i) with relaxed ordering.
1467  *                                               1467  *
1468  * Unsafe to use in noinstr code; use raw_ato    1468  * Unsafe to use in noinstr code; use raw_atomic_add_negative_relaxed() there.
1469  *                                               1469  *
1470  * Return: @true if the resulting value of @v    1470  * Return: @true if the resulting value of @v is negative, @false otherwise.
1471  */                                              1471  */
1472 static __always_inline bool                      1472 static __always_inline bool
1473 atomic_add_negative_relaxed(int i, atomic_t *    1473 atomic_add_negative_relaxed(int i, atomic_t *v)
1474 {                                                1474 {
1475         instrument_atomic_read_write(v, sizeo    1475         instrument_atomic_read_write(v, sizeof(*v));
1476         return raw_atomic_add_negative_relaxe    1476         return raw_atomic_add_negative_relaxed(i, v);
1477 }                                                1477 }
1478                                                  1478 
1479 /**                                              1479 /**
1480  * atomic_fetch_add_unless() - atomic add unl    1480  * atomic_fetch_add_unless() - atomic add unless value with full ordering
1481  * @v: pointer to atomic_t                       1481  * @v: pointer to atomic_t
1482  * @a: int value to add                          1482  * @a: int value to add
1483  * @u: int value to compare with                 1483  * @u: int value to compare with
1484  *                                               1484  *
1485  * If (@v != @u), atomically updates @v to (@    1485  * If (@v != @u), atomically updates @v to (@v + @a) with full ordering.
1486  * Otherwise, @v is not modified and relaxed     1486  * Otherwise, @v is not modified and relaxed ordering is provided.
1487  *                                               1487  *
1488  * Unsafe to use in noinstr code; use raw_ato    1488  * Unsafe to use in noinstr code; use raw_atomic_fetch_add_unless() there.
1489  *                                               1489  *
1490  * Return: The original value of @v.             1490  * Return: The original value of @v.
1491  */                                              1491  */
1492 static __always_inline int                       1492 static __always_inline int
1493 atomic_fetch_add_unless(atomic_t *v, int a, i    1493 atomic_fetch_add_unless(atomic_t *v, int a, int u)
1494 {                                                1494 {
1495         kcsan_mb();                              1495         kcsan_mb();
1496         instrument_atomic_read_write(v, sizeo    1496         instrument_atomic_read_write(v, sizeof(*v));
1497         return raw_atomic_fetch_add_unless(v,    1497         return raw_atomic_fetch_add_unless(v, a, u);
1498 }                                                1498 }
1499                                                  1499 
1500 /**                                              1500 /**
1501  * atomic_add_unless() - atomic add unless va    1501  * atomic_add_unless() - atomic add unless value with full ordering
1502  * @v: pointer to atomic_t                       1502  * @v: pointer to atomic_t
1503  * @a: int value to add                          1503  * @a: int value to add
1504  * @u: int value to compare with                 1504  * @u: int value to compare with
1505  *                                               1505  *
1506  * If (@v != @u), atomically updates @v to (@    1506  * If (@v != @u), atomically updates @v to (@v + @a) with full ordering.
1507  * Otherwise, @v is not modified and relaxed     1507  * Otherwise, @v is not modified and relaxed ordering is provided.
1508  *                                               1508  *
1509  * Unsafe to use in noinstr code; use raw_ato    1509  * Unsafe to use in noinstr code; use raw_atomic_add_unless() there.
1510  *                                               1510  *
1511  * Return: @true if @v was updated, @false ot    1511  * Return: @true if @v was updated, @false otherwise.
1512  */                                              1512  */
1513 static __always_inline bool                      1513 static __always_inline bool
1514 atomic_add_unless(atomic_t *v, int a, int u)     1514 atomic_add_unless(atomic_t *v, int a, int u)
1515 {                                                1515 {
1516         kcsan_mb();                              1516         kcsan_mb();
1517         instrument_atomic_read_write(v, sizeo    1517         instrument_atomic_read_write(v, sizeof(*v));
1518         return raw_atomic_add_unless(v, a, u)    1518         return raw_atomic_add_unless(v, a, u);
1519 }                                                1519 }
1520                                                  1520 
1521 /**                                              1521 /**
1522  * atomic_inc_not_zero() - atomic increment u    1522  * atomic_inc_not_zero() - atomic increment unless zero with full ordering
1523  * @v: pointer to atomic_t                       1523  * @v: pointer to atomic_t
1524  *                                               1524  *
1525  * If (@v != 0), atomically updates @v to (@v    1525  * If (@v != 0), atomically updates @v to (@v + 1) with full ordering.
1526  * Otherwise, @v is not modified and relaxed     1526  * Otherwise, @v is not modified and relaxed ordering is provided.
1527  *                                               1527  *
1528  * Unsafe to use in noinstr code; use raw_ato    1528  * Unsafe to use in noinstr code; use raw_atomic_inc_not_zero() there.
1529  *                                               1529  *
1530  * Return: @true if @v was updated, @false ot    1530  * Return: @true if @v was updated, @false otherwise.
1531  */                                              1531  */
1532 static __always_inline bool                      1532 static __always_inline bool
1533 atomic_inc_not_zero(atomic_t *v)                 1533 atomic_inc_not_zero(atomic_t *v)
1534 {                                                1534 {
1535         kcsan_mb();                              1535         kcsan_mb();
1536         instrument_atomic_read_write(v, sizeo    1536         instrument_atomic_read_write(v, sizeof(*v));
1537         return raw_atomic_inc_not_zero(v);       1537         return raw_atomic_inc_not_zero(v);
1538 }                                                1538 }
1539                                                  1539 
1540 /**                                              1540 /**
1541  * atomic_inc_unless_negative() - atomic incr    1541  * atomic_inc_unless_negative() - atomic increment unless negative with full ordering
1542  * @v: pointer to atomic_t                       1542  * @v: pointer to atomic_t
1543  *                                               1543  *
1544  * If (@v >= 0), atomically updates @v to (@v    1544  * If (@v >= 0), atomically updates @v to (@v + 1) with full ordering.
1545  * Otherwise, @v is not modified and relaxed     1545  * Otherwise, @v is not modified and relaxed ordering is provided.
1546  *                                               1546  *
1547  * Unsafe to use in noinstr code; use raw_ato    1547  * Unsafe to use in noinstr code; use raw_atomic_inc_unless_negative() there.
1548  *                                               1548  *
1549  * Return: @true if @v was updated, @false ot    1549  * Return: @true if @v was updated, @false otherwise.
1550  */                                              1550  */
1551 static __always_inline bool                      1551 static __always_inline bool
1552 atomic_inc_unless_negative(atomic_t *v)          1552 atomic_inc_unless_negative(atomic_t *v)
1553 {                                                1553 {
1554         kcsan_mb();                              1554         kcsan_mb();
1555         instrument_atomic_read_write(v, sizeo    1555         instrument_atomic_read_write(v, sizeof(*v));
1556         return raw_atomic_inc_unless_negative    1556         return raw_atomic_inc_unless_negative(v);
1557 }                                                1557 }
1558                                                  1558 
1559 /**                                              1559 /**
1560  * atomic_dec_unless_positive() - atomic decr    1560  * atomic_dec_unless_positive() - atomic decrement unless positive with full ordering
1561  * @v: pointer to atomic_t                       1561  * @v: pointer to atomic_t
1562  *                                               1562  *
1563  * If (@v <= 0), atomically updates @v to (@v    1563  * If (@v <= 0), atomically updates @v to (@v - 1) with full ordering.
1564  * Otherwise, @v is not modified and relaxed     1564  * Otherwise, @v is not modified and relaxed ordering is provided.
1565  *                                               1565  *
1566  * Unsafe to use in noinstr code; use raw_ato    1566  * Unsafe to use in noinstr code; use raw_atomic_dec_unless_positive() there.
1567  *                                               1567  *
1568  * Return: @true if @v was updated, @false ot    1568  * Return: @true if @v was updated, @false otherwise.
1569  */                                              1569  */
1570 static __always_inline bool                      1570 static __always_inline bool
1571 atomic_dec_unless_positive(atomic_t *v)          1571 atomic_dec_unless_positive(atomic_t *v)
1572 {                                                1572 {
1573         kcsan_mb();                              1573         kcsan_mb();
1574         instrument_atomic_read_write(v, sizeo    1574         instrument_atomic_read_write(v, sizeof(*v));
1575         return raw_atomic_dec_unless_positive    1575         return raw_atomic_dec_unless_positive(v);
1576 }                                                1576 }
1577                                                  1577 
1578 /**                                              1578 /**
1579  * atomic_dec_if_positive() - atomic decremen    1579  * atomic_dec_if_positive() - atomic decrement if positive with full ordering
1580  * @v: pointer to atomic_t                       1580  * @v: pointer to atomic_t
1581  *                                               1581  *
1582  * If (@v > 0), atomically updates @v to (@v     1582  * If (@v > 0), atomically updates @v to (@v - 1) with full ordering.
1583  * Otherwise, @v is not modified and relaxed     1583  * Otherwise, @v is not modified and relaxed ordering is provided.
1584  *                                               1584  *
1585  * Unsafe to use in noinstr code; use raw_ato    1585  * Unsafe to use in noinstr code; use raw_atomic_dec_if_positive() there.
1586  *                                               1586  *
1587  * Return: The old value of (@v - 1), regardl    1587  * Return: The old value of (@v - 1), regardless of whether @v was updated.
1588  */                                              1588  */
1589 static __always_inline int                       1589 static __always_inline int
1590 atomic_dec_if_positive(atomic_t *v)              1590 atomic_dec_if_positive(atomic_t *v)
1591 {                                                1591 {
1592         kcsan_mb();                              1592         kcsan_mb();
1593         instrument_atomic_read_write(v, sizeo    1593         instrument_atomic_read_write(v, sizeof(*v));
1594         return raw_atomic_dec_if_positive(v);    1594         return raw_atomic_dec_if_positive(v);
1595 }                                                1595 }
1596                                                  1596 
1597 /**                                              1597 /**
1598  * atomic64_read() - atomic load with relaxed    1598  * atomic64_read() - atomic load with relaxed ordering
1599  * @v: pointer to atomic64_t                     1599  * @v: pointer to atomic64_t
1600  *                                               1600  *
1601  * Atomically loads the value of @v with rela    1601  * Atomically loads the value of @v with relaxed ordering.
1602  *                                               1602  *
1603  * Unsafe to use in noinstr code; use raw_ato    1603  * Unsafe to use in noinstr code; use raw_atomic64_read() there.
1604  *                                               1604  *
1605  * Return: The value loaded from @v.             1605  * Return: The value loaded from @v.
1606  */                                              1606  */
1607 static __always_inline s64                       1607 static __always_inline s64
1608 atomic64_read(const atomic64_t *v)               1608 atomic64_read(const atomic64_t *v)
1609 {                                                1609 {
1610         instrument_atomic_read(v, sizeof(*v))    1610         instrument_atomic_read(v, sizeof(*v));
1611         return raw_atomic64_read(v);             1611         return raw_atomic64_read(v);
1612 }                                                1612 }
1613                                                  1613 
1614 /**                                              1614 /**
1615  * atomic64_read_acquire() - atomic load with    1615  * atomic64_read_acquire() - atomic load with acquire ordering
1616  * @v: pointer to atomic64_t                     1616  * @v: pointer to atomic64_t
1617  *                                               1617  *
1618  * Atomically loads the value of @v with acqu    1618  * Atomically loads the value of @v with acquire ordering.
1619  *                                               1619  *
1620  * Unsafe to use in noinstr code; use raw_ato    1620  * Unsafe to use in noinstr code; use raw_atomic64_read_acquire() there.
1621  *                                               1621  *
1622  * Return: The value loaded from @v.             1622  * Return: The value loaded from @v.
1623  */                                              1623  */
1624 static __always_inline s64                       1624 static __always_inline s64
1625 atomic64_read_acquire(const atomic64_t *v)       1625 atomic64_read_acquire(const atomic64_t *v)
1626 {                                                1626 {
1627         instrument_atomic_read(v, sizeof(*v))    1627         instrument_atomic_read(v, sizeof(*v));
1628         return raw_atomic64_read_acquire(v);     1628         return raw_atomic64_read_acquire(v);
1629 }                                                1629 }
1630                                                  1630 
1631 /**                                              1631 /**
1632  * atomic64_set() - atomic set with relaxed o    1632  * atomic64_set() - atomic set with relaxed ordering
1633  * @v: pointer to atomic64_t                     1633  * @v: pointer to atomic64_t
1634  * @i: s64 value to assign                       1634  * @i: s64 value to assign
1635  *                                               1635  *
1636  * Atomically sets @v to @i with relaxed orde    1636  * Atomically sets @v to @i with relaxed ordering.
1637  *                                               1637  *
1638  * Unsafe to use in noinstr code; use raw_ato    1638  * Unsafe to use in noinstr code; use raw_atomic64_set() there.
1639  *                                               1639  *
1640  * Return: Nothing.                              1640  * Return: Nothing.
1641  */                                              1641  */
1642 static __always_inline void                      1642 static __always_inline void
1643 atomic64_set(atomic64_t *v, s64 i)               1643 atomic64_set(atomic64_t *v, s64 i)
1644 {                                                1644 {
1645         instrument_atomic_write(v, sizeof(*v)    1645         instrument_atomic_write(v, sizeof(*v));
1646         raw_atomic64_set(v, i);                  1646         raw_atomic64_set(v, i);
1647 }                                                1647 }
1648                                                  1648 
1649 /**                                              1649 /**
1650  * atomic64_set_release() - atomic set with r    1650  * atomic64_set_release() - atomic set with release ordering
1651  * @v: pointer to atomic64_t                     1651  * @v: pointer to atomic64_t
1652  * @i: s64 value to assign                       1652  * @i: s64 value to assign
1653  *                                               1653  *
1654  * Atomically sets @v to @i with release orde    1654  * Atomically sets @v to @i with release ordering.
1655  *                                               1655  *
1656  * Unsafe to use in noinstr code; use raw_ato    1656  * Unsafe to use in noinstr code; use raw_atomic64_set_release() there.
1657  *                                               1657  *
1658  * Return: Nothing.                              1658  * Return: Nothing.
1659  */                                              1659  */
1660 static __always_inline void                      1660 static __always_inline void
1661 atomic64_set_release(atomic64_t *v, s64 i)       1661 atomic64_set_release(atomic64_t *v, s64 i)
1662 {                                                1662 {
1663         kcsan_release();                         1663         kcsan_release();
1664         instrument_atomic_write(v, sizeof(*v)    1664         instrument_atomic_write(v, sizeof(*v));
1665         raw_atomic64_set_release(v, i);          1665         raw_atomic64_set_release(v, i);
1666 }                                                1666 }
1667                                                  1667 
1668 /**                                              1668 /**
1669  * atomic64_add() - atomic add with relaxed o    1669  * atomic64_add() - atomic add with relaxed ordering
1670  * @i: s64 value to add                          1670  * @i: s64 value to add
1671  * @v: pointer to atomic64_t                     1671  * @v: pointer to atomic64_t
1672  *                                               1672  *
1673  * Atomically updates @v to (@v + @i) with re    1673  * Atomically updates @v to (@v + @i) with relaxed ordering.
1674  *                                               1674  *
1675  * Unsafe to use in noinstr code; use raw_ato    1675  * Unsafe to use in noinstr code; use raw_atomic64_add() there.
1676  *                                               1676  *
1677  * Return: Nothing.                              1677  * Return: Nothing.
1678  */                                              1678  */
1679 static __always_inline void                      1679 static __always_inline void
1680 atomic64_add(s64 i, atomic64_t *v)               1680 atomic64_add(s64 i, atomic64_t *v)
1681 {                                                1681 {
1682         instrument_atomic_read_write(v, sizeo    1682         instrument_atomic_read_write(v, sizeof(*v));
1683         raw_atomic64_add(i, v);                  1683         raw_atomic64_add(i, v);
1684 }                                                1684 }
1685                                                  1685 
1686 /**                                              1686 /**
1687  * atomic64_add_return() - atomic add with fu    1687  * atomic64_add_return() - atomic add with full ordering
1688  * @i: s64 value to add                          1688  * @i: s64 value to add
1689  * @v: pointer to atomic64_t                     1689  * @v: pointer to atomic64_t
1690  *                                               1690  *
1691  * Atomically updates @v to (@v + @i) with fu    1691  * Atomically updates @v to (@v + @i) with full ordering.
1692  *                                               1692  *
1693  * Unsafe to use in noinstr code; use raw_ato    1693  * Unsafe to use in noinstr code; use raw_atomic64_add_return() there.
1694  *                                               1694  *
1695  * Return: The updated value of @v.              1695  * Return: The updated value of @v.
1696  */                                              1696  */
1697 static __always_inline s64                       1697 static __always_inline s64
1698 atomic64_add_return(s64 i, atomic64_t *v)        1698 atomic64_add_return(s64 i, atomic64_t *v)
1699 {                                                1699 {
1700         kcsan_mb();                              1700         kcsan_mb();
1701         instrument_atomic_read_write(v, sizeo    1701         instrument_atomic_read_write(v, sizeof(*v));
1702         return raw_atomic64_add_return(i, v);    1702         return raw_atomic64_add_return(i, v);
1703 }                                                1703 }
1704                                                  1704 
1705 /**                                              1705 /**
1706  * atomic64_add_return_acquire() - atomic add    1706  * atomic64_add_return_acquire() - atomic add with acquire ordering
1707  * @i: s64 value to add                          1707  * @i: s64 value to add
1708  * @v: pointer to atomic64_t                     1708  * @v: pointer to atomic64_t
1709  *                                               1709  *
1710  * Atomically updates @v to (@v + @i) with ac    1710  * Atomically updates @v to (@v + @i) with acquire ordering.
1711  *                                               1711  *
1712  * Unsafe to use in noinstr code; use raw_ato    1712  * Unsafe to use in noinstr code; use raw_atomic64_add_return_acquire() there.
1713  *                                               1713  *
1714  * Return: The updated value of @v.              1714  * Return: The updated value of @v.
1715  */                                              1715  */
1716 static __always_inline s64                       1716 static __always_inline s64
1717 atomic64_add_return_acquire(s64 i, atomic64_t    1717 atomic64_add_return_acquire(s64 i, atomic64_t *v)
1718 {                                                1718 {
1719         instrument_atomic_read_write(v, sizeo    1719         instrument_atomic_read_write(v, sizeof(*v));
1720         return raw_atomic64_add_return_acquir    1720         return raw_atomic64_add_return_acquire(i, v);
1721 }                                                1721 }
1722                                                  1722 
1723 /**                                              1723 /**
1724  * atomic64_add_return_release() - atomic add    1724  * atomic64_add_return_release() - atomic add with release ordering
1725  * @i: s64 value to add                          1725  * @i: s64 value to add
1726  * @v: pointer to atomic64_t                     1726  * @v: pointer to atomic64_t
1727  *                                               1727  *
1728  * Atomically updates @v to (@v + @i) with re    1728  * Atomically updates @v to (@v + @i) with release ordering.
1729  *                                               1729  *
1730  * Unsafe to use in noinstr code; use raw_ato    1730  * Unsafe to use in noinstr code; use raw_atomic64_add_return_release() there.
1731  *                                               1731  *
1732  * Return: The updated value of @v.              1732  * Return: The updated value of @v.
1733  */                                              1733  */
1734 static __always_inline s64                       1734 static __always_inline s64
1735 atomic64_add_return_release(s64 i, atomic64_t    1735 atomic64_add_return_release(s64 i, atomic64_t *v)
1736 {                                                1736 {
1737         kcsan_release();                         1737         kcsan_release();
1738         instrument_atomic_read_write(v, sizeo    1738         instrument_atomic_read_write(v, sizeof(*v));
1739         return raw_atomic64_add_return_releas    1739         return raw_atomic64_add_return_release(i, v);
1740 }                                                1740 }
1741                                                  1741 
1742 /**                                              1742 /**
1743  * atomic64_add_return_relaxed() - atomic add    1743  * atomic64_add_return_relaxed() - atomic add with relaxed ordering
1744  * @i: s64 value to add                          1744  * @i: s64 value to add
1745  * @v: pointer to atomic64_t                     1745  * @v: pointer to atomic64_t
1746  *                                               1746  *
1747  * Atomically updates @v to (@v + @i) with re    1747  * Atomically updates @v to (@v + @i) with relaxed ordering.
1748  *                                               1748  *
1749  * Unsafe to use in noinstr code; use raw_ato    1749  * Unsafe to use in noinstr code; use raw_atomic64_add_return_relaxed() there.
1750  *                                               1750  *
1751  * Return: The updated value of @v.              1751  * Return: The updated value of @v.
1752  */                                              1752  */
1753 static __always_inline s64                       1753 static __always_inline s64
1754 atomic64_add_return_relaxed(s64 i, atomic64_t    1754 atomic64_add_return_relaxed(s64 i, atomic64_t *v)
1755 {                                                1755 {
1756         instrument_atomic_read_write(v, sizeo    1756         instrument_atomic_read_write(v, sizeof(*v));
1757         return raw_atomic64_add_return_relaxe    1757         return raw_atomic64_add_return_relaxed(i, v);
1758 }                                                1758 }
1759                                                  1759 
1760 /**                                              1760 /**
1761  * atomic64_fetch_add() - atomic add with ful    1761  * atomic64_fetch_add() - atomic add with full ordering
1762  * @i: s64 value to add                          1762  * @i: s64 value to add
1763  * @v: pointer to atomic64_t                     1763  * @v: pointer to atomic64_t
1764  *                                               1764  *
1765  * Atomically updates @v to (@v + @i) with fu    1765  * Atomically updates @v to (@v + @i) with full ordering.
1766  *                                               1766  *
1767  * Unsafe to use in noinstr code; use raw_ato    1767  * Unsafe to use in noinstr code; use raw_atomic64_fetch_add() there.
1768  *                                               1768  *
1769  * Return: The original value of @v.             1769  * Return: The original value of @v.
1770  */                                              1770  */
1771 static __always_inline s64                       1771 static __always_inline s64
1772 atomic64_fetch_add(s64 i, atomic64_t *v)         1772 atomic64_fetch_add(s64 i, atomic64_t *v)
1773 {                                                1773 {
1774         kcsan_mb();                              1774         kcsan_mb();
1775         instrument_atomic_read_write(v, sizeo    1775         instrument_atomic_read_write(v, sizeof(*v));
1776         return raw_atomic64_fetch_add(i, v);     1776         return raw_atomic64_fetch_add(i, v);
1777 }                                                1777 }
1778                                                  1778 
1779 /**                                              1779 /**
1780  * atomic64_fetch_add_acquire() - atomic add     1780  * atomic64_fetch_add_acquire() - atomic add with acquire ordering
1781  * @i: s64 value to add                          1781  * @i: s64 value to add
1782  * @v: pointer to atomic64_t                     1782  * @v: pointer to atomic64_t
1783  *                                               1783  *
1784  * Atomically updates @v to (@v + @i) with ac    1784  * Atomically updates @v to (@v + @i) with acquire ordering.
1785  *                                               1785  *
1786  * Unsafe to use in noinstr code; use raw_ato    1786  * Unsafe to use in noinstr code; use raw_atomic64_fetch_add_acquire() there.
1787  *                                               1787  *
1788  * Return: The original value of @v.             1788  * Return: The original value of @v.
1789  */                                              1789  */
1790 static __always_inline s64                       1790 static __always_inline s64
1791 atomic64_fetch_add_acquire(s64 i, atomic64_t     1791 atomic64_fetch_add_acquire(s64 i, atomic64_t *v)
1792 {                                                1792 {
1793         instrument_atomic_read_write(v, sizeo    1793         instrument_atomic_read_write(v, sizeof(*v));
1794         return raw_atomic64_fetch_add_acquire    1794         return raw_atomic64_fetch_add_acquire(i, v);
1795 }                                                1795 }
1796                                                  1796 
1797 /**                                              1797 /**
1798  * atomic64_fetch_add_release() - atomic add     1798  * atomic64_fetch_add_release() - atomic add with release ordering
1799  * @i: s64 value to add                          1799  * @i: s64 value to add
1800  * @v: pointer to atomic64_t                     1800  * @v: pointer to atomic64_t
1801  *                                               1801  *
1802  * Atomically updates @v to (@v + @i) with re    1802  * Atomically updates @v to (@v + @i) with release ordering.
1803  *                                               1803  *
1804  * Unsafe to use in noinstr code; use raw_ato    1804  * Unsafe to use in noinstr code; use raw_atomic64_fetch_add_release() there.
1805  *                                               1805  *
1806  * Return: The original value of @v.             1806  * Return: The original value of @v.
1807  */                                              1807  */
1808 static __always_inline s64                       1808 static __always_inline s64
1809 atomic64_fetch_add_release(s64 i, atomic64_t     1809 atomic64_fetch_add_release(s64 i, atomic64_t *v)
1810 {                                                1810 {
1811         kcsan_release();                         1811         kcsan_release();
1812         instrument_atomic_read_write(v, sizeo    1812         instrument_atomic_read_write(v, sizeof(*v));
1813         return raw_atomic64_fetch_add_release    1813         return raw_atomic64_fetch_add_release(i, v);
1814 }                                                1814 }
1815                                                  1815 
1816 /**                                              1816 /**
1817  * atomic64_fetch_add_relaxed() - atomic add     1817  * atomic64_fetch_add_relaxed() - atomic add with relaxed ordering
1818  * @i: s64 value to add                          1818  * @i: s64 value to add
1819  * @v: pointer to atomic64_t                     1819  * @v: pointer to atomic64_t
1820  *                                               1820  *
1821  * Atomically updates @v to (@v + @i) with re    1821  * Atomically updates @v to (@v + @i) with relaxed ordering.
1822  *                                               1822  *
1823  * Unsafe to use in noinstr code; use raw_ato    1823  * Unsafe to use in noinstr code; use raw_atomic64_fetch_add_relaxed() there.
1824  *                                               1824  *
1825  * Return: The original value of @v.             1825  * Return: The original value of @v.
1826  */                                              1826  */
1827 static __always_inline s64                       1827 static __always_inline s64
1828 atomic64_fetch_add_relaxed(s64 i, atomic64_t     1828 atomic64_fetch_add_relaxed(s64 i, atomic64_t *v)
1829 {                                                1829 {
1830         instrument_atomic_read_write(v, sizeo    1830         instrument_atomic_read_write(v, sizeof(*v));
1831         return raw_atomic64_fetch_add_relaxed    1831         return raw_atomic64_fetch_add_relaxed(i, v);
1832 }                                                1832 }
1833                                                  1833 
1834 /**                                              1834 /**
1835  * atomic64_sub() - atomic subtract with rela    1835  * atomic64_sub() - atomic subtract with relaxed ordering
1836  * @i: s64 value to subtract                     1836  * @i: s64 value to subtract
1837  * @v: pointer to atomic64_t                     1837  * @v: pointer to atomic64_t
1838  *                                               1838  *
1839  * Atomically updates @v to (@v - @i) with re    1839  * Atomically updates @v to (@v - @i) with relaxed ordering.
1840  *                                               1840  *
1841  * Unsafe to use in noinstr code; use raw_ato    1841  * Unsafe to use in noinstr code; use raw_atomic64_sub() there.
1842  *                                               1842  *
1843  * Return: Nothing.                              1843  * Return: Nothing.
1844  */                                              1844  */
1845 static __always_inline void                      1845 static __always_inline void
1846 atomic64_sub(s64 i, atomic64_t *v)               1846 atomic64_sub(s64 i, atomic64_t *v)
1847 {                                                1847 {
1848         instrument_atomic_read_write(v, sizeo    1848         instrument_atomic_read_write(v, sizeof(*v));
1849         raw_atomic64_sub(i, v);                  1849         raw_atomic64_sub(i, v);
1850 }                                                1850 }
1851                                                  1851 
1852 /**                                              1852 /**
1853  * atomic64_sub_return() - atomic subtract wi    1853  * atomic64_sub_return() - atomic subtract with full ordering
1854  * @i: s64 value to subtract                     1854  * @i: s64 value to subtract
1855  * @v: pointer to atomic64_t                     1855  * @v: pointer to atomic64_t
1856  *                                               1856  *
1857  * Atomically updates @v to (@v - @i) with fu    1857  * Atomically updates @v to (@v - @i) with full ordering.
1858  *                                               1858  *
1859  * Unsafe to use in noinstr code; use raw_ato    1859  * Unsafe to use in noinstr code; use raw_atomic64_sub_return() there.
1860  *                                               1860  *
1861  * Return: The updated value of @v.              1861  * Return: The updated value of @v.
1862  */                                              1862  */
1863 static __always_inline s64                       1863 static __always_inline s64
1864 atomic64_sub_return(s64 i, atomic64_t *v)        1864 atomic64_sub_return(s64 i, atomic64_t *v)
1865 {                                                1865 {
1866         kcsan_mb();                              1866         kcsan_mb();
1867         instrument_atomic_read_write(v, sizeo    1867         instrument_atomic_read_write(v, sizeof(*v));
1868         return raw_atomic64_sub_return(i, v);    1868         return raw_atomic64_sub_return(i, v);
1869 }                                                1869 }
1870                                                  1870 
1871 /**                                              1871 /**
1872  * atomic64_sub_return_acquire() - atomic sub    1872  * atomic64_sub_return_acquire() - atomic subtract with acquire ordering
1873  * @i: s64 value to subtract                     1873  * @i: s64 value to subtract
1874  * @v: pointer to atomic64_t                     1874  * @v: pointer to atomic64_t
1875  *                                               1875  *
1876  * Atomically updates @v to (@v - @i) with ac    1876  * Atomically updates @v to (@v - @i) with acquire ordering.
1877  *                                               1877  *
1878  * Unsafe to use in noinstr code; use raw_ato    1878  * Unsafe to use in noinstr code; use raw_atomic64_sub_return_acquire() there.
1879  *                                               1879  *
1880  * Return: The updated value of @v.              1880  * Return: The updated value of @v.
1881  */                                              1881  */
1882 static __always_inline s64                       1882 static __always_inline s64
1883 atomic64_sub_return_acquire(s64 i, atomic64_t    1883 atomic64_sub_return_acquire(s64 i, atomic64_t *v)
1884 {                                                1884 {
1885         instrument_atomic_read_write(v, sizeo    1885         instrument_atomic_read_write(v, sizeof(*v));
1886         return raw_atomic64_sub_return_acquir    1886         return raw_atomic64_sub_return_acquire(i, v);
1887 }                                                1887 }
1888                                                  1888 
1889 /**                                              1889 /**
1890  * atomic64_sub_return_release() - atomic sub    1890  * atomic64_sub_return_release() - atomic subtract with release ordering
1891  * @i: s64 value to subtract                     1891  * @i: s64 value to subtract
1892  * @v: pointer to atomic64_t                     1892  * @v: pointer to atomic64_t
1893  *                                               1893  *
1894  * Atomically updates @v to (@v - @i) with re    1894  * Atomically updates @v to (@v - @i) with release ordering.
1895  *                                               1895  *
1896  * Unsafe to use in noinstr code; use raw_ato    1896  * Unsafe to use in noinstr code; use raw_atomic64_sub_return_release() there.
1897  *                                               1897  *
1898  * Return: The updated value of @v.              1898  * Return: The updated value of @v.
1899  */                                              1899  */
1900 static __always_inline s64                       1900 static __always_inline s64
1901 atomic64_sub_return_release(s64 i, atomic64_t    1901 atomic64_sub_return_release(s64 i, atomic64_t *v)
1902 {                                                1902 {
1903         kcsan_release();                         1903         kcsan_release();
1904         instrument_atomic_read_write(v, sizeo    1904         instrument_atomic_read_write(v, sizeof(*v));
1905         return raw_atomic64_sub_return_releas    1905         return raw_atomic64_sub_return_release(i, v);
1906 }                                                1906 }
1907                                                  1907 
1908 /**                                              1908 /**
1909  * atomic64_sub_return_relaxed() - atomic sub    1909  * atomic64_sub_return_relaxed() - atomic subtract with relaxed ordering
1910  * @i: s64 value to subtract                     1910  * @i: s64 value to subtract
1911  * @v: pointer to atomic64_t                     1911  * @v: pointer to atomic64_t
1912  *                                               1912  *
1913  * Atomically updates @v to (@v - @i) with re    1913  * Atomically updates @v to (@v - @i) with relaxed ordering.
1914  *                                               1914  *
1915  * Unsafe to use in noinstr code; use raw_ato    1915  * Unsafe to use in noinstr code; use raw_atomic64_sub_return_relaxed() there.
1916  *                                               1916  *
1917  * Return: The updated value of @v.              1917  * Return: The updated value of @v.
1918  */                                              1918  */
1919 static __always_inline s64                       1919 static __always_inline s64
1920 atomic64_sub_return_relaxed(s64 i, atomic64_t    1920 atomic64_sub_return_relaxed(s64 i, atomic64_t *v)
1921 {                                                1921 {
1922         instrument_atomic_read_write(v, sizeo    1922         instrument_atomic_read_write(v, sizeof(*v));
1923         return raw_atomic64_sub_return_relaxe    1923         return raw_atomic64_sub_return_relaxed(i, v);
1924 }                                                1924 }
1925                                                  1925 
1926 /**                                              1926 /**
1927  * atomic64_fetch_sub() - atomic subtract wit    1927  * atomic64_fetch_sub() - atomic subtract with full ordering
1928  * @i: s64 value to subtract                     1928  * @i: s64 value to subtract
1929  * @v: pointer to atomic64_t                     1929  * @v: pointer to atomic64_t
1930  *                                               1930  *
1931  * Atomically updates @v to (@v - @i) with fu    1931  * Atomically updates @v to (@v - @i) with full ordering.
1932  *                                               1932  *
1933  * Unsafe to use in noinstr code; use raw_ato    1933  * Unsafe to use in noinstr code; use raw_atomic64_fetch_sub() there.
1934  *                                               1934  *
1935  * Return: The original value of @v.             1935  * Return: The original value of @v.
1936  */                                              1936  */
1937 static __always_inline s64                       1937 static __always_inline s64
1938 atomic64_fetch_sub(s64 i, atomic64_t *v)         1938 atomic64_fetch_sub(s64 i, atomic64_t *v)
1939 {                                                1939 {
1940         kcsan_mb();                              1940         kcsan_mb();
1941         instrument_atomic_read_write(v, sizeo    1941         instrument_atomic_read_write(v, sizeof(*v));
1942         return raw_atomic64_fetch_sub(i, v);     1942         return raw_atomic64_fetch_sub(i, v);
1943 }                                                1943 }
1944                                                  1944 
1945 /**                                              1945 /**
1946  * atomic64_fetch_sub_acquire() - atomic subt    1946  * atomic64_fetch_sub_acquire() - atomic subtract with acquire ordering
1947  * @i: s64 value to subtract                     1947  * @i: s64 value to subtract
1948  * @v: pointer to atomic64_t                     1948  * @v: pointer to atomic64_t
1949  *                                               1949  *
1950  * Atomically updates @v to (@v - @i) with ac    1950  * Atomically updates @v to (@v - @i) with acquire ordering.
1951  *                                               1951  *
1952  * Unsafe to use in noinstr code; use raw_ato    1952  * Unsafe to use in noinstr code; use raw_atomic64_fetch_sub_acquire() there.
1953  *                                               1953  *
1954  * Return: The original value of @v.             1954  * Return: The original value of @v.
1955  */                                              1955  */
1956 static __always_inline s64                       1956 static __always_inline s64
1957 atomic64_fetch_sub_acquire(s64 i, atomic64_t     1957 atomic64_fetch_sub_acquire(s64 i, atomic64_t *v)
1958 {                                                1958 {
1959         instrument_atomic_read_write(v, sizeo    1959         instrument_atomic_read_write(v, sizeof(*v));
1960         return raw_atomic64_fetch_sub_acquire    1960         return raw_atomic64_fetch_sub_acquire(i, v);
1961 }                                                1961 }
1962                                                  1962 
1963 /**                                              1963 /**
1964  * atomic64_fetch_sub_release() - atomic subt    1964  * atomic64_fetch_sub_release() - atomic subtract with release ordering
1965  * @i: s64 value to subtract                     1965  * @i: s64 value to subtract
1966  * @v: pointer to atomic64_t                     1966  * @v: pointer to atomic64_t
1967  *                                               1967  *
1968  * Atomically updates @v to (@v - @i) with re    1968  * Atomically updates @v to (@v - @i) with release ordering.
1969  *                                               1969  *
1970  * Unsafe to use in noinstr code; use raw_ato    1970  * Unsafe to use in noinstr code; use raw_atomic64_fetch_sub_release() there.
1971  *                                               1971  *
1972  * Return: The original value of @v.             1972  * Return: The original value of @v.
1973  */                                              1973  */
1974 static __always_inline s64                       1974 static __always_inline s64
1975 atomic64_fetch_sub_release(s64 i, atomic64_t     1975 atomic64_fetch_sub_release(s64 i, atomic64_t *v)
1976 {                                                1976 {
1977         kcsan_release();                         1977         kcsan_release();
1978         instrument_atomic_read_write(v, sizeo    1978         instrument_atomic_read_write(v, sizeof(*v));
1979         return raw_atomic64_fetch_sub_release    1979         return raw_atomic64_fetch_sub_release(i, v);
1980 }                                                1980 }
1981                                                  1981 
1982 /**                                              1982 /**
1983  * atomic64_fetch_sub_relaxed() - atomic subt    1983  * atomic64_fetch_sub_relaxed() - atomic subtract with relaxed ordering
1984  * @i: s64 value to subtract                     1984  * @i: s64 value to subtract
1985  * @v: pointer to atomic64_t                     1985  * @v: pointer to atomic64_t
1986  *                                               1986  *
1987  * Atomically updates @v to (@v - @i) with re    1987  * Atomically updates @v to (@v - @i) with relaxed ordering.
1988  *                                               1988  *
1989  * Unsafe to use in noinstr code; use raw_ato    1989  * Unsafe to use in noinstr code; use raw_atomic64_fetch_sub_relaxed() there.
1990  *                                               1990  *
1991  * Return: The original value of @v.             1991  * Return: The original value of @v.
1992  */                                              1992  */
1993 static __always_inline s64                       1993 static __always_inline s64
1994 atomic64_fetch_sub_relaxed(s64 i, atomic64_t     1994 atomic64_fetch_sub_relaxed(s64 i, atomic64_t *v)
1995 {                                                1995 {
1996         instrument_atomic_read_write(v, sizeo    1996         instrument_atomic_read_write(v, sizeof(*v));
1997         return raw_atomic64_fetch_sub_relaxed    1997         return raw_atomic64_fetch_sub_relaxed(i, v);
1998 }                                                1998 }
1999                                                  1999 
2000 /**                                              2000 /**
2001  * atomic64_inc() - atomic increment with rel    2001  * atomic64_inc() - atomic increment with relaxed ordering
2002  * @v: pointer to atomic64_t                     2002  * @v: pointer to atomic64_t
2003  *                                               2003  *
2004  * Atomically updates @v to (@v + 1) with rel    2004  * Atomically updates @v to (@v + 1) with relaxed ordering.
2005  *                                               2005  *
2006  * Unsafe to use in noinstr code; use raw_ato    2006  * Unsafe to use in noinstr code; use raw_atomic64_inc() there.
2007  *                                               2007  *
2008  * Return: Nothing.                              2008  * Return: Nothing.
2009  */                                              2009  */
2010 static __always_inline void                      2010 static __always_inline void
2011 atomic64_inc(atomic64_t *v)                      2011 atomic64_inc(atomic64_t *v)
2012 {                                                2012 {
2013         instrument_atomic_read_write(v, sizeo    2013         instrument_atomic_read_write(v, sizeof(*v));
2014         raw_atomic64_inc(v);                     2014         raw_atomic64_inc(v);
2015 }                                                2015 }
2016                                                  2016 
2017 /**                                              2017 /**
2018  * atomic64_inc_return() - atomic increment w    2018  * atomic64_inc_return() - atomic increment with full ordering
2019  * @v: pointer to atomic64_t                     2019  * @v: pointer to atomic64_t
2020  *                                               2020  *
2021  * Atomically updates @v to (@v + 1) with ful    2021  * Atomically updates @v to (@v + 1) with full ordering.
2022  *                                               2022  *
2023  * Unsafe to use in noinstr code; use raw_ato    2023  * Unsafe to use in noinstr code; use raw_atomic64_inc_return() there.
2024  *                                               2024  *
2025  * Return: The updated value of @v.              2025  * Return: The updated value of @v.
2026  */                                              2026  */
2027 static __always_inline s64                       2027 static __always_inline s64
2028 atomic64_inc_return(atomic64_t *v)               2028 atomic64_inc_return(atomic64_t *v)
2029 {                                                2029 {
2030         kcsan_mb();                              2030         kcsan_mb();
2031         instrument_atomic_read_write(v, sizeo    2031         instrument_atomic_read_write(v, sizeof(*v));
2032         return raw_atomic64_inc_return(v);       2032         return raw_atomic64_inc_return(v);
2033 }                                                2033 }
2034                                                  2034 
2035 /**                                              2035 /**
2036  * atomic64_inc_return_acquire() - atomic inc    2036  * atomic64_inc_return_acquire() - atomic increment with acquire ordering
2037  * @v: pointer to atomic64_t                     2037  * @v: pointer to atomic64_t
2038  *                                               2038  *
2039  * Atomically updates @v to (@v + 1) with acq    2039  * Atomically updates @v to (@v + 1) with acquire ordering.
2040  *                                               2040  *
2041  * Unsafe to use in noinstr code; use raw_ato    2041  * Unsafe to use in noinstr code; use raw_atomic64_inc_return_acquire() there.
2042  *                                               2042  *
2043  * Return: The updated value of @v.              2043  * Return: The updated value of @v.
2044  */                                              2044  */
2045 static __always_inline s64                       2045 static __always_inline s64
2046 atomic64_inc_return_acquire(atomic64_t *v)       2046 atomic64_inc_return_acquire(atomic64_t *v)
2047 {                                                2047 {
2048         instrument_atomic_read_write(v, sizeo    2048         instrument_atomic_read_write(v, sizeof(*v));
2049         return raw_atomic64_inc_return_acquir    2049         return raw_atomic64_inc_return_acquire(v);
2050 }                                                2050 }
2051                                                  2051 
2052 /**                                              2052 /**
2053  * atomic64_inc_return_release() - atomic inc    2053  * atomic64_inc_return_release() - atomic increment with release ordering
2054  * @v: pointer to atomic64_t                     2054  * @v: pointer to atomic64_t
2055  *                                               2055  *
2056  * Atomically updates @v to (@v + 1) with rel    2056  * Atomically updates @v to (@v + 1) with release ordering.
2057  *                                               2057  *
2058  * Unsafe to use in noinstr code; use raw_ato    2058  * Unsafe to use in noinstr code; use raw_atomic64_inc_return_release() there.
2059  *                                               2059  *
2060  * Return: The updated value of @v.              2060  * Return: The updated value of @v.
2061  */                                              2061  */
2062 static __always_inline s64                       2062 static __always_inline s64
2063 atomic64_inc_return_release(atomic64_t *v)       2063 atomic64_inc_return_release(atomic64_t *v)
2064 {                                                2064 {
2065         kcsan_release();                         2065         kcsan_release();
2066         instrument_atomic_read_write(v, sizeo    2066         instrument_atomic_read_write(v, sizeof(*v));
2067         return raw_atomic64_inc_return_releas    2067         return raw_atomic64_inc_return_release(v);
2068 }                                                2068 }
2069                                                  2069 
2070 /**                                              2070 /**
2071  * atomic64_inc_return_relaxed() - atomic inc    2071  * atomic64_inc_return_relaxed() - atomic increment with relaxed ordering
2072  * @v: pointer to atomic64_t                     2072  * @v: pointer to atomic64_t
2073  *                                               2073  *
2074  * Atomically updates @v to (@v + 1) with rel    2074  * Atomically updates @v to (@v + 1) with relaxed ordering.
2075  *                                               2075  *
2076  * Unsafe to use in noinstr code; use raw_ato    2076  * Unsafe to use in noinstr code; use raw_atomic64_inc_return_relaxed() there.
2077  *                                               2077  *
2078  * Return: The updated value of @v.              2078  * Return: The updated value of @v.
2079  */                                              2079  */
2080 static __always_inline s64                       2080 static __always_inline s64
2081 atomic64_inc_return_relaxed(atomic64_t *v)       2081 atomic64_inc_return_relaxed(atomic64_t *v)
2082 {                                                2082 {
2083         instrument_atomic_read_write(v, sizeo    2083         instrument_atomic_read_write(v, sizeof(*v));
2084         return raw_atomic64_inc_return_relaxe    2084         return raw_atomic64_inc_return_relaxed(v);
2085 }                                                2085 }
2086                                                  2086 
2087 /**                                              2087 /**
2088  * atomic64_fetch_inc() - atomic increment wi    2088  * atomic64_fetch_inc() - atomic increment with full ordering
2089  * @v: pointer to atomic64_t                     2089  * @v: pointer to atomic64_t
2090  *                                               2090  *
2091  * Atomically updates @v to (@v + 1) with ful    2091  * Atomically updates @v to (@v + 1) with full ordering.
2092  *                                               2092  *
2093  * Unsafe to use in noinstr code; use raw_ato    2093  * Unsafe to use in noinstr code; use raw_atomic64_fetch_inc() there.
2094  *                                               2094  *
2095  * Return: The original value of @v.             2095  * Return: The original value of @v.
2096  */                                              2096  */
2097 static __always_inline s64                       2097 static __always_inline s64
2098 atomic64_fetch_inc(atomic64_t *v)                2098 atomic64_fetch_inc(atomic64_t *v)
2099 {                                                2099 {
2100         kcsan_mb();                              2100         kcsan_mb();
2101         instrument_atomic_read_write(v, sizeo    2101         instrument_atomic_read_write(v, sizeof(*v));
2102         return raw_atomic64_fetch_inc(v);        2102         return raw_atomic64_fetch_inc(v);
2103 }                                                2103 }
2104                                                  2104 
2105 /**                                              2105 /**
2106  * atomic64_fetch_inc_acquire() - atomic incr    2106  * atomic64_fetch_inc_acquire() - atomic increment with acquire ordering
2107  * @v: pointer to atomic64_t                     2107  * @v: pointer to atomic64_t
2108  *                                               2108  *
2109  * Atomically updates @v to (@v + 1) with acq    2109  * Atomically updates @v to (@v + 1) with acquire ordering.
2110  *                                               2110  *
2111  * Unsafe to use in noinstr code; use raw_ato    2111  * Unsafe to use in noinstr code; use raw_atomic64_fetch_inc_acquire() there.
2112  *                                               2112  *
2113  * Return: The original value of @v.             2113  * Return: The original value of @v.
2114  */                                              2114  */
2115 static __always_inline s64                       2115 static __always_inline s64
2116 atomic64_fetch_inc_acquire(atomic64_t *v)        2116 atomic64_fetch_inc_acquire(atomic64_t *v)
2117 {                                                2117 {
2118         instrument_atomic_read_write(v, sizeo    2118         instrument_atomic_read_write(v, sizeof(*v));
2119         return raw_atomic64_fetch_inc_acquire    2119         return raw_atomic64_fetch_inc_acquire(v);
2120 }                                                2120 }
2121                                                  2121 
2122 /**                                              2122 /**
2123  * atomic64_fetch_inc_release() - atomic incr    2123  * atomic64_fetch_inc_release() - atomic increment with release ordering
2124  * @v: pointer to atomic64_t                     2124  * @v: pointer to atomic64_t
2125  *                                               2125  *
2126  * Atomically updates @v to (@v + 1) with rel    2126  * Atomically updates @v to (@v + 1) with release ordering.
2127  *                                               2127  *
2128  * Unsafe to use in noinstr code; use raw_ato    2128  * Unsafe to use in noinstr code; use raw_atomic64_fetch_inc_release() there.
2129  *                                               2129  *
2130  * Return: The original value of @v.             2130  * Return: The original value of @v.
2131  */                                              2131  */
2132 static __always_inline s64                       2132 static __always_inline s64
2133 atomic64_fetch_inc_release(atomic64_t *v)        2133 atomic64_fetch_inc_release(atomic64_t *v)
2134 {                                                2134 {
2135         kcsan_release();                         2135         kcsan_release();
2136         instrument_atomic_read_write(v, sizeo    2136         instrument_atomic_read_write(v, sizeof(*v));
2137         return raw_atomic64_fetch_inc_release    2137         return raw_atomic64_fetch_inc_release(v);
2138 }                                                2138 }
2139                                                  2139 
2140 /**                                              2140 /**
2141  * atomic64_fetch_inc_relaxed() - atomic incr    2141  * atomic64_fetch_inc_relaxed() - atomic increment with relaxed ordering
2142  * @v: pointer to atomic64_t                     2142  * @v: pointer to atomic64_t
2143  *                                               2143  *
2144  * Atomically updates @v to (@v + 1) with rel    2144  * Atomically updates @v to (@v + 1) with relaxed ordering.
2145  *                                               2145  *
2146  * Unsafe to use in noinstr code; use raw_ato    2146  * Unsafe to use in noinstr code; use raw_atomic64_fetch_inc_relaxed() there.
2147  *                                               2147  *
2148  * Return: The original value of @v.             2148  * Return: The original value of @v.
2149  */                                              2149  */
2150 static __always_inline s64                       2150 static __always_inline s64
2151 atomic64_fetch_inc_relaxed(atomic64_t *v)        2151 atomic64_fetch_inc_relaxed(atomic64_t *v)
2152 {                                                2152 {
2153         instrument_atomic_read_write(v, sizeo    2153         instrument_atomic_read_write(v, sizeof(*v));
2154         return raw_atomic64_fetch_inc_relaxed    2154         return raw_atomic64_fetch_inc_relaxed(v);
2155 }                                                2155 }
2156                                                  2156 
2157 /**                                              2157 /**
2158  * atomic64_dec() - atomic decrement with rel    2158  * atomic64_dec() - atomic decrement with relaxed ordering
2159  * @v: pointer to atomic64_t                     2159  * @v: pointer to atomic64_t
2160  *                                               2160  *
2161  * Atomically updates @v to (@v - 1) with rel    2161  * Atomically updates @v to (@v - 1) with relaxed ordering.
2162  *                                               2162  *
2163  * Unsafe to use in noinstr code; use raw_ato    2163  * Unsafe to use in noinstr code; use raw_atomic64_dec() there.
2164  *                                               2164  *
2165  * Return: Nothing.                              2165  * Return: Nothing.
2166  */                                              2166  */
2167 static __always_inline void                      2167 static __always_inline void
2168 atomic64_dec(atomic64_t *v)                      2168 atomic64_dec(atomic64_t *v)
2169 {                                                2169 {
2170         instrument_atomic_read_write(v, sizeo    2170         instrument_atomic_read_write(v, sizeof(*v));
2171         raw_atomic64_dec(v);                     2171         raw_atomic64_dec(v);
2172 }                                                2172 }
2173                                                  2173 
2174 /**                                              2174 /**
2175  * atomic64_dec_return() - atomic decrement w    2175  * atomic64_dec_return() - atomic decrement with full ordering
2176  * @v: pointer to atomic64_t                     2176  * @v: pointer to atomic64_t
2177  *                                               2177  *
2178  * Atomically updates @v to (@v - 1) with ful    2178  * Atomically updates @v to (@v - 1) with full ordering.
2179  *                                               2179  *
2180  * Unsafe to use in noinstr code; use raw_ato    2180  * Unsafe to use in noinstr code; use raw_atomic64_dec_return() there.
2181  *                                               2181  *
2182  * Return: The updated value of @v.              2182  * Return: The updated value of @v.
2183  */                                              2183  */
2184 static __always_inline s64                       2184 static __always_inline s64
2185 atomic64_dec_return(atomic64_t *v)               2185 atomic64_dec_return(atomic64_t *v)
2186 {                                                2186 {
2187         kcsan_mb();                              2187         kcsan_mb();
2188         instrument_atomic_read_write(v, sizeo    2188         instrument_atomic_read_write(v, sizeof(*v));
2189         return raw_atomic64_dec_return(v);       2189         return raw_atomic64_dec_return(v);
2190 }                                                2190 }
2191                                                  2191 
2192 /**                                              2192 /**
2193  * atomic64_dec_return_acquire() - atomic dec    2193  * atomic64_dec_return_acquire() - atomic decrement with acquire ordering
2194  * @v: pointer to atomic64_t                     2194  * @v: pointer to atomic64_t
2195  *                                               2195  *
2196  * Atomically updates @v to (@v - 1) with acq    2196  * Atomically updates @v to (@v - 1) with acquire ordering.
2197  *                                               2197  *
2198  * Unsafe to use in noinstr code; use raw_ato    2198  * Unsafe to use in noinstr code; use raw_atomic64_dec_return_acquire() there.
2199  *                                               2199  *
2200  * Return: The updated value of @v.              2200  * Return: The updated value of @v.
2201  */                                              2201  */
2202 static __always_inline s64                       2202 static __always_inline s64
2203 atomic64_dec_return_acquire(atomic64_t *v)       2203 atomic64_dec_return_acquire(atomic64_t *v)
2204 {                                                2204 {
2205         instrument_atomic_read_write(v, sizeo    2205         instrument_atomic_read_write(v, sizeof(*v));
2206         return raw_atomic64_dec_return_acquir    2206         return raw_atomic64_dec_return_acquire(v);
2207 }                                                2207 }
2208                                                  2208 
2209 /**                                              2209 /**
2210  * atomic64_dec_return_release() - atomic dec    2210  * atomic64_dec_return_release() - atomic decrement with release ordering
2211  * @v: pointer to atomic64_t                     2211  * @v: pointer to atomic64_t
2212  *                                               2212  *
2213  * Atomically updates @v to (@v - 1) with rel    2213  * Atomically updates @v to (@v - 1) with release ordering.
2214  *                                               2214  *
2215  * Unsafe to use in noinstr code; use raw_ato    2215  * Unsafe to use in noinstr code; use raw_atomic64_dec_return_release() there.
2216  *                                               2216  *
2217  * Return: The updated value of @v.              2217  * Return: The updated value of @v.
2218  */                                              2218  */
2219 static __always_inline s64                       2219 static __always_inline s64
2220 atomic64_dec_return_release(atomic64_t *v)       2220 atomic64_dec_return_release(atomic64_t *v)
2221 {                                                2221 {
2222         kcsan_release();                         2222         kcsan_release();
2223         instrument_atomic_read_write(v, sizeo    2223         instrument_atomic_read_write(v, sizeof(*v));
2224         return raw_atomic64_dec_return_releas    2224         return raw_atomic64_dec_return_release(v);
2225 }                                                2225 }
2226                                                  2226 
2227 /**                                              2227 /**
2228  * atomic64_dec_return_relaxed() - atomic dec    2228  * atomic64_dec_return_relaxed() - atomic decrement with relaxed ordering
2229  * @v: pointer to atomic64_t                     2229  * @v: pointer to atomic64_t
2230  *                                               2230  *
2231  * Atomically updates @v to (@v - 1) with rel    2231  * Atomically updates @v to (@v - 1) with relaxed ordering.
2232  *                                               2232  *
2233  * Unsafe to use in noinstr code; use raw_ato    2233  * Unsafe to use in noinstr code; use raw_atomic64_dec_return_relaxed() there.
2234  *                                               2234  *
2235  * Return: The updated value of @v.              2235  * Return: The updated value of @v.
2236  */                                              2236  */
2237 static __always_inline s64                       2237 static __always_inline s64
2238 atomic64_dec_return_relaxed(atomic64_t *v)       2238 atomic64_dec_return_relaxed(atomic64_t *v)
2239 {                                                2239 {
2240         instrument_atomic_read_write(v, sizeo    2240         instrument_atomic_read_write(v, sizeof(*v));
2241         return raw_atomic64_dec_return_relaxe    2241         return raw_atomic64_dec_return_relaxed(v);
2242 }                                                2242 }
2243                                                  2243 
2244 /**                                              2244 /**
2245  * atomic64_fetch_dec() - atomic decrement wi    2245  * atomic64_fetch_dec() - atomic decrement with full ordering
2246  * @v: pointer to atomic64_t                     2246  * @v: pointer to atomic64_t
2247  *                                               2247  *
2248  * Atomically updates @v to (@v - 1) with ful    2248  * Atomically updates @v to (@v - 1) with full ordering.
2249  *                                               2249  *
2250  * Unsafe to use in noinstr code; use raw_ato    2250  * Unsafe to use in noinstr code; use raw_atomic64_fetch_dec() there.
2251  *                                               2251  *
2252  * Return: The original value of @v.             2252  * Return: The original value of @v.
2253  */                                              2253  */
2254 static __always_inline s64                       2254 static __always_inline s64
2255 atomic64_fetch_dec(atomic64_t *v)                2255 atomic64_fetch_dec(atomic64_t *v)
2256 {                                                2256 {
2257         kcsan_mb();                              2257         kcsan_mb();
2258         instrument_atomic_read_write(v, sizeo    2258         instrument_atomic_read_write(v, sizeof(*v));
2259         return raw_atomic64_fetch_dec(v);        2259         return raw_atomic64_fetch_dec(v);
2260 }                                                2260 }
2261                                                  2261 
2262 /**                                              2262 /**
2263  * atomic64_fetch_dec_acquire() - atomic decr    2263  * atomic64_fetch_dec_acquire() - atomic decrement with acquire ordering
2264  * @v: pointer to atomic64_t                     2264  * @v: pointer to atomic64_t
2265  *                                               2265  *
2266  * Atomically updates @v to (@v - 1) with acq    2266  * Atomically updates @v to (@v - 1) with acquire ordering.
2267  *                                               2267  *
2268  * Unsafe to use in noinstr code; use raw_ato    2268  * Unsafe to use in noinstr code; use raw_atomic64_fetch_dec_acquire() there.
2269  *                                               2269  *
2270  * Return: The original value of @v.             2270  * Return: The original value of @v.
2271  */                                              2271  */
2272 static __always_inline s64                       2272 static __always_inline s64
2273 atomic64_fetch_dec_acquire(atomic64_t *v)        2273 atomic64_fetch_dec_acquire(atomic64_t *v)
2274 {                                                2274 {
2275         instrument_atomic_read_write(v, sizeo    2275         instrument_atomic_read_write(v, sizeof(*v));
2276         return raw_atomic64_fetch_dec_acquire    2276         return raw_atomic64_fetch_dec_acquire(v);
2277 }                                                2277 }
2278                                                  2278 
2279 /**                                              2279 /**
2280  * atomic64_fetch_dec_release() - atomic decr    2280  * atomic64_fetch_dec_release() - atomic decrement with release ordering
2281  * @v: pointer to atomic64_t                     2281  * @v: pointer to atomic64_t
2282  *                                               2282  *
2283  * Atomically updates @v to (@v - 1) with rel    2283  * Atomically updates @v to (@v - 1) with release ordering.
2284  *                                               2284  *
2285  * Unsafe to use in noinstr code; use raw_ato    2285  * Unsafe to use in noinstr code; use raw_atomic64_fetch_dec_release() there.
2286  *                                               2286  *
2287  * Return: The original value of @v.             2287  * Return: The original value of @v.
2288  */                                              2288  */
2289 static __always_inline s64                       2289 static __always_inline s64
2290 atomic64_fetch_dec_release(atomic64_t *v)        2290 atomic64_fetch_dec_release(atomic64_t *v)
2291 {                                                2291 {
2292         kcsan_release();                         2292         kcsan_release();
2293         instrument_atomic_read_write(v, sizeo    2293         instrument_atomic_read_write(v, sizeof(*v));
2294         return raw_atomic64_fetch_dec_release    2294         return raw_atomic64_fetch_dec_release(v);
2295 }                                                2295 }
2296                                                  2296 
2297 /**                                              2297 /**
2298  * atomic64_fetch_dec_relaxed() - atomic decr    2298  * atomic64_fetch_dec_relaxed() - atomic decrement with relaxed ordering
2299  * @v: pointer to atomic64_t                     2299  * @v: pointer to atomic64_t
2300  *                                               2300  *
2301  * Atomically updates @v to (@v - 1) with rel    2301  * Atomically updates @v to (@v - 1) with relaxed ordering.
2302  *                                               2302  *
2303  * Unsafe to use in noinstr code; use raw_ato    2303  * Unsafe to use in noinstr code; use raw_atomic64_fetch_dec_relaxed() there.
2304  *                                               2304  *
2305  * Return: The original value of @v.             2305  * Return: The original value of @v.
2306  */                                              2306  */
2307 static __always_inline s64                       2307 static __always_inline s64
2308 atomic64_fetch_dec_relaxed(atomic64_t *v)        2308 atomic64_fetch_dec_relaxed(atomic64_t *v)
2309 {                                                2309 {
2310         instrument_atomic_read_write(v, sizeo    2310         instrument_atomic_read_write(v, sizeof(*v));
2311         return raw_atomic64_fetch_dec_relaxed    2311         return raw_atomic64_fetch_dec_relaxed(v);
2312 }                                                2312 }
2313                                                  2313 
2314 /**                                              2314 /**
2315  * atomic64_and() - atomic bitwise AND with r    2315  * atomic64_and() - atomic bitwise AND with relaxed ordering
2316  * @i: s64 value                                 2316  * @i: s64 value
2317  * @v: pointer to atomic64_t                     2317  * @v: pointer to atomic64_t
2318  *                                               2318  *
2319  * Atomically updates @v to (@v & @i) with re    2319  * Atomically updates @v to (@v & @i) with relaxed ordering.
2320  *                                               2320  *
2321  * Unsafe to use in noinstr code; use raw_ato    2321  * Unsafe to use in noinstr code; use raw_atomic64_and() there.
2322  *                                               2322  *
2323  * Return: Nothing.                              2323  * Return: Nothing.
2324  */                                              2324  */
2325 static __always_inline void                      2325 static __always_inline void
2326 atomic64_and(s64 i, atomic64_t *v)               2326 atomic64_and(s64 i, atomic64_t *v)
2327 {                                                2327 {
2328         instrument_atomic_read_write(v, sizeo    2328         instrument_atomic_read_write(v, sizeof(*v));
2329         raw_atomic64_and(i, v);                  2329         raw_atomic64_and(i, v);
2330 }                                                2330 }
2331                                                  2331 
2332 /**                                              2332 /**
2333  * atomic64_fetch_and() - atomic bitwise AND     2333  * atomic64_fetch_and() - atomic bitwise AND with full ordering
2334  * @i: s64 value                                 2334  * @i: s64 value
2335  * @v: pointer to atomic64_t                     2335  * @v: pointer to atomic64_t
2336  *                                               2336  *
2337  * Atomically updates @v to (@v & @i) with fu    2337  * Atomically updates @v to (@v & @i) with full ordering.
2338  *                                               2338  *
2339  * Unsafe to use in noinstr code; use raw_ato    2339  * Unsafe to use in noinstr code; use raw_atomic64_fetch_and() there.
2340  *                                               2340  *
2341  * Return: The original value of @v.             2341  * Return: The original value of @v.
2342  */                                              2342  */
2343 static __always_inline s64                       2343 static __always_inline s64
2344 atomic64_fetch_and(s64 i, atomic64_t *v)         2344 atomic64_fetch_and(s64 i, atomic64_t *v)
2345 {                                                2345 {
2346         kcsan_mb();                              2346         kcsan_mb();
2347         instrument_atomic_read_write(v, sizeo    2347         instrument_atomic_read_write(v, sizeof(*v));
2348         return raw_atomic64_fetch_and(i, v);     2348         return raw_atomic64_fetch_and(i, v);
2349 }                                                2349 }
2350                                                  2350 
2351 /**                                              2351 /**
2352  * atomic64_fetch_and_acquire() - atomic bitw    2352  * atomic64_fetch_and_acquire() - atomic bitwise AND with acquire ordering
2353  * @i: s64 value                                 2353  * @i: s64 value
2354  * @v: pointer to atomic64_t                     2354  * @v: pointer to atomic64_t
2355  *                                               2355  *
2356  * Atomically updates @v to (@v & @i) with ac    2356  * Atomically updates @v to (@v & @i) with acquire ordering.
2357  *                                               2357  *
2358  * Unsafe to use in noinstr code; use raw_ato    2358  * Unsafe to use in noinstr code; use raw_atomic64_fetch_and_acquire() there.
2359  *                                               2359  *
2360  * Return: The original value of @v.             2360  * Return: The original value of @v.
2361  */                                              2361  */
2362 static __always_inline s64                       2362 static __always_inline s64
2363 atomic64_fetch_and_acquire(s64 i, atomic64_t     2363 atomic64_fetch_and_acquire(s64 i, atomic64_t *v)
2364 {                                                2364 {
2365         instrument_atomic_read_write(v, sizeo    2365         instrument_atomic_read_write(v, sizeof(*v));
2366         return raw_atomic64_fetch_and_acquire    2366         return raw_atomic64_fetch_and_acquire(i, v);
2367 }                                                2367 }
2368                                                  2368 
2369 /**                                              2369 /**
2370  * atomic64_fetch_and_release() - atomic bitw    2370  * atomic64_fetch_and_release() - atomic bitwise AND with release ordering
2371  * @i: s64 value                                 2371  * @i: s64 value
2372  * @v: pointer to atomic64_t                     2372  * @v: pointer to atomic64_t
2373  *                                               2373  *
2374  * Atomically updates @v to (@v & @i) with re    2374  * Atomically updates @v to (@v & @i) with release ordering.
2375  *                                               2375  *
2376  * Unsafe to use in noinstr code; use raw_ato    2376  * Unsafe to use in noinstr code; use raw_atomic64_fetch_and_release() there.
2377  *                                               2377  *
2378  * Return: The original value of @v.             2378  * Return: The original value of @v.
2379  */                                              2379  */
2380 static __always_inline s64                       2380 static __always_inline s64
2381 atomic64_fetch_and_release(s64 i, atomic64_t     2381 atomic64_fetch_and_release(s64 i, atomic64_t *v)
2382 {                                                2382 {
2383         kcsan_release();                         2383         kcsan_release();
2384         instrument_atomic_read_write(v, sizeo    2384         instrument_atomic_read_write(v, sizeof(*v));
2385         return raw_atomic64_fetch_and_release    2385         return raw_atomic64_fetch_and_release(i, v);
2386 }                                                2386 }
2387                                                  2387 
2388 /**                                              2388 /**
2389  * atomic64_fetch_and_relaxed() - atomic bitw    2389  * atomic64_fetch_and_relaxed() - atomic bitwise AND with relaxed ordering
2390  * @i: s64 value                                 2390  * @i: s64 value
2391  * @v: pointer to atomic64_t                     2391  * @v: pointer to atomic64_t
2392  *                                               2392  *
2393  * Atomically updates @v to (@v & @i) with re    2393  * Atomically updates @v to (@v & @i) with relaxed ordering.
2394  *                                               2394  *
2395  * Unsafe to use in noinstr code; use raw_ato    2395  * Unsafe to use in noinstr code; use raw_atomic64_fetch_and_relaxed() there.
2396  *                                               2396  *
2397  * Return: The original value of @v.             2397  * Return: The original value of @v.
2398  */                                              2398  */
2399 static __always_inline s64                       2399 static __always_inline s64
2400 atomic64_fetch_and_relaxed(s64 i, atomic64_t     2400 atomic64_fetch_and_relaxed(s64 i, atomic64_t *v)
2401 {                                                2401 {
2402         instrument_atomic_read_write(v, sizeo    2402         instrument_atomic_read_write(v, sizeof(*v));
2403         return raw_atomic64_fetch_and_relaxed    2403         return raw_atomic64_fetch_and_relaxed(i, v);
2404 }                                                2404 }
2405                                                  2405 
2406 /**                                              2406 /**
2407  * atomic64_andnot() - atomic bitwise AND NOT    2407  * atomic64_andnot() - atomic bitwise AND NOT with relaxed ordering
2408  * @i: s64 value                                 2408  * @i: s64 value
2409  * @v: pointer to atomic64_t                     2409  * @v: pointer to atomic64_t
2410  *                                               2410  *
2411  * Atomically updates @v to (@v & ~@i) with r    2411  * Atomically updates @v to (@v & ~@i) with relaxed ordering.
2412  *                                               2412  *
2413  * Unsafe to use in noinstr code; use raw_ato    2413  * Unsafe to use in noinstr code; use raw_atomic64_andnot() there.
2414  *                                               2414  *
2415  * Return: Nothing.                              2415  * Return: Nothing.
2416  */                                              2416  */
2417 static __always_inline void                      2417 static __always_inline void
2418 atomic64_andnot(s64 i, atomic64_t *v)            2418 atomic64_andnot(s64 i, atomic64_t *v)
2419 {                                                2419 {
2420         instrument_atomic_read_write(v, sizeo    2420         instrument_atomic_read_write(v, sizeof(*v));
2421         raw_atomic64_andnot(i, v);               2421         raw_atomic64_andnot(i, v);
2422 }                                                2422 }
2423                                                  2423 
2424 /**                                              2424 /**
2425  * atomic64_fetch_andnot() - atomic bitwise A    2425  * atomic64_fetch_andnot() - atomic bitwise AND NOT with full ordering
2426  * @i: s64 value                                 2426  * @i: s64 value
2427  * @v: pointer to atomic64_t                     2427  * @v: pointer to atomic64_t
2428  *                                               2428  *
2429  * Atomically updates @v to (@v & ~@i) with f    2429  * Atomically updates @v to (@v & ~@i) with full ordering.
2430  *                                               2430  *
2431  * Unsafe to use in noinstr code; use raw_ato    2431  * Unsafe to use in noinstr code; use raw_atomic64_fetch_andnot() there.
2432  *                                               2432  *
2433  * Return: The original value of @v.             2433  * Return: The original value of @v.
2434  */                                              2434  */
2435 static __always_inline s64                       2435 static __always_inline s64
2436 atomic64_fetch_andnot(s64 i, atomic64_t *v)      2436 atomic64_fetch_andnot(s64 i, atomic64_t *v)
2437 {                                                2437 {
2438         kcsan_mb();                              2438         kcsan_mb();
2439         instrument_atomic_read_write(v, sizeo    2439         instrument_atomic_read_write(v, sizeof(*v));
2440         return raw_atomic64_fetch_andnot(i, v    2440         return raw_atomic64_fetch_andnot(i, v);
2441 }                                                2441 }
2442                                                  2442 
2443 /**                                              2443 /**
2444  * atomic64_fetch_andnot_acquire() - atomic b    2444  * atomic64_fetch_andnot_acquire() - atomic bitwise AND NOT with acquire ordering
2445  * @i: s64 value                                 2445  * @i: s64 value
2446  * @v: pointer to atomic64_t                     2446  * @v: pointer to atomic64_t
2447  *                                               2447  *
2448  * Atomically updates @v to (@v & ~@i) with a    2448  * Atomically updates @v to (@v & ~@i) with acquire ordering.
2449  *                                               2449  *
2450  * Unsafe to use in noinstr code; use raw_ato    2450  * Unsafe to use in noinstr code; use raw_atomic64_fetch_andnot_acquire() there.
2451  *                                               2451  *
2452  * Return: The original value of @v.             2452  * Return: The original value of @v.
2453  */                                              2453  */
2454 static __always_inline s64                       2454 static __always_inline s64
2455 atomic64_fetch_andnot_acquire(s64 i, atomic64    2455 atomic64_fetch_andnot_acquire(s64 i, atomic64_t *v)
2456 {                                                2456 {
2457         instrument_atomic_read_write(v, sizeo    2457         instrument_atomic_read_write(v, sizeof(*v));
2458         return raw_atomic64_fetch_andnot_acqu    2458         return raw_atomic64_fetch_andnot_acquire(i, v);
2459 }                                                2459 }
2460                                                  2460 
2461 /**                                              2461 /**
2462  * atomic64_fetch_andnot_release() - atomic b    2462  * atomic64_fetch_andnot_release() - atomic bitwise AND NOT with release ordering
2463  * @i: s64 value                                 2463  * @i: s64 value
2464  * @v: pointer to atomic64_t                     2464  * @v: pointer to atomic64_t
2465  *                                               2465  *
2466  * Atomically updates @v to (@v & ~@i) with r    2466  * Atomically updates @v to (@v & ~@i) with release ordering.
2467  *                                               2467  *
2468  * Unsafe to use in noinstr code; use raw_ato    2468  * Unsafe to use in noinstr code; use raw_atomic64_fetch_andnot_release() there.
2469  *                                               2469  *
2470  * Return: The original value of @v.             2470  * Return: The original value of @v.
2471  */                                              2471  */
2472 static __always_inline s64                       2472 static __always_inline s64
2473 atomic64_fetch_andnot_release(s64 i, atomic64    2473 atomic64_fetch_andnot_release(s64 i, atomic64_t *v)
2474 {                                                2474 {
2475         kcsan_release();                         2475         kcsan_release();
2476         instrument_atomic_read_write(v, sizeo    2476         instrument_atomic_read_write(v, sizeof(*v));
2477         return raw_atomic64_fetch_andnot_rele    2477         return raw_atomic64_fetch_andnot_release(i, v);
2478 }                                                2478 }
2479                                                  2479 
2480 /**                                              2480 /**
2481  * atomic64_fetch_andnot_relaxed() - atomic b    2481  * atomic64_fetch_andnot_relaxed() - atomic bitwise AND NOT with relaxed ordering
2482  * @i: s64 value                                 2482  * @i: s64 value
2483  * @v: pointer to atomic64_t                     2483  * @v: pointer to atomic64_t
2484  *                                               2484  *
2485  * Atomically updates @v to (@v & ~@i) with r    2485  * Atomically updates @v to (@v & ~@i) with relaxed ordering.
2486  *                                               2486  *
2487  * Unsafe to use in noinstr code; use raw_ato    2487  * Unsafe to use in noinstr code; use raw_atomic64_fetch_andnot_relaxed() there.
2488  *                                               2488  *
2489  * Return: The original value of @v.             2489  * Return: The original value of @v.
2490  */                                              2490  */
2491 static __always_inline s64                       2491 static __always_inline s64
2492 atomic64_fetch_andnot_relaxed(s64 i, atomic64    2492 atomic64_fetch_andnot_relaxed(s64 i, atomic64_t *v)
2493 {                                                2493 {
2494         instrument_atomic_read_write(v, sizeo    2494         instrument_atomic_read_write(v, sizeof(*v));
2495         return raw_atomic64_fetch_andnot_rela    2495         return raw_atomic64_fetch_andnot_relaxed(i, v);
2496 }                                                2496 }
2497                                                  2497 
2498 /**                                              2498 /**
2499  * atomic64_or() - atomic bitwise OR with rel    2499  * atomic64_or() - atomic bitwise OR with relaxed ordering
2500  * @i: s64 value                                 2500  * @i: s64 value
2501  * @v: pointer to atomic64_t                     2501  * @v: pointer to atomic64_t
2502  *                                               2502  *
2503  * Atomically updates @v to (@v | @i) with re    2503  * Atomically updates @v to (@v | @i) with relaxed ordering.
2504  *                                               2504  *
2505  * Unsafe to use in noinstr code; use raw_ato    2505  * Unsafe to use in noinstr code; use raw_atomic64_or() there.
2506  *                                               2506  *
2507  * Return: Nothing.                              2507  * Return: Nothing.
2508  */                                              2508  */
2509 static __always_inline void                      2509 static __always_inline void
2510 atomic64_or(s64 i, atomic64_t *v)                2510 atomic64_or(s64 i, atomic64_t *v)
2511 {                                                2511 {
2512         instrument_atomic_read_write(v, sizeo    2512         instrument_atomic_read_write(v, sizeof(*v));
2513         raw_atomic64_or(i, v);                   2513         raw_atomic64_or(i, v);
2514 }                                                2514 }
2515                                                  2515 
2516 /**                                              2516 /**
2517  * atomic64_fetch_or() - atomic bitwise OR wi    2517  * atomic64_fetch_or() - atomic bitwise OR with full ordering
2518  * @i: s64 value                                 2518  * @i: s64 value
2519  * @v: pointer to atomic64_t                     2519  * @v: pointer to atomic64_t
2520  *                                               2520  *
2521  * Atomically updates @v to (@v | @i) with fu    2521  * Atomically updates @v to (@v | @i) with full ordering.
2522  *                                               2522  *
2523  * Unsafe to use in noinstr code; use raw_ato    2523  * Unsafe to use in noinstr code; use raw_atomic64_fetch_or() there.
2524  *                                               2524  *
2525  * Return: The original value of @v.             2525  * Return: The original value of @v.
2526  */                                              2526  */
2527 static __always_inline s64                       2527 static __always_inline s64
2528 atomic64_fetch_or(s64 i, atomic64_t *v)          2528 atomic64_fetch_or(s64 i, atomic64_t *v)
2529 {                                                2529 {
2530         kcsan_mb();                              2530         kcsan_mb();
2531         instrument_atomic_read_write(v, sizeo    2531         instrument_atomic_read_write(v, sizeof(*v));
2532         return raw_atomic64_fetch_or(i, v);      2532         return raw_atomic64_fetch_or(i, v);
2533 }                                                2533 }
2534                                                  2534 
2535 /**                                              2535 /**
2536  * atomic64_fetch_or_acquire() - atomic bitwi    2536  * atomic64_fetch_or_acquire() - atomic bitwise OR with acquire ordering
2537  * @i: s64 value                                 2537  * @i: s64 value
2538  * @v: pointer to atomic64_t                     2538  * @v: pointer to atomic64_t
2539  *                                               2539  *
2540  * Atomically updates @v to (@v | @i) with ac    2540  * Atomically updates @v to (@v | @i) with acquire ordering.
2541  *                                               2541  *
2542  * Unsafe to use in noinstr code; use raw_ato    2542  * Unsafe to use in noinstr code; use raw_atomic64_fetch_or_acquire() there.
2543  *                                               2543  *
2544  * Return: The original value of @v.             2544  * Return: The original value of @v.
2545  */                                              2545  */
2546 static __always_inline s64                       2546 static __always_inline s64
2547 atomic64_fetch_or_acquire(s64 i, atomic64_t *    2547 atomic64_fetch_or_acquire(s64 i, atomic64_t *v)
2548 {                                                2548 {
2549         instrument_atomic_read_write(v, sizeo    2549         instrument_atomic_read_write(v, sizeof(*v));
2550         return raw_atomic64_fetch_or_acquire(    2550         return raw_atomic64_fetch_or_acquire(i, v);
2551 }                                                2551 }
2552                                                  2552 
2553 /**                                              2553 /**
2554  * atomic64_fetch_or_release() - atomic bitwi    2554  * atomic64_fetch_or_release() - atomic bitwise OR with release ordering
2555  * @i: s64 value                                 2555  * @i: s64 value
2556  * @v: pointer to atomic64_t                     2556  * @v: pointer to atomic64_t
2557  *                                               2557  *
2558  * Atomically updates @v to (@v | @i) with re    2558  * Atomically updates @v to (@v | @i) with release ordering.
2559  *                                               2559  *
2560  * Unsafe to use in noinstr code; use raw_ato    2560  * Unsafe to use in noinstr code; use raw_atomic64_fetch_or_release() there.
2561  *                                               2561  *
2562  * Return: The original value of @v.             2562  * Return: The original value of @v.
2563  */                                              2563  */
2564 static __always_inline s64                       2564 static __always_inline s64
2565 atomic64_fetch_or_release(s64 i, atomic64_t *    2565 atomic64_fetch_or_release(s64 i, atomic64_t *v)
2566 {                                                2566 {
2567         kcsan_release();                         2567         kcsan_release();
2568         instrument_atomic_read_write(v, sizeo    2568         instrument_atomic_read_write(v, sizeof(*v));
2569         return raw_atomic64_fetch_or_release(    2569         return raw_atomic64_fetch_or_release(i, v);
2570 }                                                2570 }
2571                                                  2571 
2572 /**                                              2572 /**
2573  * atomic64_fetch_or_relaxed() - atomic bitwi    2573  * atomic64_fetch_or_relaxed() - atomic bitwise OR with relaxed ordering
2574  * @i: s64 value                                 2574  * @i: s64 value
2575  * @v: pointer to atomic64_t                     2575  * @v: pointer to atomic64_t
2576  *                                               2576  *
2577  * Atomically updates @v to (@v | @i) with re    2577  * Atomically updates @v to (@v | @i) with relaxed ordering.
2578  *                                               2578  *
2579  * Unsafe to use in noinstr code; use raw_ato    2579  * Unsafe to use in noinstr code; use raw_atomic64_fetch_or_relaxed() there.
2580  *                                               2580  *
2581  * Return: The original value of @v.             2581  * Return: The original value of @v.
2582  */                                              2582  */
2583 static __always_inline s64                       2583 static __always_inline s64
2584 atomic64_fetch_or_relaxed(s64 i, atomic64_t *    2584 atomic64_fetch_or_relaxed(s64 i, atomic64_t *v)
2585 {                                                2585 {
2586         instrument_atomic_read_write(v, sizeo    2586         instrument_atomic_read_write(v, sizeof(*v));
2587         return raw_atomic64_fetch_or_relaxed(    2587         return raw_atomic64_fetch_or_relaxed(i, v);
2588 }                                                2588 }
2589                                                  2589 
2590 /**                                              2590 /**
2591  * atomic64_xor() - atomic bitwise XOR with r    2591  * atomic64_xor() - atomic bitwise XOR with relaxed ordering
2592  * @i: s64 value                                 2592  * @i: s64 value
2593  * @v: pointer to atomic64_t                     2593  * @v: pointer to atomic64_t
2594  *                                               2594  *
2595  * Atomically updates @v to (@v ^ @i) with re    2595  * Atomically updates @v to (@v ^ @i) with relaxed ordering.
2596  *                                               2596  *
2597  * Unsafe to use in noinstr code; use raw_ato    2597  * Unsafe to use in noinstr code; use raw_atomic64_xor() there.
2598  *                                               2598  *
2599  * Return: Nothing.                              2599  * Return: Nothing.
2600  */                                              2600  */
2601 static __always_inline void                      2601 static __always_inline void
2602 atomic64_xor(s64 i, atomic64_t *v)               2602 atomic64_xor(s64 i, atomic64_t *v)
2603 {                                                2603 {
2604         instrument_atomic_read_write(v, sizeo    2604         instrument_atomic_read_write(v, sizeof(*v));
2605         raw_atomic64_xor(i, v);                  2605         raw_atomic64_xor(i, v);
2606 }                                                2606 }
2607                                                  2607 
2608 /**                                              2608 /**
2609  * atomic64_fetch_xor() - atomic bitwise XOR     2609  * atomic64_fetch_xor() - atomic bitwise XOR with full ordering
2610  * @i: s64 value                                 2610  * @i: s64 value
2611  * @v: pointer to atomic64_t                     2611  * @v: pointer to atomic64_t
2612  *                                               2612  *
2613  * Atomically updates @v to (@v ^ @i) with fu    2613  * Atomically updates @v to (@v ^ @i) with full ordering.
2614  *                                               2614  *
2615  * Unsafe to use in noinstr code; use raw_ato    2615  * Unsafe to use in noinstr code; use raw_atomic64_fetch_xor() there.
2616  *                                               2616  *
2617  * Return: The original value of @v.             2617  * Return: The original value of @v.
2618  */                                              2618  */
2619 static __always_inline s64                       2619 static __always_inline s64
2620 atomic64_fetch_xor(s64 i, atomic64_t *v)         2620 atomic64_fetch_xor(s64 i, atomic64_t *v)
2621 {                                                2621 {
2622         kcsan_mb();                              2622         kcsan_mb();
2623         instrument_atomic_read_write(v, sizeo    2623         instrument_atomic_read_write(v, sizeof(*v));
2624         return raw_atomic64_fetch_xor(i, v);     2624         return raw_atomic64_fetch_xor(i, v);
2625 }                                                2625 }
2626                                                  2626 
2627 /**                                              2627 /**
2628  * atomic64_fetch_xor_acquire() - atomic bitw    2628  * atomic64_fetch_xor_acquire() - atomic bitwise XOR with acquire ordering
2629  * @i: s64 value                                 2629  * @i: s64 value
2630  * @v: pointer to atomic64_t                     2630  * @v: pointer to atomic64_t
2631  *                                               2631  *
2632  * Atomically updates @v to (@v ^ @i) with ac    2632  * Atomically updates @v to (@v ^ @i) with acquire ordering.
2633  *                                               2633  *
2634  * Unsafe to use in noinstr code; use raw_ato    2634  * Unsafe to use in noinstr code; use raw_atomic64_fetch_xor_acquire() there.
2635  *                                               2635  *
2636  * Return: The original value of @v.             2636  * Return: The original value of @v.
2637  */                                              2637  */
2638 static __always_inline s64                       2638 static __always_inline s64
2639 atomic64_fetch_xor_acquire(s64 i, atomic64_t     2639 atomic64_fetch_xor_acquire(s64 i, atomic64_t *v)
2640 {                                                2640 {
2641         instrument_atomic_read_write(v, sizeo    2641         instrument_atomic_read_write(v, sizeof(*v));
2642         return raw_atomic64_fetch_xor_acquire    2642         return raw_atomic64_fetch_xor_acquire(i, v);
2643 }                                                2643 }
2644                                                  2644 
2645 /**                                              2645 /**
2646  * atomic64_fetch_xor_release() - atomic bitw    2646  * atomic64_fetch_xor_release() - atomic bitwise XOR with release ordering
2647  * @i: s64 value                                 2647  * @i: s64 value
2648  * @v: pointer to atomic64_t                     2648  * @v: pointer to atomic64_t
2649  *                                               2649  *
2650  * Atomically updates @v to (@v ^ @i) with re    2650  * Atomically updates @v to (@v ^ @i) with release ordering.
2651  *                                               2651  *
2652  * Unsafe to use in noinstr code; use raw_ato    2652  * Unsafe to use in noinstr code; use raw_atomic64_fetch_xor_release() there.
2653  *                                               2653  *
2654  * Return: The original value of @v.             2654  * Return: The original value of @v.
2655  */                                              2655  */
2656 static __always_inline s64                       2656 static __always_inline s64
2657 atomic64_fetch_xor_release(s64 i, atomic64_t     2657 atomic64_fetch_xor_release(s64 i, atomic64_t *v)
2658 {                                                2658 {
2659         kcsan_release();                         2659         kcsan_release();
2660         instrument_atomic_read_write(v, sizeo    2660         instrument_atomic_read_write(v, sizeof(*v));
2661         return raw_atomic64_fetch_xor_release    2661         return raw_atomic64_fetch_xor_release(i, v);
2662 }                                                2662 }
2663                                                  2663 
2664 /**                                              2664 /**
2665  * atomic64_fetch_xor_relaxed() - atomic bitw    2665  * atomic64_fetch_xor_relaxed() - atomic bitwise XOR with relaxed ordering
2666  * @i: s64 value                                 2666  * @i: s64 value
2667  * @v: pointer to atomic64_t                     2667  * @v: pointer to atomic64_t
2668  *                                               2668  *
2669  * Atomically updates @v to (@v ^ @i) with re    2669  * Atomically updates @v to (@v ^ @i) with relaxed ordering.
2670  *                                               2670  *
2671  * Unsafe to use in noinstr code; use raw_ato    2671  * Unsafe to use in noinstr code; use raw_atomic64_fetch_xor_relaxed() there.
2672  *                                               2672  *
2673  * Return: The original value of @v.             2673  * Return: The original value of @v.
2674  */                                              2674  */
2675 static __always_inline s64                       2675 static __always_inline s64
2676 atomic64_fetch_xor_relaxed(s64 i, atomic64_t     2676 atomic64_fetch_xor_relaxed(s64 i, atomic64_t *v)
2677 {                                                2677 {
2678         instrument_atomic_read_write(v, sizeo    2678         instrument_atomic_read_write(v, sizeof(*v));
2679         return raw_atomic64_fetch_xor_relaxed    2679         return raw_atomic64_fetch_xor_relaxed(i, v);
2680 }                                                2680 }
2681                                                  2681 
2682 /**                                              2682 /**
2683  * atomic64_xchg() - atomic exchange with ful    2683  * atomic64_xchg() - atomic exchange with full ordering
2684  * @v: pointer to atomic64_t                     2684  * @v: pointer to atomic64_t
2685  * @new: s64 value to assign                     2685  * @new: s64 value to assign
2686  *                                               2686  *
2687  * Atomically updates @v to @new with full or    2687  * Atomically updates @v to @new with full ordering.
2688  *                                               2688  *
2689  * Unsafe to use in noinstr code; use raw_ato    2689  * Unsafe to use in noinstr code; use raw_atomic64_xchg() there.
2690  *                                               2690  *
2691  * Return: The original value of @v.             2691  * Return: The original value of @v.
2692  */                                              2692  */
2693 static __always_inline s64                       2693 static __always_inline s64
2694 atomic64_xchg(atomic64_t *v, s64 new)            2694 atomic64_xchg(atomic64_t *v, s64 new)
2695 {                                                2695 {
2696         kcsan_mb();                              2696         kcsan_mb();
2697         instrument_atomic_read_write(v, sizeo    2697         instrument_atomic_read_write(v, sizeof(*v));
2698         return raw_atomic64_xchg(v, new);        2698         return raw_atomic64_xchg(v, new);
2699 }                                                2699 }
2700                                                  2700 
2701 /**                                              2701 /**
2702  * atomic64_xchg_acquire() - atomic exchange     2702  * atomic64_xchg_acquire() - atomic exchange with acquire ordering
2703  * @v: pointer to atomic64_t                     2703  * @v: pointer to atomic64_t
2704  * @new: s64 value to assign                     2704  * @new: s64 value to assign
2705  *                                               2705  *
2706  * Atomically updates @v to @new with acquire    2706  * Atomically updates @v to @new with acquire ordering.
2707  *                                               2707  *
2708  * Unsafe to use in noinstr code; use raw_ato    2708  * Unsafe to use in noinstr code; use raw_atomic64_xchg_acquire() there.
2709  *                                               2709  *
2710  * Return: The original value of @v.             2710  * Return: The original value of @v.
2711  */                                              2711  */
2712 static __always_inline s64                       2712 static __always_inline s64
2713 atomic64_xchg_acquire(atomic64_t *v, s64 new)    2713 atomic64_xchg_acquire(atomic64_t *v, s64 new)
2714 {                                                2714 {
2715         instrument_atomic_read_write(v, sizeo    2715         instrument_atomic_read_write(v, sizeof(*v));
2716         return raw_atomic64_xchg_acquire(v, n    2716         return raw_atomic64_xchg_acquire(v, new);
2717 }                                                2717 }
2718                                                  2718 
2719 /**                                              2719 /**
2720  * atomic64_xchg_release() - atomic exchange     2720  * atomic64_xchg_release() - atomic exchange with release ordering
2721  * @v: pointer to atomic64_t                     2721  * @v: pointer to atomic64_t
2722  * @new: s64 value to assign                     2722  * @new: s64 value to assign
2723  *                                               2723  *
2724  * Atomically updates @v to @new with release    2724  * Atomically updates @v to @new with release ordering.
2725  *                                               2725  *
2726  * Unsafe to use in noinstr code; use raw_ato    2726  * Unsafe to use in noinstr code; use raw_atomic64_xchg_release() there.
2727  *                                               2727  *
2728  * Return: The original value of @v.             2728  * Return: The original value of @v.
2729  */                                              2729  */
2730 static __always_inline s64                       2730 static __always_inline s64
2731 atomic64_xchg_release(atomic64_t *v, s64 new)    2731 atomic64_xchg_release(atomic64_t *v, s64 new)
2732 {                                                2732 {
2733         kcsan_release();                         2733         kcsan_release();
2734         instrument_atomic_read_write(v, sizeo    2734         instrument_atomic_read_write(v, sizeof(*v));
2735         return raw_atomic64_xchg_release(v, n    2735         return raw_atomic64_xchg_release(v, new);
2736 }                                                2736 }
2737                                                  2737 
2738 /**                                              2738 /**
2739  * atomic64_xchg_relaxed() - atomic exchange     2739  * atomic64_xchg_relaxed() - atomic exchange with relaxed ordering
2740  * @v: pointer to atomic64_t                     2740  * @v: pointer to atomic64_t
2741  * @new: s64 value to assign                     2741  * @new: s64 value to assign
2742  *                                               2742  *
2743  * Atomically updates @v to @new with relaxed    2743  * Atomically updates @v to @new with relaxed ordering.
2744  *                                               2744  *
2745  * Unsafe to use in noinstr code; use raw_ato    2745  * Unsafe to use in noinstr code; use raw_atomic64_xchg_relaxed() there.
2746  *                                               2746  *
2747  * Return: The original value of @v.             2747  * Return: The original value of @v.
2748  */                                              2748  */
2749 static __always_inline s64                       2749 static __always_inline s64
2750 atomic64_xchg_relaxed(atomic64_t *v, s64 new)    2750 atomic64_xchg_relaxed(atomic64_t *v, s64 new)
2751 {                                                2751 {
2752         instrument_atomic_read_write(v, sizeo    2752         instrument_atomic_read_write(v, sizeof(*v));
2753         return raw_atomic64_xchg_relaxed(v, n    2753         return raw_atomic64_xchg_relaxed(v, new);
2754 }                                                2754 }
2755                                                  2755 
2756 /**                                              2756 /**
2757  * atomic64_cmpxchg() - atomic compare and ex    2757  * atomic64_cmpxchg() - atomic compare and exchange with full ordering
2758  * @v: pointer to atomic64_t                     2758  * @v: pointer to atomic64_t
2759  * @old: s64 value to compare with               2759  * @old: s64 value to compare with
2760  * @new: s64 value to assign                     2760  * @new: s64 value to assign
2761  *                                               2761  *
2762  * If (@v == @old), atomically updates @v to     2762  * If (@v == @old), atomically updates @v to @new with full ordering.
2763  * Otherwise, @v is not modified and relaxed     2763  * Otherwise, @v is not modified and relaxed ordering is provided.
2764  *                                               2764  *
2765  * Unsafe to use in noinstr code; use raw_ato    2765  * Unsafe to use in noinstr code; use raw_atomic64_cmpxchg() there.
2766  *                                               2766  *
2767  * Return: The original value of @v.             2767  * Return: The original value of @v.
2768  */                                              2768  */
2769 static __always_inline s64                       2769 static __always_inline s64
2770 atomic64_cmpxchg(atomic64_t *v, s64 old, s64     2770 atomic64_cmpxchg(atomic64_t *v, s64 old, s64 new)
2771 {                                                2771 {
2772         kcsan_mb();                              2772         kcsan_mb();
2773         instrument_atomic_read_write(v, sizeo    2773         instrument_atomic_read_write(v, sizeof(*v));
2774         return raw_atomic64_cmpxchg(v, old, n    2774         return raw_atomic64_cmpxchg(v, old, new);
2775 }                                                2775 }
2776                                                  2776 
2777 /**                                              2777 /**
2778  * atomic64_cmpxchg_acquire() - atomic compar    2778  * atomic64_cmpxchg_acquire() - atomic compare and exchange with acquire ordering
2779  * @v: pointer to atomic64_t                     2779  * @v: pointer to atomic64_t
2780  * @old: s64 value to compare with               2780  * @old: s64 value to compare with
2781  * @new: s64 value to assign                     2781  * @new: s64 value to assign
2782  *                                               2782  *
2783  * If (@v == @old), atomically updates @v to     2783  * If (@v == @old), atomically updates @v to @new with acquire ordering.
2784  * Otherwise, @v is not modified and relaxed     2784  * Otherwise, @v is not modified and relaxed ordering is provided.
2785  *                                               2785  *
2786  * Unsafe to use in noinstr code; use raw_ato    2786  * Unsafe to use in noinstr code; use raw_atomic64_cmpxchg_acquire() there.
2787  *                                               2787  *
2788  * Return: The original value of @v.             2788  * Return: The original value of @v.
2789  */                                              2789  */
2790 static __always_inline s64                       2790 static __always_inline s64
2791 atomic64_cmpxchg_acquire(atomic64_t *v, s64 o    2791 atomic64_cmpxchg_acquire(atomic64_t *v, s64 old, s64 new)
2792 {                                                2792 {
2793         instrument_atomic_read_write(v, sizeo    2793         instrument_atomic_read_write(v, sizeof(*v));
2794         return raw_atomic64_cmpxchg_acquire(v    2794         return raw_atomic64_cmpxchg_acquire(v, old, new);
2795 }                                                2795 }
2796                                                  2796 
2797 /**                                              2797 /**
2798  * atomic64_cmpxchg_release() - atomic compar    2798  * atomic64_cmpxchg_release() - atomic compare and exchange with release ordering
2799  * @v: pointer to atomic64_t                     2799  * @v: pointer to atomic64_t
2800  * @old: s64 value to compare with               2800  * @old: s64 value to compare with
2801  * @new: s64 value to assign                     2801  * @new: s64 value to assign
2802  *                                               2802  *
2803  * If (@v == @old), atomically updates @v to     2803  * If (@v == @old), atomically updates @v to @new with release ordering.
2804  * Otherwise, @v is not modified and relaxed     2804  * Otherwise, @v is not modified and relaxed ordering is provided.
2805  *                                               2805  *
2806  * Unsafe to use in noinstr code; use raw_ato    2806  * Unsafe to use in noinstr code; use raw_atomic64_cmpxchg_release() there.
2807  *                                               2807  *
2808  * Return: The original value of @v.             2808  * Return: The original value of @v.
2809  */                                              2809  */
2810 static __always_inline s64                       2810 static __always_inline s64
2811 atomic64_cmpxchg_release(atomic64_t *v, s64 o    2811 atomic64_cmpxchg_release(atomic64_t *v, s64 old, s64 new)
2812 {                                                2812 {
2813         kcsan_release();                         2813         kcsan_release();
2814         instrument_atomic_read_write(v, sizeo    2814         instrument_atomic_read_write(v, sizeof(*v));
2815         return raw_atomic64_cmpxchg_release(v    2815         return raw_atomic64_cmpxchg_release(v, old, new);
2816 }                                                2816 }
2817                                                  2817 
2818 /**                                              2818 /**
2819  * atomic64_cmpxchg_relaxed() - atomic compar    2819  * atomic64_cmpxchg_relaxed() - atomic compare and exchange with relaxed ordering
2820  * @v: pointer to atomic64_t                     2820  * @v: pointer to atomic64_t
2821  * @old: s64 value to compare with               2821  * @old: s64 value to compare with
2822  * @new: s64 value to assign                     2822  * @new: s64 value to assign
2823  *                                               2823  *
2824  * If (@v == @old), atomically updates @v to     2824  * If (@v == @old), atomically updates @v to @new with relaxed ordering.
2825  * Otherwise, @v is not modified and relaxed     2825  * Otherwise, @v is not modified and relaxed ordering is provided.
2826  *                                               2826  *
2827  * Unsafe to use in noinstr code; use raw_ato    2827  * Unsafe to use in noinstr code; use raw_atomic64_cmpxchg_relaxed() there.
2828  *                                               2828  *
2829  * Return: The original value of @v.             2829  * Return: The original value of @v.
2830  */                                              2830  */
2831 static __always_inline s64                       2831 static __always_inline s64
2832 atomic64_cmpxchg_relaxed(atomic64_t *v, s64 o    2832 atomic64_cmpxchg_relaxed(atomic64_t *v, s64 old, s64 new)
2833 {                                                2833 {
2834         instrument_atomic_read_write(v, sizeo    2834         instrument_atomic_read_write(v, sizeof(*v));
2835         return raw_atomic64_cmpxchg_relaxed(v    2835         return raw_atomic64_cmpxchg_relaxed(v, old, new);
2836 }                                                2836 }
2837                                                  2837 
2838 /**                                              2838 /**
2839  * atomic64_try_cmpxchg() - atomic compare an    2839  * atomic64_try_cmpxchg() - atomic compare and exchange with full ordering
2840  * @v: pointer to atomic64_t                     2840  * @v: pointer to atomic64_t
2841  * @old: pointer to s64 value to compare with    2841  * @old: pointer to s64 value to compare with
2842  * @new: s64 value to assign                     2842  * @new: s64 value to assign
2843  *                                               2843  *
2844  * If (@v == @old), atomically updates @v to     2844  * If (@v == @old), atomically updates @v to @new with full ordering.
2845  * Otherwise, @v is not modified, @old is upd    2845  * Otherwise, @v is not modified, @old is updated to the current value of @v,
2846  * and relaxed ordering is provided.             2846  * and relaxed ordering is provided.
2847  *                                               2847  *
2848  * Unsafe to use in noinstr code; use raw_ato    2848  * Unsafe to use in noinstr code; use raw_atomic64_try_cmpxchg() there.
2849  *                                               2849  *
2850  * Return: @true if the exchange occured, @fa    2850  * Return: @true if the exchange occured, @false otherwise.
2851  */                                              2851  */
2852 static __always_inline bool                      2852 static __always_inline bool
2853 atomic64_try_cmpxchg(atomic64_t *v, s64 *old,    2853 atomic64_try_cmpxchg(atomic64_t *v, s64 *old, s64 new)
2854 {                                                2854 {
2855         kcsan_mb();                              2855         kcsan_mb();
2856         instrument_atomic_read_write(v, sizeo    2856         instrument_atomic_read_write(v, sizeof(*v));
2857         instrument_atomic_read_write(old, siz    2857         instrument_atomic_read_write(old, sizeof(*old));
2858         return raw_atomic64_try_cmpxchg(v, ol    2858         return raw_atomic64_try_cmpxchg(v, old, new);
2859 }                                                2859 }
2860                                                  2860 
2861 /**                                              2861 /**
2862  * atomic64_try_cmpxchg_acquire() - atomic co    2862  * atomic64_try_cmpxchg_acquire() - atomic compare and exchange with acquire ordering
2863  * @v: pointer to atomic64_t                     2863  * @v: pointer to atomic64_t
2864  * @old: pointer to s64 value to compare with    2864  * @old: pointer to s64 value to compare with
2865  * @new: s64 value to assign                     2865  * @new: s64 value to assign
2866  *                                               2866  *
2867  * If (@v == @old), atomically updates @v to     2867  * If (@v == @old), atomically updates @v to @new with acquire ordering.
2868  * Otherwise, @v is not modified, @old is upd    2868  * Otherwise, @v is not modified, @old is updated to the current value of @v,
2869  * and relaxed ordering is provided.             2869  * and relaxed ordering is provided.
2870  *                                               2870  *
2871  * Unsafe to use in noinstr code; use raw_ato    2871  * Unsafe to use in noinstr code; use raw_atomic64_try_cmpxchg_acquire() there.
2872  *                                               2872  *
2873  * Return: @true if the exchange occured, @fa    2873  * Return: @true if the exchange occured, @false otherwise.
2874  */                                              2874  */
2875 static __always_inline bool                      2875 static __always_inline bool
2876 atomic64_try_cmpxchg_acquire(atomic64_t *v, s    2876 atomic64_try_cmpxchg_acquire(atomic64_t *v, s64 *old, s64 new)
2877 {                                                2877 {
2878         instrument_atomic_read_write(v, sizeo    2878         instrument_atomic_read_write(v, sizeof(*v));
2879         instrument_atomic_read_write(old, siz    2879         instrument_atomic_read_write(old, sizeof(*old));
2880         return raw_atomic64_try_cmpxchg_acqui    2880         return raw_atomic64_try_cmpxchg_acquire(v, old, new);
2881 }                                                2881 }
2882                                                  2882 
2883 /**                                              2883 /**
2884  * atomic64_try_cmpxchg_release() - atomic co    2884  * atomic64_try_cmpxchg_release() - atomic compare and exchange with release ordering
2885  * @v: pointer to atomic64_t                     2885  * @v: pointer to atomic64_t
2886  * @old: pointer to s64 value to compare with    2886  * @old: pointer to s64 value to compare with
2887  * @new: s64 value to assign                     2887  * @new: s64 value to assign
2888  *                                               2888  *
2889  * If (@v == @old), atomically updates @v to     2889  * If (@v == @old), atomically updates @v to @new with release ordering.
2890  * Otherwise, @v is not modified, @old is upd    2890  * Otherwise, @v is not modified, @old is updated to the current value of @v,
2891  * and relaxed ordering is provided.             2891  * and relaxed ordering is provided.
2892  *                                               2892  *
2893  * Unsafe to use in noinstr code; use raw_ato    2893  * Unsafe to use in noinstr code; use raw_atomic64_try_cmpxchg_release() there.
2894  *                                               2894  *
2895  * Return: @true if the exchange occured, @fa    2895  * Return: @true if the exchange occured, @false otherwise.
2896  */                                              2896  */
2897 static __always_inline bool                      2897 static __always_inline bool
2898 atomic64_try_cmpxchg_release(atomic64_t *v, s    2898 atomic64_try_cmpxchg_release(atomic64_t *v, s64 *old, s64 new)
2899 {                                                2899 {
2900         kcsan_release();                         2900         kcsan_release();
2901         instrument_atomic_read_write(v, sizeo    2901         instrument_atomic_read_write(v, sizeof(*v));
2902         instrument_atomic_read_write(old, siz    2902         instrument_atomic_read_write(old, sizeof(*old));
2903         return raw_atomic64_try_cmpxchg_relea    2903         return raw_atomic64_try_cmpxchg_release(v, old, new);
2904 }                                                2904 }
2905                                                  2905 
2906 /**                                              2906 /**
2907  * atomic64_try_cmpxchg_relaxed() - atomic co    2907  * atomic64_try_cmpxchg_relaxed() - atomic compare and exchange with relaxed ordering
2908  * @v: pointer to atomic64_t                     2908  * @v: pointer to atomic64_t
2909  * @old: pointer to s64 value to compare with    2909  * @old: pointer to s64 value to compare with
2910  * @new: s64 value to assign                     2910  * @new: s64 value to assign
2911  *                                               2911  *
2912  * If (@v == @old), atomically updates @v to     2912  * If (@v == @old), atomically updates @v to @new with relaxed ordering.
2913  * Otherwise, @v is not modified, @old is upd    2913  * Otherwise, @v is not modified, @old is updated to the current value of @v,
2914  * and relaxed ordering is provided.             2914  * and relaxed ordering is provided.
2915  *                                               2915  *
2916  * Unsafe to use in noinstr code; use raw_ato    2916  * Unsafe to use in noinstr code; use raw_atomic64_try_cmpxchg_relaxed() there.
2917  *                                               2917  *
2918  * Return: @true if the exchange occured, @fa    2918  * Return: @true if the exchange occured, @false otherwise.
2919  */                                              2919  */
2920 static __always_inline bool                      2920 static __always_inline bool
2921 atomic64_try_cmpxchg_relaxed(atomic64_t *v, s    2921 atomic64_try_cmpxchg_relaxed(atomic64_t *v, s64 *old, s64 new)
2922 {                                                2922 {
2923         instrument_atomic_read_write(v, sizeo    2923         instrument_atomic_read_write(v, sizeof(*v));
2924         instrument_atomic_read_write(old, siz    2924         instrument_atomic_read_write(old, sizeof(*old));
2925         return raw_atomic64_try_cmpxchg_relax    2925         return raw_atomic64_try_cmpxchg_relaxed(v, old, new);
2926 }                                                2926 }
2927                                                  2927 
2928 /**                                              2928 /**
2929  * atomic64_sub_and_test() - atomic subtract     2929  * atomic64_sub_and_test() - atomic subtract and test if zero with full ordering
2930  * @i: s64 value to subtract                     2930  * @i: s64 value to subtract
2931  * @v: pointer to atomic64_t                     2931  * @v: pointer to atomic64_t
2932  *                                               2932  *
2933  * Atomically updates @v to (@v - @i) with fu    2933  * Atomically updates @v to (@v - @i) with full ordering.
2934  *                                               2934  *
2935  * Unsafe to use in noinstr code; use raw_ato    2935  * Unsafe to use in noinstr code; use raw_atomic64_sub_and_test() there.
2936  *                                               2936  *
2937  * Return: @true if the resulting value of @v    2937  * Return: @true if the resulting value of @v is zero, @false otherwise.
2938  */                                              2938  */
2939 static __always_inline bool                      2939 static __always_inline bool
2940 atomic64_sub_and_test(s64 i, atomic64_t *v)      2940 atomic64_sub_and_test(s64 i, atomic64_t *v)
2941 {                                                2941 {
2942         kcsan_mb();                              2942         kcsan_mb();
2943         instrument_atomic_read_write(v, sizeo    2943         instrument_atomic_read_write(v, sizeof(*v));
2944         return raw_atomic64_sub_and_test(i, v    2944         return raw_atomic64_sub_and_test(i, v);
2945 }                                                2945 }
2946                                                  2946 
2947 /**                                              2947 /**
2948  * atomic64_dec_and_test() - atomic decrement    2948  * atomic64_dec_and_test() - atomic decrement and test if zero with full ordering
2949  * @v: pointer to atomic64_t                     2949  * @v: pointer to atomic64_t
2950  *                                               2950  *
2951  * Atomically updates @v to (@v - 1) with ful    2951  * Atomically updates @v to (@v - 1) with full ordering.
2952  *                                               2952  *
2953  * Unsafe to use in noinstr code; use raw_ato    2953  * Unsafe to use in noinstr code; use raw_atomic64_dec_and_test() there.
2954  *                                               2954  *
2955  * Return: @true if the resulting value of @v    2955  * Return: @true if the resulting value of @v is zero, @false otherwise.
2956  */                                              2956  */
2957 static __always_inline bool                      2957 static __always_inline bool
2958 atomic64_dec_and_test(atomic64_t *v)             2958 atomic64_dec_and_test(atomic64_t *v)
2959 {                                                2959 {
2960         kcsan_mb();                              2960         kcsan_mb();
2961         instrument_atomic_read_write(v, sizeo    2961         instrument_atomic_read_write(v, sizeof(*v));
2962         return raw_atomic64_dec_and_test(v);     2962         return raw_atomic64_dec_and_test(v);
2963 }                                                2963 }
2964                                                  2964 
2965 /**                                              2965 /**
2966  * atomic64_inc_and_test() - atomic increment    2966  * atomic64_inc_and_test() - atomic increment and test if zero with full ordering
2967  * @v: pointer to atomic64_t                     2967  * @v: pointer to atomic64_t
2968  *                                               2968  *
2969  * Atomically updates @v to (@v + 1) with ful    2969  * Atomically updates @v to (@v + 1) with full ordering.
2970  *                                               2970  *
2971  * Unsafe to use in noinstr code; use raw_ato    2971  * Unsafe to use in noinstr code; use raw_atomic64_inc_and_test() there.
2972  *                                               2972  *
2973  * Return: @true if the resulting value of @v    2973  * Return: @true if the resulting value of @v is zero, @false otherwise.
2974  */                                              2974  */
2975 static __always_inline bool                      2975 static __always_inline bool
2976 atomic64_inc_and_test(atomic64_t *v)             2976 atomic64_inc_and_test(atomic64_t *v)
2977 {                                                2977 {
2978         kcsan_mb();                              2978         kcsan_mb();
2979         instrument_atomic_read_write(v, sizeo    2979         instrument_atomic_read_write(v, sizeof(*v));
2980         return raw_atomic64_inc_and_test(v);     2980         return raw_atomic64_inc_and_test(v);
2981 }                                                2981 }
2982                                                  2982 
2983 /**                                              2983 /**
2984  * atomic64_add_negative() - atomic add and t    2984  * atomic64_add_negative() - atomic add and test if negative with full ordering
2985  * @i: s64 value to add                          2985  * @i: s64 value to add
2986  * @v: pointer to atomic64_t                     2986  * @v: pointer to atomic64_t
2987  *                                               2987  *
2988  * Atomically updates @v to (@v + @i) with fu    2988  * Atomically updates @v to (@v + @i) with full ordering.
2989  *                                               2989  *
2990  * Unsafe to use in noinstr code; use raw_ato    2990  * Unsafe to use in noinstr code; use raw_atomic64_add_negative() there.
2991  *                                               2991  *
2992  * Return: @true if the resulting value of @v    2992  * Return: @true if the resulting value of @v is negative, @false otherwise.
2993  */                                              2993  */
2994 static __always_inline bool                      2994 static __always_inline bool
2995 atomic64_add_negative(s64 i, atomic64_t *v)      2995 atomic64_add_negative(s64 i, atomic64_t *v)
2996 {                                                2996 {
2997         kcsan_mb();                              2997         kcsan_mb();
2998         instrument_atomic_read_write(v, sizeo    2998         instrument_atomic_read_write(v, sizeof(*v));
2999         return raw_atomic64_add_negative(i, v    2999         return raw_atomic64_add_negative(i, v);
3000 }                                                3000 }
3001                                                  3001 
3002 /**                                              3002 /**
3003  * atomic64_add_negative_acquire() - atomic a    3003  * atomic64_add_negative_acquire() - atomic add and test if negative with acquire ordering
3004  * @i: s64 value to add                          3004  * @i: s64 value to add
3005  * @v: pointer to atomic64_t                     3005  * @v: pointer to atomic64_t
3006  *                                               3006  *
3007  * Atomically updates @v to (@v + @i) with ac    3007  * Atomically updates @v to (@v + @i) with acquire ordering.
3008  *                                               3008  *
3009  * Unsafe to use in noinstr code; use raw_ato    3009  * Unsafe to use in noinstr code; use raw_atomic64_add_negative_acquire() there.
3010  *                                               3010  *
3011  * Return: @true if the resulting value of @v    3011  * Return: @true if the resulting value of @v is negative, @false otherwise.
3012  */                                              3012  */
3013 static __always_inline bool                      3013 static __always_inline bool
3014 atomic64_add_negative_acquire(s64 i, atomic64    3014 atomic64_add_negative_acquire(s64 i, atomic64_t *v)
3015 {                                                3015 {
3016         instrument_atomic_read_write(v, sizeo    3016         instrument_atomic_read_write(v, sizeof(*v));
3017         return raw_atomic64_add_negative_acqu    3017         return raw_atomic64_add_negative_acquire(i, v);
3018 }                                                3018 }
3019                                                  3019 
3020 /**                                              3020 /**
3021  * atomic64_add_negative_release() - atomic a    3021  * atomic64_add_negative_release() - atomic add and test if negative with release ordering
3022  * @i: s64 value to add                          3022  * @i: s64 value to add
3023  * @v: pointer to atomic64_t                     3023  * @v: pointer to atomic64_t
3024  *                                               3024  *
3025  * Atomically updates @v to (@v + @i) with re    3025  * Atomically updates @v to (@v + @i) with release ordering.
3026  *                                               3026  *
3027  * Unsafe to use in noinstr code; use raw_ato    3027  * Unsafe to use in noinstr code; use raw_atomic64_add_negative_release() there.
3028  *                                               3028  *
3029  * Return: @true if the resulting value of @v    3029  * Return: @true if the resulting value of @v is negative, @false otherwise.
3030  */                                              3030  */
3031 static __always_inline bool                      3031 static __always_inline bool
3032 atomic64_add_negative_release(s64 i, atomic64    3032 atomic64_add_negative_release(s64 i, atomic64_t *v)
3033 {                                                3033 {
3034         kcsan_release();                         3034         kcsan_release();
3035         instrument_atomic_read_write(v, sizeo    3035         instrument_atomic_read_write(v, sizeof(*v));
3036         return raw_atomic64_add_negative_rele    3036         return raw_atomic64_add_negative_release(i, v);
3037 }                                                3037 }
3038                                                  3038 
3039 /**                                              3039 /**
3040  * atomic64_add_negative_relaxed() - atomic a    3040  * atomic64_add_negative_relaxed() - atomic add and test if negative with relaxed ordering
3041  * @i: s64 value to add                          3041  * @i: s64 value to add
3042  * @v: pointer to atomic64_t                     3042  * @v: pointer to atomic64_t
3043  *                                               3043  *
3044  * Atomically updates @v to (@v + @i) with re    3044  * Atomically updates @v to (@v + @i) with relaxed ordering.
3045  *                                               3045  *
3046  * Unsafe to use in noinstr code; use raw_ato    3046  * Unsafe to use in noinstr code; use raw_atomic64_add_negative_relaxed() there.
3047  *                                               3047  *
3048  * Return: @true if the resulting value of @v    3048  * Return: @true if the resulting value of @v is negative, @false otherwise.
3049  */                                              3049  */
3050 static __always_inline bool                      3050 static __always_inline bool
3051 atomic64_add_negative_relaxed(s64 i, atomic64    3051 atomic64_add_negative_relaxed(s64 i, atomic64_t *v)
3052 {                                                3052 {
3053         instrument_atomic_read_write(v, sizeo    3053         instrument_atomic_read_write(v, sizeof(*v));
3054         return raw_atomic64_add_negative_rela    3054         return raw_atomic64_add_negative_relaxed(i, v);
3055 }                                                3055 }
3056                                                  3056 
3057 /**                                              3057 /**
3058  * atomic64_fetch_add_unless() - atomic add u    3058  * atomic64_fetch_add_unless() - atomic add unless value with full ordering
3059  * @v: pointer to atomic64_t                     3059  * @v: pointer to atomic64_t
3060  * @a: s64 value to add                          3060  * @a: s64 value to add
3061  * @u: s64 value to compare with                 3061  * @u: s64 value to compare with
3062  *                                               3062  *
3063  * If (@v != @u), atomically updates @v to (@    3063  * If (@v != @u), atomically updates @v to (@v + @a) with full ordering.
3064  * Otherwise, @v is not modified and relaxed     3064  * Otherwise, @v is not modified and relaxed ordering is provided.
3065  *                                               3065  *
3066  * Unsafe to use in noinstr code; use raw_ato    3066  * Unsafe to use in noinstr code; use raw_atomic64_fetch_add_unless() there.
3067  *                                               3067  *
3068  * Return: The original value of @v.             3068  * Return: The original value of @v.
3069  */                                              3069  */
3070 static __always_inline s64                       3070 static __always_inline s64
3071 atomic64_fetch_add_unless(atomic64_t *v, s64     3071 atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u)
3072 {                                                3072 {
3073         kcsan_mb();                              3073         kcsan_mb();
3074         instrument_atomic_read_write(v, sizeo    3074         instrument_atomic_read_write(v, sizeof(*v));
3075         return raw_atomic64_fetch_add_unless(    3075         return raw_atomic64_fetch_add_unless(v, a, u);
3076 }                                                3076 }
3077                                                  3077 
3078 /**                                              3078 /**
3079  * atomic64_add_unless() - atomic add unless     3079  * atomic64_add_unless() - atomic add unless value with full ordering
3080  * @v: pointer to atomic64_t                     3080  * @v: pointer to atomic64_t
3081  * @a: s64 value to add                          3081  * @a: s64 value to add
3082  * @u: s64 value to compare with                 3082  * @u: s64 value to compare with
3083  *                                               3083  *
3084  * If (@v != @u), atomically updates @v to (@    3084  * If (@v != @u), atomically updates @v to (@v + @a) with full ordering.
3085  * Otherwise, @v is not modified and relaxed     3085  * Otherwise, @v is not modified and relaxed ordering is provided.
3086  *                                               3086  *
3087  * Unsafe to use in noinstr code; use raw_ato    3087  * Unsafe to use in noinstr code; use raw_atomic64_add_unless() there.
3088  *                                               3088  *
3089  * Return: @true if @v was updated, @false ot    3089  * Return: @true if @v was updated, @false otherwise.
3090  */                                              3090  */
3091 static __always_inline bool                      3091 static __always_inline bool
3092 atomic64_add_unless(atomic64_t *v, s64 a, s64    3092 atomic64_add_unless(atomic64_t *v, s64 a, s64 u)
3093 {                                                3093 {
3094         kcsan_mb();                              3094         kcsan_mb();
3095         instrument_atomic_read_write(v, sizeo    3095         instrument_atomic_read_write(v, sizeof(*v));
3096         return raw_atomic64_add_unless(v, a,     3096         return raw_atomic64_add_unless(v, a, u);
3097 }                                                3097 }
3098                                                  3098 
3099 /**                                              3099 /**
3100  * atomic64_inc_not_zero() - atomic increment    3100  * atomic64_inc_not_zero() - atomic increment unless zero with full ordering
3101  * @v: pointer to atomic64_t                     3101  * @v: pointer to atomic64_t
3102  *                                               3102  *
3103  * If (@v != 0), atomically updates @v to (@v    3103  * If (@v != 0), atomically updates @v to (@v + 1) with full ordering.
3104  * Otherwise, @v is not modified and relaxed     3104  * Otherwise, @v is not modified and relaxed ordering is provided.
3105  *                                               3105  *
3106  * Unsafe to use in noinstr code; use raw_ato    3106  * Unsafe to use in noinstr code; use raw_atomic64_inc_not_zero() there.
3107  *                                               3107  *
3108  * Return: @true if @v was updated, @false ot    3108  * Return: @true if @v was updated, @false otherwise.
3109  */                                              3109  */
3110 static __always_inline bool                      3110 static __always_inline bool
3111 atomic64_inc_not_zero(atomic64_t *v)             3111 atomic64_inc_not_zero(atomic64_t *v)
3112 {                                                3112 {
3113         kcsan_mb();                              3113         kcsan_mb();
3114         instrument_atomic_read_write(v, sizeo    3114         instrument_atomic_read_write(v, sizeof(*v));
3115         return raw_atomic64_inc_not_zero(v);     3115         return raw_atomic64_inc_not_zero(v);
3116 }                                                3116 }
3117                                                  3117 
3118 /**                                              3118 /**
3119  * atomic64_inc_unless_negative() - atomic in    3119  * atomic64_inc_unless_negative() - atomic increment unless negative with full ordering
3120  * @v: pointer to atomic64_t                     3120  * @v: pointer to atomic64_t
3121  *                                               3121  *
3122  * If (@v >= 0), atomically updates @v to (@v    3122  * If (@v >= 0), atomically updates @v to (@v + 1) with full ordering.
3123  * Otherwise, @v is not modified and relaxed     3123  * Otherwise, @v is not modified and relaxed ordering is provided.
3124  *                                               3124  *
3125  * Unsafe to use in noinstr code; use raw_ato    3125  * Unsafe to use in noinstr code; use raw_atomic64_inc_unless_negative() there.
3126  *                                               3126  *
3127  * Return: @true if @v was updated, @false ot    3127  * Return: @true if @v was updated, @false otherwise.
3128  */                                              3128  */
3129 static __always_inline bool                      3129 static __always_inline bool
3130 atomic64_inc_unless_negative(atomic64_t *v)      3130 atomic64_inc_unless_negative(atomic64_t *v)
3131 {                                                3131 {
3132         kcsan_mb();                              3132         kcsan_mb();
3133         instrument_atomic_read_write(v, sizeo    3133         instrument_atomic_read_write(v, sizeof(*v));
3134         return raw_atomic64_inc_unless_negati    3134         return raw_atomic64_inc_unless_negative(v);
3135 }                                                3135 }
3136                                                  3136 
3137 /**                                              3137 /**
3138  * atomic64_dec_unless_positive() - atomic de    3138  * atomic64_dec_unless_positive() - atomic decrement unless positive with full ordering
3139  * @v: pointer to atomic64_t                     3139  * @v: pointer to atomic64_t
3140  *                                               3140  *
3141  * If (@v <= 0), atomically updates @v to (@v    3141  * If (@v <= 0), atomically updates @v to (@v - 1) with full ordering.
3142  * Otherwise, @v is not modified and relaxed     3142  * Otherwise, @v is not modified and relaxed ordering is provided.
3143  *                                               3143  *
3144  * Unsafe to use in noinstr code; use raw_ato    3144  * Unsafe to use in noinstr code; use raw_atomic64_dec_unless_positive() there.
3145  *                                               3145  *
3146  * Return: @true if @v was updated, @false ot    3146  * Return: @true if @v was updated, @false otherwise.
3147  */                                              3147  */
3148 static __always_inline bool                      3148 static __always_inline bool
3149 atomic64_dec_unless_positive(atomic64_t *v)      3149 atomic64_dec_unless_positive(atomic64_t *v)
3150 {                                                3150 {
3151         kcsan_mb();                              3151         kcsan_mb();
3152         instrument_atomic_read_write(v, sizeo    3152         instrument_atomic_read_write(v, sizeof(*v));
3153         return raw_atomic64_dec_unless_positi    3153         return raw_atomic64_dec_unless_positive(v);
3154 }                                                3154 }
3155                                                  3155 
3156 /**                                              3156 /**
3157  * atomic64_dec_if_positive() - atomic decrem    3157  * atomic64_dec_if_positive() - atomic decrement if positive with full ordering
3158  * @v: pointer to atomic64_t                     3158  * @v: pointer to atomic64_t
3159  *                                               3159  *
3160  * If (@v > 0), atomically updates @v to (@v     3160  * If (@v > 0), atomically updates @v to (@v - 1) with full ordering.
3161  * Otherwise, @v is not modified and relaxed     3161  * Otherwise, @v is not modified and relaxed ordering is provided.
3162  *                                               3162  *
3163  * Unsafe to use in noinstr code; use raw_ato    3163  * Unsafe to use in noinstr code; use raw_atomic64_dec_if_positive() there.
3164  *                                               3164  *
3165  * Return: The old value of (@v - 1), regardl    3165  * Return: The old value of (@v - 1), regardless of whether @v was updated.
3166  */                                              3166  */
3167 static __always_inline s64                       3167 static __always_inline s64
3168 atomic64_dec_if_positive(atomic64_t *v)          3168 atomic64_dec_if_positive(atomic64_t *v)
3169 {                                                3169 {
3170         kcsan_mb();                              3170         kcsan_mb();
3171         instrument_atomic_read_write(v, sizeo    3171         instrument_atomic_read_write(v, sizeof(*v));
3172         return raw_atomic64_dec_if_positive(v    3172         return raw_atomic64_dec_if_positive(v);
3173 }                                                3173 }
3174                                                  3174 
3175 /**                                              3175 /**
3176  * atomic_long_read() - atomic load with rela    3176  * atomic_long_read() - atomic load with relaxed ordering
3177  * @v: pointer to atomic_long_t                  3177  * @v: pointer to atomic_long_t
3178  *                                               3178  *
3179  * Atomically loads the value of @v with rela    3179  * Atomically loads the value of @v with relaxed ordering.
3180  *                                               3180  *
3181  * Unsafe to use in noinstr code; use raw_ato    3181  * Unsafe to use in noinstr code; use raw_atomic_long_read() there.
3182  *                                               3182  *
3183  * Return: The value loaded from @v.             3183  * Return: The value loaded from @v.
3184  */                                              3184  */
3185 static __always_inline long                      3185 static __always_inline long
3186 atomic_long_read(const atomic_long_t *v)         3186 atomic_long_read(const atomic_long_t *v)
3187 {                                                3187 {
3188         instrument_atomic_read(v, sizeof(*v))    3188         instrument_atomic_read(v, sizeof(*v));
3189         return raw_atomic_long_read(v);          3189         return raw_atomic_long_read(v);
3190 }                                                3190 }
3191                                                  3191 
3192 /**                                              3192 /**
3193  * atomic_long_read_acquire() - atomic load w    3193  * atomic_long_read_acquire() - atomic load with acquire ordering
3194  * @v: pointer to atomic_long_t                  3194  * @v: pointer to atomic_long_t
3195  *                                               3195  *
3196  * Atomically loads the value of @v with acqu    3196  * Atomically loads the value of @v with acquire ordering.
3197  *                                               3197  *
3198  * Unsafe to use in noinstr code; use raw_ato    3198  * Unsafe to use in noinstr code; use raw_atomic_long_read_acquire() there.
3199  *                                               3199  *
3200  * Return: The value loaded from @v.             3200  * Return: The value loaded from @v.
3201  */                                              3201  */
3202 static __always_inline long                      3202 static __always_inline long
3203 atomic_long_read_acquire(const atomic_long_t     3203 atomic_long_read_acquire(const atomic_long_t *v)
3204 {                                                3204 {
3205         instrument_atomic_read(v, sizeof(*v))    3205         instrument_atomic_read(v, sizeof(*v));
3206         return raw_atomic_long_read_acquire(v    3206         return raw_atomic_long_read_acquire(v);
3207 }                                                3207 }
3208                                                  3208 
3209 /**                                              3209 /**
3210  * atomic_long_set() - atomic set with relaxe    3210  * atomic_long_set() - atomic set with relaxed ordering
3211  * @v: pointer to atomic_long_t                  3211  * @v: pointer to atomic_long_t
3212  * @i: long value to assign                      3212  * @i: long value to assign
3213  *                                               3213  *
3214  * Atomically sets @v to @i with relaxed orde    3214  * Atomically sets @v to @i with relaxed ordering.
3215  *                                               3215  *
3216  * Unsafe to use in noinstr code; use raw_ato    3216  * Unsafe to use in noinstr code; use raw_atomic_long_set() there.
3217  *                                               3217  *
3218  * Return: Nothing.                              3218  * Return: Nothing.
3219  */                                              3219  */
3220 static __always_inline void                      3220 static __always_inline void
3221 atomic_long_set(atomic_long_t *v, long i)        3221 atomic_long_set(atomic_long_t *v, long i)
3222 {                                                3222 {
3223         instrument_atomic_write(v, sizeof(*v)    3223         instrument_atomic_write(v, sizeof(*v));
3224         raw_atomic_long_set(v, i);               3224         raw_atomic_long_set(v, i);
3225 }                                                3225 }
3226                                                  3226 
3227 /**                                              3227 /**
3228  * atomic_long_set_release() - atomic set wit    3228  * atomic_long_set_release() - atomic set with release ordering
3229  * @v: pointer to atomic_long_t                  3229  * @v: pointer to atomic_long_t
3230  * @i: long value to assign                      3230  * @i: long value to assign
3231  *                                               3231  *
3232  * Atomically sets @v to @i with release orde    3232  * Atomically sets @v to @i with release ordering.
3233  *                                               3233  *
3234  * Unsafe to use in noinstr code; use raw_ato    3234  * Unsafe to use in noinstr code; use raw_atomic_long_set_release() there.
3235  *                                               3235  *
3236  * Return: Nothing.                              3236  * Return: Nothing.
3237  */                                              3237  */
3238 static __always_inline void                      3238 static __always_inline void
3239 atomic_long_set_release(atomic_long_t *v, lon    3239 atomic_long_set_release(atomic_long_t *v, long i)
3240 {                                                3240 {
3241         kcsan_release();                         3241         kcsan_release();
3242         instrument_atomic_write(v, sizeof(*v)    3242         instrument_atomic_write(v, sizeof(*v));
3243         raw_atomic_long_set_release(v, i);       3243         raw_atomic_long_set_release(v, i);
3244 }                                                3244 }
3245                                                  3245 
3246 /**                                              3246 /**
3247  * atomic_long_add() - atomic add with relaxe    3247  * atomic_long_add() - atomic add with relaxed ordering
3248  * @i: long value to add                         3248  * @i: long value to add
3249  * @v: pointer to atomic_long_t                  3249  * @v: pointer to atomic_long_t
3250  *                                               3250  *
3251  * Atomically updates @v to (@v + @i) with re    3251  * Atomically updates @v to (@v + @i) with relaxed ordering.
3252  *                                               3252  *
3253  * Unsafe to use in noinstr code; use raw_ato    3253  * Unsafe to use in noinstr code; use raw_atomic_long_add() there.
3254  *                                               3254  *
3255  * Return: Nothing.                              3255  * Return: Nothing.
3256  */                                              3256  */
3257 static __always_inline void                      3257 static __always_inline void
3258 atomic_long_add(long i, atomic_long_t *v)        3258 atomic_long_add(long i, atomic_long_t *v)
3259 {                                                3259 {
3260         instrument_atomic_read_write(v, sizeo    3260         instrument_atomic_read_write(v, sizeof(*v));
3261         raw_atomic_long_add(i, v);               3261         raw_atomic_long_add(i, v);
3262 }                                                3262 }
3263                                                  3263 
3264 /**                                              3264 /**
3265  * atomic_long_add_return() - atomic add with    3265  * atomic_long_add_return() - atomic add with full ordering
3266  * @i: long value to add                         3266  * @i: long value to add
3267  * @v: pointer to atomic_long_t                  3267  * @v: pointer to atomic_long_t
3268  *                                               3268  *
3269  * Atomically updates @v to (@v + @i) with fu    3269  * Atomically updates @v to (@v + @i) with full ordering.
3270  *                                               3270  *
3271  * Unsafe to use in noinstr code; use raw_ato    3271  * Unsafe to use in noinstr code; use raw_atomic_long_add_return() there.
3272  *                                               3272  *
3273  * Return: The updated value of @v.              3273  * Return: The updated value of @v.
3274  */                                              3274  */
3275 static __always_inline long                      3275 static __always_inline long
3276 atomic_long_add_return(long i, atomic_long_t     3276 atomic_long_add_return(long i, atomic_long_t *v)
3277 {                                                3277 {
3278         kcsan_mb();                              3278         kcsan_mb();
3279         instrument_atomic_read_write(v, sizeo    3279         instrument_atomic_read_write(v, sizeof(*v));
3280         return raw_atomic_long_add_return(i,     3280         return raw_atomic_long_add_return(i, v);
3281 }                                                3281 }
3282                                                  3282 
3283 /**                                              3283 /**
3284  * atomic_long_add_return_acquire() - atomic     3284  * atomic_long_add_return_acquire() - atomic add with acquire ordering
3285  * @i: long value to add                         3285  * @i: long value to add
3286  * @v: pointer to atomic_long_t                  3286  * @v: pointer to atomic_long_t
3287  *                                               3287  *
3288  * Atomically updates @v to (@v + @i) with ac    3288  * Atomically updates @v to (@v + @i) with acquire ordering.
3289  *                                               3289  *
3290  * Unsafe to use in noinstr code; use raw_ato    3290  * Unsafe to use in noinstr code; use raw_atomic_long_add_return_acquire() there.
3291  *                                               3291  *
3292  * Return: The updated value of @v.              3292  * Return: The updated value of @v.
3293  */                                              3293  */
3294 static __always_inline long                      3294 static __always_inline long
3295 atomic_long_add_return_acquire(long i, atomic    3295 atomic_long_add_return_acquire(long i, atomic_long_t *v)
3296 {                                                3296 {
3297         instrument_atomic_read_write(v, sizeo    3297         instrument_atomic_read_write(v, sizeof(*v));
3298         return raw_atomic_long_add_return_acq    3298         return raw_atomic_long_add_return_acquire(i, v);
3299 }                                                3299 }
3300                                                  3300 
3301 /**                                              3301 /**
3302  * atomic_long_add_return_release() - atomic     3302  * atomic_long_add_return_release() - atomic add with release ordering
3303  * @i: long value to add                         3303  * @i: long value to add
3304  * @v: pointer to atomic_long_t                  3304  * @v: pointer to atomic_long_t
3305  *                                               3305  *
3306  * Atomically updates @v to (@v + @i) with re    3306  * Atomically updates @v to (@v + @i) with release ordering.
3307  *                                               3307  *
3308  * Unsafe to use in noinstr code; use raw_ato    3308  * Unsafe to use in noinstr code; use raw_atomic_long_add_return_release() there.
3309  *                                               3309  *
3310  * Return: The updated value of @v.              3310  * Return: The updated value of @v.
3311  */                                              3311  */
3312 static __always_inline long                      3312 static __always_inline long
3313 atomic_long_add_return_release(long i, atomic    3313 atomic_long_add_return_release(long i, atomic_long_t *v)
3314 {                                                3314 {
3315         kcsan_release();                         3315         kcsan_release();
3316         instrument_atomic_read_write(v, sizeo    3316         instrument_atomic_read_write(v, sizeof(*v));
3317         return raw_atomic_long_add_return_rel    3317         return raw_atomic_long_add_return_release(i, v);
3318 }                                                3318 }
3319                                                  3319 
3320 /**                                              3320 /**
3321  * atomic_long_add_return_relaxed() - atomic     3321  * atomic_long_add_return_relaxed() - atomic add with relaxed ordering
3322  * @i: long value to add                         3322  * @i: long value to add
3323  * @v: pointer to atomic_long_t                  3323  * @v: pointer to atomic_long_t
3324  *                                               3324  *
3325  * Atomically updates @v to (@v + @i) with re    3325  * Atomically updates @v to (@v + @i) with relaxed ordering.
3326  *                                               3326  *
3327  * Unsafe to use in noinstr code; use raw_ato    3327  * Unsafe to use in noinstr code; use raw_atomic_long_add_return_relaxed() there.
3328  *                                               3328  *
3329  * Return: The updated value of @v.              3329  * Return: The updated value of @v.
3330  */                                              3330  */
3331 static __always_inline long                      3331 static __always_inline long
3332 atomic_long_add_return_relaxed(long i, atomic    3332 atomic_long_add_return_relaxed(long i, atomic_long_t *v)
3333 {                                                3333 {
3334         instrument_atomic_read_write(v, sizeo    3334         instrument_atomic_read_write(v, sizeof(*v));
3335         return raw_atomic_long_add_return_rel    3335         return raw_atomic_long_add_return_relaxed(i, v);
3336 }                                                3336 }
3337                                                  3337 
3338 /**                                              3338 /**
3339  * atomic_long_fetch_add() - atomic add with     3339  * atomic_long_fetch_add() - atomic add with full ordering
3340  * @i: long value to add                         3340  * @i: long value to add
3341  * @v: pointer to atomic_long_t                  3341  * @v: pointer to atomic_long_t
3342  *                                               3342  *
3343  * Atomically updates @v to (@v + @i) with fu    3343  * Atomically updates @v to (@v + @i) with full ordering.
3344  *                                               3344  *
3345  * Unsafe to use in noinstr code; use raw_ato    3345  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_add() there.
3346  *                                               3346  *
3347  * Return: The original value of @v.             3347  * Return: The original value of @v.
3348  */                                              3348  */
3349 static __always_inline long                      3349 static __always_inline long
3350 atomic_long_fetch_add(long i, atomic_long_t *    3350 atomic_long_fetch_add(long i, atomic_long_t *v)
3351 {                                                3351 {
3352         kcsan_mb();                              3352         kcsan_mb();
3353         instrument_atomic_read_write(v, sizeo    3353         instrument_atomic_read_write(v, sizeof(*v));
3354         return raw_atomic_long_fetch_add(i, v    3354         return raw_atomic_long_fetch_add(i, v);
3355 }                                                3355 }
3356                                                  3356 
3357 /**                                              3357 /**
3358  * atomic_long_fetch_add_acquire() - atomic a    3358  * atomic_long_fetch_add_acquire() - atomic add with acquire ordering
3359  * @i: long value to add                         3359  * @i: long value to add
3360  * @v: pointer to atomic_long_t                  3360  * @v: pointer to atomic_long_t
3361  *                                               3361  *
3362  * Atomically updates @v to (@v + @i) with ac    3362  * Atomically updates @v to (@v + @i) with acquire ordering.
3363  *                                               3363  *
3364  * Unsafe to use in noinstr code; use raw_ato    3364  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_add_acquire() there.
3365  *                                               3365  *
3366  * Return: The original value of @v.             3366  * Return: The original value of @v.
3367  */                                              3367  */
3368 static __always_inline long                      3368 static __always_inline long
3369 atomic_long_fetch_add_acquire(long i, atomic_    3369 atomic_long_fetch_add_acquire(long i, atomic_long_t *v)
3370 {                                                3370 {
3371         instrument_atomic_read_write(v, sizeo    3371         instrument_atomic_read_write(v, sizeof(*v));
3372         return raw_atomic_long_fetch_add_acqu    3372         return raw_atomic_long_fetch_add_acquire(i, v);
3373 }                                                3373 }
3374                                                  3374 
3375 /**                                              3375 /**
3376  * atomic_long_fetch_add_release() - atomic a    3376  * atomic_long_fetch_add_release() - atomic add with release ordering
3377  * @i: long value to add                         3377  * @i: long value to add
3378  * @v: pointer to atomic_long_t                  3378  * @v: pointer to atomic_long_t
3379  *                                               3379  *
3380  * Atomically updates @v to (@v + @i) with re    3380  * Atomically updates @v to (@v + @i) with release ordering.
3381  *                                               3381  *
3382  * Unsafe to use in noinstr code; use raw_ato    3382  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_add_release() there.
3383  *                                               3383  *
3384  * Return: The original value of @v.             3384  * Return: The original value of @v.
3385  */                                              3385  */
3386 static __always_inline long                      3386 static __always_inline long
3387 atomic_long_fetch_add_release(long i, atomic_    3387 atomic_long_fetch_add_release(long i, atomic_long_t *v)
3388 {                                                3388 {
3389         kcsan_release();                         3389         kcsan_release();
3390         instrument_atomic_read_write(v, sizeo    3390         instrument_atomic_read_write(v, sizeof(*v));
3391         return raw_atomic_long_fetch_add_rele    3391         return raw_atomic_long_fetch_add_release(i, v);
3392 }                                                3392 }
3393                                                  3393 
3394 /**                                              3394 /**
3395  * atomic_long_fetch_add_relaxed() - atomic a    3395  * atomic_long_fetch_add_relaxed() - atomic add with relaxed ordering
3396  * @i: long value to add                         3396  * @i: long value to add
3397  * @v: pointer to atomic_long_t                  3397  * @v: pointer to atomic_long_t
3398  *                                               3398  *
3399  * Atomically updates @v to (@v + @i) with re    3399  * Atomically updates @v to (@v + @i) with relaxed ordering.
3400  *                                               3400  *
3401  * Unsafe to use in noinstr code; use raw_ato    3401  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_add_relaxed() there.
3402  *                                               3402  *
3403  * Return: The original value of @v.             3403  * Return: The original value of @v.
3404  */                                              3404  */
3405 static __always_inline long                      3405 static __always_inline long
3406 atomic_long_fetch_add_relaxed(long i, atomic_    3406 atomic_long_fetch_add_relaxed(long i, atomic_long_t *v)
3407 {                                                3407 {
3408         instrument_atomic_read_write(v, sizeo    3408         instrument_atomic_read_write(v, sizeof(*v));
3409         return raw_atomic_long_fetch_add_rela    3409         return raw_atomic_long_fetch_add_relaxed(i, v);
3410 }                                                3410 }
3411                                                  3411 
3412 /**                                              3412 /**
3413  * atomic_long_sub() - atomic subtract with r    3413  * atomic_long_sub() - atomic subtract with relaxed ordering
3414  * @i: long value to subtract                    3414  * @i: long value to subtract
3415  * @v: pointer to atomic_long_t                  3415  * @v: pointer to atomic_long_t
3416  *                                               3416  *
3417  * Atomically updates @v to (@v - @i) with re    3417  * Atomically updates @v to (@v - @i) with relaxed ordering.
3418  *                                               3418  *
3419  * Unsafe to use in noinstr code; use raw_ato    3419  * Unsafe to use in noinstr code; use raw_atomic_long_sub() there.
3420  *                                               3420  *
3421  * Return: Nothing.                              3421  * Return: Nothing.
3422  */                                              3422  */
3423 static __always_inline void                      3423 static __always_inline void
3424 atomic_long_sub(long i, atomic_long_t *v)        3424 atomic_long_sub(long i, atomic_long_t *v)
3425 {                                                3425 {
3426         instrument_atomic_read_write(v, sizeo    3426         instrument_atomic_read_write(v, sizeof(*v));
3427         raw_atomic_long_sub(i, v);               3427         raw_atomic_long_sub(i, v);
3428 }                                                3428 }
3429                                                  3429 
3430 /**                                              3430 /**
3431  * atomic_long_sub_return() - atomic subtract    3431  * atomic_long_sub_return() - atomic subtract with full ordering
3432  * @i: long value to subtract                    3432  * @i: long value to subtract
3433  * @v: pointer to atomic_long_t                  3433  * @v: pointer to atomic_long_t
3434  *                                               3434  *
3435  * Atomically updates @v to (@v - @i) with fu    3435  * Atomically updates @v to (@v - @i) with full ordering.
3436  *                                               3436  *
3437  * Unsafe to use in noinstr code; use raw_ato    3437  * Unsafe to use in noinstr code; use raw_atomic_long_sub_return() there.
3438  *                                               3438  *
3439  * Return: The updated value of @v.              3439  * Return: The updated value of @v.
3440  */                                              3440  */
3441 static __always_inline long                      3441 static __always_inline long
3442 atomic_long_sub_return(long i, atomic_long_t     3442 atomic_long_sub_return(long i, atomic_long_t *v)
3443 {                                                3443 {
3444         kcsan_mb();                              3444         kcsan_mb();
3445         instrument_atomic_read_write(v, sizeo    3445         instrument_atomic_read_write(v, sizeof(*v));
3446         return raw_atomic_long_sub_return(i,     3446         return raw_atomic_long_sub_return(i, v);
3447 }                                                3447 }
3448                                                  3448 
3449 /**                                              3449 /**
3450  * atomic_long_sub_return_acquire() - atomic     3450  * atomic_long_sub_return_acquire() - atomic subtract with acquire ordering
3451  * @i: long value to subtract                    3451  * @i: long value to subtract
3452  * @v: pointer to atomic_long_t                  3452  * @v: pointer to atomic_long_t
3453  *                                               3453  *
3454  * Atomically updates @v to (@v - @i) with ac    3454  * Atomically updates @v to (@v - @i) with acquire ordering.
3455  *                                               3455  *
3456  * Unsafe to use in noinstr code; use raw_ato    3456  * Unsafe to use in noinstr code; use raw_atomic_long_sub_return_acquire() there.
3457  *                                               3457  *
3458  * Return: The updated value of @v.              3458  * Return: The updated value of @v.
3459  */                                              3459  */
3460 static __always_inline long                      3460 static __always_inline long
3461 atomic_long_sub_return_acquire(long i, atomic    3461 atomic_long_sub_return_acquire(long i, atomic_long_t *v)
3462 {                                                3462 {
3463         instrument_atomic_read_write(v, sizeo    3463         instrument_atomic_read_write(v, sizeof(*v));
3464         return raw_atomic_long_sub_return_acq    3464         return raw_atomic_long_sub_return_acquire(i, v);
3465 }                                                3465 }
3466                                                  3466 
3467 /**                                              3467 /**
3468  * atomic_long_sub_return_release() - atomic     3468  * atomic_long_sub_return_release() - atomic subtract with release ordering
3469  * @i: long value to subtract                    3469  * @i: long value to subtract
3470  * @v: pointer to atomic_long_t                  3470  * @v: pointer to atomic_long_t
3471  *                                               3471  *
3472  * Atomically updates @v to (@v - @i) with re    3472  * Atomically updates @v to (@v - @i) with release ordering.
3473  *                                               3473  *
3474  * Unsafe to use in noinstr code; use raw_ato    3474  * Unsafe to use in noinstr code; use raw_atomic_long_sub_return_release() there.
3475  *                                               3475  *
3476  * Return: The updated value of @v.              3476  * Return: The updated value of @v.
3477  */                                              3477  */
3478 static __always_inline long                      3478 static __always_inline long
3479 atomic_long_sub_return_release(long i, atomic    3479 atomic_long_sub_return_release(long i, atomic_long_t *v)
3480 {                                                3480 {
3481         kcsan_release();                         3481         kcsan_release();
3482         instrument_atomic_read_write(v, sizeo    3482         instrument_atomic_read_write(v, sizeof(*v));
3483         return raw_atomic_long_sub_return_rel    3483         return raw_atomic_long_sub_return_release(i, v);
3484 }                                                3484 }
3485                                                  3485 
3486 /**                                              3486 /**
3487  * atomic_long_sub_return_relaxed() - atomic     3487  * atomic_long_sub_return_relaxed() - atomic subtract with relaxed ordering
3488  * @i: long value to subtract                    3488  * @i: long value to subtract
3489  * @v: pointer to atomic_long_t                  3489  * @v: pointer to atomic_long_t
3490  *                                               3490  *
3491  * Atomically updates @v to (@v - @i) with re    3491  * Atomically updates @v to (@v - @i) with relaxed ordering.
3492  *                                               3492  *
3493  * Unsafe to use in noinstr code; use raw_ato    3493  * Unsafe to use in noinstr code; use raw_atomic_long_sub_return_relaxed() there.
3494  *                                               3494  *
3495  * Return: The updated value of @v.              3495  * Return: The updated value of @v.
3496  */                                              3496  */
3497 static __always_inline long                      3497 static __always_inline long
3498 atomic_long_sub_return_relaxed(long i, atomic    3498 atomic_long_sub_return_relaxed(long i, atomic_long_t *v)
3499 {                                                3499 {
3500         instrument_atomic_read_write(v, sizeo    3500         instrument_atomic_read_write(v, sizeof(*v));
3501         return raw_atomic_long_sub_return_rel    3501         return raw_atomic_long_sub_return_relaxed(i, v);
3502 }                                                3502 }
3503                                                  3503 
3504 /**                                              3504 /**
3505  * atomic_long_fetch_sub() - atomic subtract     3505  * atomic_long_fetch_sub() - atomic subtract with full ordering
3506  * @i: long value to subtract                    3506  * @i: long value to subtract
3507  * @v: pointer to atomic_long_t                  3507  * @v: pointer to atomic_long_t
3508  *                                               3508  *
3509  * Atomically updates @v to (@v - @i) with fu    3509  * Atomically updates @v to (@v - @i) with full ordering.
3510  *                                               3510  *
3511  * Unsafe to use in noinstr code; use raw_ato    3511  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_sub() there.
3512  *                                               3512  *
3513  * Return: The original value of @v.             3513  * Return: The original value of @v.
3514  */                                              3514  */
3515 static __always_inline long                      3515 static __always_inline long
3516 atomic_long_fetch_sub(long i, atomic_long_t *    3516 atomic_long_fetch_sub(long i, atomic_long_t *v)
3517 {                                                3517 {
3518         kcsan_mb();                              3518         kcsan_mb();
3519         instrument_atomic_read_write(v, sizeo    3519         instrument_atomic_read_write(v, sizeof(*v));
3520         return raw_atomic_long_fetch_sub(i, v    3520         return raw_atomic_long_fetch_sub(i, v);
3521 }                                                3521 }
3522                                                  3522 
3523 /**                                              3523 /**
3524  * atomic_long_fetch_sub_acquire() - atomic s    3524  * atomic_long_fetch_sub_acquire() - atomic subtract with acquire ordering
3525  * @i: long value to subtract                    3525  * @i: long value to subtract
3526  * @v: pointer to atomic_long_t                  3526  * @v: pointer to atomic_long_t
3527  *                                               3527  *
3528  * Atomically updates @v to (@v - @i) with ac    3528  * Atomically updates @v to (@v - @i) with acquire ordering.
3529  *                                               3529  *
3530  * Unsafe to use in noinstr code; use raw_ato    3530  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_sub_acquire() there.
3531  *                                               3531  *
3532  * Return: The original value of @v.             3532  * Return: The original value of @v.
3533  */                                              3533  */
3534 static __always_inline long                      3534 static __always_inline long
3535 atomic_long_fetch_sub_acquire(long i, atomic_    3535 atomic_long_fetch_sub_acquire(long i, atomic_long_t *v)
3536 {                                                3536 {
3537         instrument_atomic_read_write(v, sizeo    3537         instrument_atomic_read_write(v, sizeof(*v));
3538         return raw_atomic_long_fetch_sub_acqu    3538         return raw_atomic_long_fetch_sub_acquire(i, v);
3539 }                                                3539 }
3540                                                  3540 
3541 /**                                              3541 /**
3542  * atomic_long_fetch_sub_release() - atomic s    3542  * atomic_long_fetch_sub_release() - atomic subtract with release ordering
3543  * @i: long value to subtract                    3543  * @i: long value to subtract
3544  * @v: pointer to atomic_long_t                  3544  * @v: pointer to atomic_long_t
3545  *                                               3545  *
3546  * Atomically updates @v to (@v - @i) with re    3546  * Atomically updates @v to (@v - @i) with release ordering.
3547  *                                               3547  *
3548  * Unsafe to use in noinstr code; use raw_ato    3548  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_sub_release() there.
3549  *                                               3549  *
3550  * Return: The original value of @v.             3550  * Return: The original value of @v.
3551  */                                              3551  */
3552 static __always_inline long                      3552 static __always_inline long
3553 atomic_long_fetch_sub_release(long i, atomic_    3553 atomic_long_fetch_sub_release(long i, atomic_long_t *v)
3554 {                                                3554 {
3555         kcsan_release();                         3555         kcsan_release();
3556         instrument_atomic_read_write(v, sizeo    3556         instrument_atomic_read_write(v, sizeof(*v));
3557         return raw_atomic_long_fetch_sub_rele    3557         return raw_atomic_long_fetch_sub_release(i, v);
3558 }                                                3558 }
3559                                                  3559 
3560 /**                                              3560 /**
3561  * atomic_long_fetch_sub_relaxed() - atomic s    3561  * atomic_long_fetch_sub_relaxed() - atomic subtract with relaxed ordering
3562  * @i: long value to subtract                    3562  * @i: long value to subtract
3563  * @v: pointer to atomic_long_t                  3563  * @v: pointer to atomic_long_t
3564  *                                               3564  *
3565  * Atomically updates @v to (@v - @i) with re    3565  * Atomically updates @v to (@v - @i) with relaxed ordering.
3566  *                                               3566  *
3567  * Unsafe to use in noinstr code; use raw_ato    3567  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_sub_relaxed() there.
3568  *                                               3568  *
3569  * Return: The original value of @v.             3569  * Return: The original value of @v.
3570  */                                              3570  */
3571 static __always_inline long                      3571 static __always_inline long
3572 atomic_long_fetch_sub_relaxed(long i, atomic_    3572 atomic_long_fetch_sub_relaxed(long i, atomic_long_t *v)
3573 {                                                3573 {
3574         instrument_atomic_read_write(v, sizeo    3574         instrument_atomic_read_write(v, sizeof(*v));
3575         return raw_atomic_long_fetch_sub_rela    3575         return raw_atomic_long_fetch_sub_relaxed(i, v);
3576 }                                                3576 }
3577                                                  3577 
3578 /**                                              3578 /**
3579  * atomic_long_inc() - atomic increment with     3579  * atomic_long_inc() - atomic increment with relaxed ordering
3580  * @v: pointer to atomic_long_t                  3580  * @v: pointer to atomic_long_t
3581  *                                               3581  *
3582  * Atomically updates @v to (@v + 1) with rel    3582  * Atomically updates @v to (@v + 1) with relaxed ordering.
3583  *                                               3583  *
3584  * Unsafe to use in noinstr code; use raw_ato    3584  * Unsafe to use in noinstr code; use raw_atomic_long_inc() there.
3585  *                                               3585  *
3586  * Return: Nothing.                              3586  * Return: Nothing.
3587  */                                              3587  */
3588 static __always_inline void                      3588 static __always_inline void
3589 atomic_long_inc(atomic_long_t *v)                3589 atomic_long_inc(atomic_long_t *v)
3590 {                                                3590 {
3591         instrument_atomic_read_write(v, sizeo    3591         instrument_atomic_read_write(v, sizeof(*v));
3592         raw_atomic_long_inc(v);                  3592         raw_atomic_long_inc(v);
3593 }                                                3593 }
3594                                                  3594 
3595 /**                                              3595 /**
3596  * atomic_long_inc_return() - atomic incremen    3596  * atomic_long_inc_return() - atomic increment with full ordering
3597  * @v: pointer to atomic_long_t                  3597  * @v: pointer to atomic_long_t
3598  *                                               3598  *
3599  * Atomically updates @v to (@v + 1) with ful    3599  * Atomically updates @v to (@v + 1) with full ordering.
3600  *                                               3600  *
3601  * Unsafe to use in noinstr code; use raw_ato    3601  * Unsafe to use in noinstr code; use raw_atomic_long_inc_return() there.
3602  *                                               3602  *
3603  * Return: The updated value of @v.              3603  * Return: The updated value of @v.
3604  */                                              3604  */
3605 static __always_inline long                      3605 static __always_inline long
3606 atomic_long_inc_return(atomic_long_t *v)         3606 atomic_long_inc_return(atomic_long_t *v)
3607 {                                                3607 {
3608         kcsan_mb();                              3608         kcsan_mb();
3609         instrument_atomic_read_write(v, sizeo    3609         instrument_atomic_read_write(v, sizeof(*v));
3610         return raw_atomic_long_inc_return(v);    3610         return raw_atomic_long_inc_return(v);
3611 }                                                3611 }
3612                                                  3612 
3613 /**                                              3613 /**
3614  * atomic_long_inc_return_acquire() - atomic     3614  * atomic_long_inc_return_acquire() - atomic increment with acquire ordering
3615  * @v: pointer to atomic_long_t                  3615  * @v: pointer to atomic_long_t
3616  *                                               3616  *
3617  * Atomically updates @v to (@v + 1) with acq    3617  * Atomically updates @v to (@v + 1) with acquire ordering.
3618  *                                               3618  *
3619  * Unsafe to use in noinstr code; use raw_ato    3619  * Unsafe to use in noinstr code; use raw_atomic_long_inc_return_acquire() there.
3620  *                                               3620  *
3621  * Return: The updated value of @v.              3621  * Return: The updated value of @v.
3622  */                                              3622  */
3623 static __always_inline long                      3623 static __always_inline long
3624 atomic_long_inc_return_acquire(atomic_long_t     3624 atomic_long_inc_return_acquire(atomic_long_t *v)
3625 {                                                3625 {
3626         instrument_atomic_read_write(v, sizeo    3626         instrument_atomic_read_write(v, sizeof(*v));
3627         return raw_atomic_long_inc_return_acq    3627         return raw_atomic_long_inc_return_acquire(v);
3628 }                                                3628 }
3629                                                  3629 
3630 /**                                              3630 /**
3631  * atomic_long_inc_return_release() - atomic     3631  * atomic_long_inc_return_release() - atomic increment with release ordering
3632  * @v: pointer to atomic_long_t                  3632  * @v: pointer to atomic_long_t
3633  *                                               3633  *
3634  * Atomically updates @v to (@v + 1) with rel    3634  * Atomically updates @v to (@v + 1) with release ordering.
3635  *                                               3635  *
3636  * Unsafe to use in noinstr code; use raw_ato    3636  * Unsafe to use in noinstr code; use raw_atomic_long_inc_return_release() there.
3637  *                                               3637  *
3638  * Return: The updated value of @v.              3638  * Return: The updated value of @v.
3639  */                                              3639  */
3640 static __always_inline long                      3640 static __always_inline long
3641 atomic_long_inc_return_release(atomic_long_t     3641 atomic_long_inc_return_release(atomic_long_t *v)
3642 {                                                3642 {
3643         kcsan_release();                         3643         kcsan_release();
3644         instrument_atomic_read_write(v, sizeo    3644         instrument_atomic_read_write(v, sizeof(*v));
3645         return raw_atomic_long_inc_return_rel    3645         return raw_atomic_long_inc_return_release(v);
3646 }                                                3646 }
3647                                                  3647 
3648 /**                                              3648 /**
3649  * atomic_long_inc_return_relaxed() - atomic     3649  * atomic_long_inc_return_relaxed() - atomic increment with relaxed ordering
3650  * @v: pointer to atomic_long_t                  3650  * @v: pointer to atomic_long_t
3651  *                                               3651  *
3652  * Atomically updates @v to (@v + 1) with rel    3652  * Atomically updates @v to (@v + 1) with relaxed ordering.
3653  *                                               3653  *
3654  * Unsafe to use in noinstr code; use raw_ato    3654  * Unsafe to use in noinstr code; use raw_atomic_long_inc_return_relaxed() there.
3655  *                                               3655  *
3656  * Return: The updated value of @v.              3656  * Return: The updated value of @v.
3657  */                                              3657  */
3658 static __always_inline long                      3658 static __always_inline long
3659 atomic_long_inc_return_relaxed(atomic_long_t     3659 atomic_long_inc_return_relaxed(atomic_long_t *v)
3660 {                                                3660 {
3661         instrument_atomic_read_write(v, sizeo    3661         instrument_atomic_read_write(v, sizeof(*v));
3662         return raw_atomic_long_inc_return_rel    3662         return raw_atomic_long_inc_return_relaxed(v);
3663 }                                                3663 }
3664                                                  3664 
3665 /**                                              3665 /**
3666  * atomic_long_fetch_inc() - atomic increment    3666  * atomic_long_fetch_inc() - atomic increment with full ordering
3667  * @v: pointer to atomic_long_t                  3667  * @v: pointer to atomic_long_t
3668  *                                               3668  *
3669  * Atomically updates @v to (@v + 1) with ful    3669  * Atomically updates @v to (@v + 1) with full ordering.
3670  *                                               3670  *
3671  * Unsafe to use in noinstr code; use raw_ato    3671  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_inc() there.
3672  *                                               3672  *
3673  * Return: The original value of @v.             3673  * Return: The original value of @v.
3674  */                                              3674  */
3675 static __always_inline long                      3675 static __always_inline long
3676 atomic_long_fetch_inc(atomic_long_t *v)          3676 atomic_long_fetch_inc(atomic_long_t *v)
3677 {                                                3677 {
3678         kcsan_mb();                              3678         kcsan_mb();
3679         instrument_atomic_read_write(v, sizeo    3679         instrument_atomic_read_write(v, sizeof(*v));
3680         return raw_atomic_long_fetch_inc(v);     3680         return raw_atomic_long_fetch_inc(v);
3681 }                                                3681 }
3682                                                  3682 
3683 /**                                              3683 /**
3684  * atomic_long_fetch_inc_acquire() - atomic i    3684  * atomic_long_fetch_inc_acquire() - atomic increment with acquire ordering
3685  * @v: pointer to atomic_long_t                  3685  * @v: pointer to atomic_long_t
3686  *                                               3686  *
3687  * Atomically updates @v to (@v + 1) with acq    3687  * Atomically updates @v to (@v + 1) with acquire ordering.
3688  *                                               3688  *
3689  * Unsafe to use in noinstr code; use raw_ato    3689  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_inc_acquire() there.
3690  *                                               3690  *
3691  * Return: The original value of @v.             3691  * Return: The original value of @v.
3692  */                                              3692  */
3693 static __always_inline long                      3693 static __always_inline long
3694 atomic_long_fetch_inc_acquire(atomic_long_t *    3694 atomic_long_fetch_inc_acquire(atomic_long_t *v)
3695 {                                                3695 {
3696         instrument_atomic_read_write(v, sizeo    3696         instrument_atomic_read_write(v, sizeof(*v));
3697         return raw_atomic_long_fetch_inc_acqu    3697         return raw_atomic_long_fetch_inc_acquire(v);
3698 }                                                3698 }
3699                                                  3699 
3700 /**                                              3700 /**
3701  * atomic_long_fetch_inc_release() - atomic i    3701  * atomic_long_fetch_inc_release() - atomic increment with release ordering
3702  * @v: pointer to atomic_long_t                  3702  * @v: pointer to atomic_long_t
3703  *                                               3703  *
3704  * Atomically updates @v to (@v + 1) with rel    3704  * Atomically updates @v to (@v + 1) with release ordering.
3705  *                                               3705  *
3706  * Unsafe to use in noinstr code; use raw_ato    3706  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_inc_release() there.
3707  *                                               3707  *
3708  * Return: The original value of @v.             3708  * Return: The original value of @v.
3709  */                                              3709  */
3710 static __always_inline long                      3710 static __always_inline long
3711 atomic_long_fetch_inc_release(atomic_long_t *    3711 atomic_long_fetch_inc_release(atomic_long_t *v)
3712 {                                                3712 {
3713         kcsan_release();                         3713         kcsan_release();
3714         instrument_atomic_read_write(v, sizeo    3714         instrument_atomic_read_write(v, sizeof(*v));
3715         return raw_atomic_long_fetch_inc_rele    3715         return raw_atomic_long_fetch_inc_release(v);
3716 }                                                3716 }
3717                                                  3717 
3718 /**                                              3718 /**
3719  * atomic_long_fetch_inc_relaxed() - atomic i    3719  * atomic_long_fetch_inc_relaxed() - atomic increment with relaxed ordering
3720  * @v: pointer to atomic_long_t                  3720  * @v: pointer to atomic_long_t
3721  *                                               3721  *
3722  * Atomically updates @v to (@v + 1) with rel    3722  * Atomically updates @v to (@v + 1) with relaxed ordering.
3723  *                                               3723  *
3724  * Unsafe to use in noinstr code; use raw_ato    3724  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_inc_relaxed() there.
3725  *                                               3725  *
3726  * Return: The original value of @v.             3726  * Return: The original value of @v.
3727  */                                              3727  */
3728 static __always_inline long                      3728 static __always_inline long
3729 atomic_long_fetch_inc_relaxed(atomic_long_t *    3729 atomic_long_fetch_inc_relaxed(atomic_long_t *v)
3730 {                                                3730 {
3731         instrument_atomic_read_write(v, sizeo    3731         instrument_atomic_read_write(v, sizeof(*v));
3732         return raw_atomic_long_fetch_inc_rela    3732         return raw_atomic_long_fetch_inc_relaxed(v);
3733 }                                                3733 }
3734                                                  3734 
3735 /**                                              3735 /**
3736  * atomic_long_dec() - atomic decrement with     3736  * atomic_long_dec() - atomic decrement with relaxed ordering
3737  * @v: pointer to atomic_long_t                  3737  * @v: pointer to atomic_long_t
3738  *                                               3738  *
3739  * Atomically updates @v to (@v - 1) with rel    3739  * Atomically updates @v to (@v - 1) with relaxed ordering.
3740  *                                               3740  *
3741  * Unsafe to use in noinstr code; use raw_ato    3741  * Unsafe to use in noinstr code; use raw_atomic_long_dec() there.
3742  *                                               3742  *
3743  * Return: Nothing.                              3743  * Return: Nothing.
3744  */                                              3744  */
3745 static __always_inline void                      3745 static __always_inline void
3746 atomic_long_dec(atomic_long_t *v)                3746 atomic_long_dec(atomic_long_t *v)
3747 {                                                3747 {
3748         instrument_atomic_read_write(v, sizeo    3748         instrument_atomic_read_write(v, sizeof(*v));
3749         raw_atomic_long_dec(v);                  3749         raw_atomic_long_dec(v);
3750 }                                                3750 }
3751                                                  3751 
3752 /**                                              3752 /**
3753  * atomic_long_dec_return() - atomic decremen    3753  * atomic_long_dec_return() - atomic decrement with full ordering
3754  * @v: pointer to atomic_long_t                  3754  * @v: pointer to atomic_long_t
3755  *                                               3755  *
3756  * Atomically updates @v to (@v - 1) with ful    3756  * Atomically updates @v to (@v - 1) with full ordering.
3757  *                                               3757  *
3758  * Unsafe to use in noinstr code; use raw_ato    3758  * Unsafe to use in noinstr code; use raw_atomic_long_dec_return() there.
3759  *                                               3759  *
3760  * Return: The updated value of @v.              3760  * Return: The updated value of @v.
3761  */                                              3761  */
3762 static __always_inline long                      3762 static __always_inline long
3763 atomic_long_dec_return(atomic_long_t *v)         3763 atomic_long_dec_return(atomic_long_t *v)
3764 {                                                3764 {
3765         kcsan_mb();                              3765         kcsan_mb();
3766         instrument_atomic_read_write(v, sizeo    3766         instrument_atomic_read_write(v, sizeof(*v));
3767         return raw_atomic_long_dec_return(v);    3767         return raw_atomic_long_dec_return(v);
3768 }                                                3768 }
3769                                                  3769 
3770 /**                                              3770 /**
3771  * atomic_long_dec_return_acquire() - atomic     3771  * atomic_long_dec_return_acquire() - atomic decrement with acquire ordering
3772  * @v: pointer to atomic_long_t                  3772  * @v: pointer to atomic_long_t
3773  *                                               3773  *
3774  * Atomically updates @v to (@v - 1) with acq    3774  * Atomically updates @v to (@v - 1) with acquire ordering.
3775  *                                               3775  *
3776  * Unsafe to use in noinstr code; use raw_ato    3776  * Unsafe to use in noinstr code; use raw_atomic_long_dec_return_acquire() there.
3777  *                                               3777  *
3778  * Return: The updated value of @v.              3778  * Return: The updated value of @v.
3779  */                                              3779  */
3780 static __always_inline long                      3780 static __always_inline long
3781 atomic_long_dec_return_acquire(atomic_long_t     3781 atomic_long_dec_return_acquire(atomic_long_t *v)
3782 {                                                3782 {
3783         instrument_atomic_read_write(v, sizeo    3783         instrument_atomic_read_write(v, sizeof(*v));
3784         return raw_atomic_long_dec_return_acq    3784         return raw_atomic_long_dec_return_acquire(v);
3785 }                                                3785 }
3786                                                  3786 
3787 /**                                              3787 /**
3788  * atomic_long_dec_return_release() - atomic     3788  * atomic_long_dec_return_release() - atomic decrement with release ordering
3789  * @v: pointer to atomic_long_t                  3789  * @v: pointer to atomic_long_t
3790  *                                               3790  *
3791  * Atomically updates @v to (@v - 1) with rel    3791  * Atomically updates @v to (@v - 1) with release ordering.
3792  *                                               3792  *
3793  * Unsafe to use in noinstr code; use raw_ato    3793  * Unsafe to use in noinstr code; use raw_atomic_long_dec_return_release() there.
3794  *                                               3794  *
3795  * Return: The updated value of @v.              3795  * Return: The updated value of @v.
3796  */                                              3796  */
3797 static __always_inline long                      3797 static __always_inline long
3798 atomic_long_dec_return_release(atomic_long_t     3798 atomic_long_dec_return_release(atomic_long_t *v)
3799 {                                                3799 {
3800         kcsan_release();                         3800         kcsan_release();
3801         instrument_atomic_read_write(v, sizeo    3801         instrument_atomic_read_write(v, sizeof(*v));
3802         return raw_atomic_long_dec_return_rel    3802         return raw_atomic_long_dec_return_release(v);
3803 }                                                3803 }
3804                                                  3804 
3805 /**                                              3805 /**
3806  * atomic_long_dec_return_relaxed() - atomic     3806  * atomic_long_dec_return_relaxed() - atomic decrement with relaxed ordering
3807  * @v: pointer to atomic_long_t                  3807  * @v: pointer to atomic_long_t
3808  *                                               3808  *
3809  * Atomically updates @v to (@v - 1) with rel    3809  * Atomically updates @v to (@v - 1) with relaxed ordering.
3810  *                                               3810  *
3811  * Unsafe to use in noinstr code; use raw_ato    3811  * Unsafe to use in noinstr code; use raw_atomic_long_dec_return_relaxed() there.
3812  *                                               3812  *
3813  * Return: The updated value of @v.              3813  * Return: The updated value of @v.
3814  */                                              3814  */
3815 static __always_inline long                      3815 static __always_inline long
3816 atomic_long_dec_return_relaxed(atomic_long_t     3816 atomic_long_dec_return_relaxed(atomic_long_t *v)
3817 {                                                3817 {
3818         instrument_atomic_read_write(v, sizeo    3818         instrument_atomic_read_write(v, sizeof(*v));
3819         return raw_atomic_long_dec_return_rel    3819         return raw_atomic_long_dec_return_relaxed(v);
3820 }                                                3820 }
3821                                                  3821 
3822 /**                                              3822 /**
3823  * atomic_long_fetch_dec() - atomic decrement    3823  * atomic_long_fetch_dec() - atomic decrement with full ordering
3824  * @v: pointer to atomic_long_t                  3824  * @v: pointer to atomic_long_t
3825  *                                               3825  *
3826  * Atomically updates @v to (@v - 1) with ful    3826  * Atomically updates @v to (@v - 1) with full ordering.
3827  *                                               3827  *
3828  * Unsafe to use in noinstr code; use raw_ato    3828  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_dec() there.
3829  *                                               3829  *
3830  * Return: The original value of @v.             3830  * Return: The original value of @v.
3831  */                                              3831  */
3832 static __always_inline long                      3832 static __always_inline long
3833 atomic_long_fetch_dec(atomic_long_t *v)          3833 atomic_long_fetch_dec(atomic_long_t *v)
3834 {                                                3834 {
3835         kcsan_mb();                              3835         kcsan_mb();
3836         instrument_atomic_read_write(v, sizeo    3836         instrument_atomic_read_write(v, sizeof(*v));
3837         return raw_atomic_long_fetch_dec(v);     3837         return raw_atomic_long_fetch_dec(v);
3838 }                                                3838 }
3839                                                  3839 
3840 /**                                              3840 /**
3841  * atomic_long_fetch_dec_acquire() - atomic d    3841  * atomic_long_fetch_dec_acquire() - atomic decrement with acquire ordering
3842  * @v: pointer to atomic_long_t                  3842  * @v: pointer to atomic_long_t
3843  *                                               3843  *
3844  * Atomically updates @v to (@v - 1) with acq    3844  * Atomically updates @v to (@v - 1) with acquire ordering.
3845  *                                               3845  *
3846  * Unsafe to use in noinstr code; use raw_ato    3846  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_dec_acquire() there.
3847  *                                               3847  *
3848  * Return: The original value of @v.             3848  * Return: The original value of @v.
3849  */                                              3849  */
3850 static __always_inline long                      3850 static __always_inline long
3851 atomic_long_fetch_dec_acquire(atomic_long_t *    3851 atomic_long_fetch_dec_acquire(atomic_long_t *v)
3852 {                                                3852 {
3853         instrument_atomic_read_write(v, sizeo    3853         instrument_atomic_read_write(v, sizeof(*v));
3854         return raw_atomic_long_fetch_dec_acqu    3854         return raw_atomic_long_fetch_dec_acquire(v);
3855 }                                                3855 }
3856                                                  3856 
3857 /**                                              3857 /**
3858  * atomic_long_fetch_dec_release() - atomic d    3858  * atomic_long_fetch_dec_release() - atomic decrement with release ordering
3859  * @v: pointer to atomic_long_t                  3859  * @v: pointer to atomic_long_t
3860  *                                               3860  *
3861  * Atomically updates @v to (@v - 1) with rel    3861  * Atomically updates @v to (@v - 1) with release ordering.
3862  *                                               3862  *
3863  * Unsafe to use in noinstr code; use raw_ato    3863  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_dec_release() there.
3864  *                                               3864  *
3865  * Return: The original value of @v.             3865  * Return: The original value of @v.
3866  */                                              3866  */
3867 static __always_inline long                      3867 static __always_inline long
3868 atomic_long_fetch_dec_release(atomic_long_t *    3868 atomic_long_fetch_dec_release(atomic_long_t *v)
3869 {                                                3869 {
3870         kcsan_release();                         3870         kcsan_release();
3871         instrument_atomic_read_write(v, sizeo    3871         instrument_atomic_read_write(v, sizeof(*v));
3872         return raw_atomic_long_fetch_dec_rele    3872         return raw_atomic_long_fetch_dec_release(v);
3873 }                                                3873 }
3874                                                  3874 
3875 /**                                              3875 /**
3876  * atomic_long_fetch_dec_relaxed() - atomic d    3876  * atomic_long_fetch_dec_relaxed() - atomic decrement with relaxed ordering
3877  * @v: pointer to atomic_long_t                  3877  * @v: pointer to atomic_long_t
3878  *                                               3878  *
3879  * Atomically updates @v to (@v - 1) with rel    3879  * Atomically updates @v to (@v - 1) with relaxed ordering.
3880  *                                               3880  *
3881  * Unsafe to use in noinstr code; use raw_ato    3881  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_dec_relaxed() there.
3882  *                                               3882  *
3883  * Return: The original value of @v.             3883  * Return: The original value of @v.
3884  */                                              3884  */
3885 static __always_inline long                      3885 static __always_inline long
3886 atomic_long_fetch_dec_relaxed(atomic_long_t *    3886 atomic_long_fetch_dec_relaxed(atomic_long_t *v)
3887 {                                                3887 {
3888         instrument_atomic_read_write(v, sizeo    3888         instrument_atomic_read_write(v, sizeof(*v));
3889         return raw_atomic_long_fetch_dec_rela    3889         return raw_atomic_long_fetch_dec_relaxed(v);
3890 }                                                3890 }
3891                                                  3891 
3892 /**                                              3892 /**
3893  * atomic_long_and() - atomic bitwise AND wit    3893  * atomic_long_and() - atomic bitwise AND with relaxed ordering
3894  * @i: long value                                3894  * @i: long value
3895  * @v: pointer to atomic_long_t                  3895  * @v: pointer to atomic_long_t
3896  *                                               3896  *
3897  * Atomically updates @v to (@v & @i) with re    3897  * Atomically updates @v to (@v & @i) with relaxed ordering.
3898  *                                               3898  *
3899  * Unsafe to use in noinstr code; use raw_ato    3899  * Unsafe to use in noinstr code; use raw_atomic_long_and() there.
3900  *                                               3900  *
3901  * Return: Nothing.                              3901  * Return: Nothing.
3902  */                                              3902  */
3903 static __always_inline void                      3903 static __always_inline void
3904 atomic_long_and(long i, atomic_long_t *v)        3904 atomic_long_and(long i, atomic_long_t *v)
3905 {                                                3905 {
3906         instrument_atomic_read_write(v, sizeo    3906         instrument_atomic_read_write(v, sizeof(*v));
3907         raw_atomic_long_and(i, v);               3907         raw_atomic_long_and(i, v);
3908 }                                                3908 }
3909                                                  3909 
3910 /**                                              3910 /**
3911  * atomic_long_fetch_and() - atomic bitwise A    3911  * atomic_long_fetch_and() - atomic bitwise AND with full ordering
3912  * @i: long value                                3912  * @i: long value
3913  * @v: pointer to atomic_long_t                  3913  * @v: pointer to atomic_long_t
3914  *                                               3914  *
3915  * Atomically updates @v to (@v & @i) with fu    3915  * Atomically updates @v to (@v & @i) with full ordering.
3916  *                                               3916  *
3917  * Unsafe to use in noinstr code; use raw_ato    3917  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_and() there.
3918  *                                               3918  *
3919  * Return: The original value of @v.             3919  * Return: The original value of @v.
3920  */                                              3920  */
3921 static __always_inline long                      3921 static __always_inline long
3922 atomic_long_fetch_and(long i, atomic_long_t *    3922 atomic_long_fetch_and(long i, atomic_long_t *v)
3923 {                                                3923 {
3924         kcsan_mb();                              3924         kcsan_mb();
3925         instrument_atomic_read_write(v, sizeo    3925         instrument_atomic_read_write(v, sizeof(*v));
3926         return raw_atomic_long_fetch_and(i, v    3926         return raw_atomic_long_fetch_and(i, v);
3927 }                                                3927 }
3928                                                  3928 
3929 /**                                              3929 /**
3930  * atomic_long_fetch_and_acquire() - atomic b    3930  * atomic_long_fetch_and_acquire() - atomic bitwise AND with acquire ordering
3931  * @i: long value                                3931  * @i: long value
3932  * @v: pointer to atomic_long_t                  3932  * @v: pointer to atomic_long_t
3933  *                                               3933  *
3934  * Atomically updates @v to (@v & @i) with ac    3934  * Atomically updates @v to (@v & @i) with acquire ordering.
3935  *                                               3935  *
3936  * Unsafe to use in noinstr code; use raw_ato    3936  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_and_acquire() there.
3937  *                                               3937  *
3938  * Return: The original value of @v.             3938  * Return: The original value of @v.
3939  */                                              3939  */
3940 static __always_inline long                      3940 static __always_inline long
3941 atomic_long_fetch_and_acquire(long i, atomic_    3941 atomic_long_fetch_and_acquire(long i, atomic_long_t *v)
3942 {                                                3942 {
3943         instrument_atomic_read_write(v, sizeo    3943         instrument_atomic_read_write(v, sizeof(*v));
3944         return raw_atomic_long_fetch_and_acqu    3944         return raw_atomic_long_fetch_and_acquire(i, v);
3945 }                                                3945 }
3946                                                  3946 
3947 /**                                              3947 /**
3948  * atomic_long_fetch_and_release() - atomic b    3948  * atomic_long_fetch_and_release() - atomic bitwise AND with release ordering
3949  * @i: long value                                3949  * @i: long value
3950  * @v: pointer to atomic_long_t                  3950  * @v: pointer to atomic_long_t
3951  *                                               3951  *
3952  * Atomically updates @v to (@v & @i) with re    3952  * Atomically updates @v to (@v & @i) with release ordering.
3953  *                                               3953  *
3954  * Unsafe to use in noinstr code; use raw_ato    3954  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_and_release() there.
3955  *                                               3955  *
3956  * Return: The original value of @v.             3956  * Return: The original value of @v.
3957  */                                              3957  */
3958 static __always_inline long                      3958 static __always_inline long
3959 atomic_long_fetch_and_release(long i, atomic_    3959 atomic_long_fetch_and_release(long i, atomic_long_t *v)
3960 {                                                3960 {
3961         kcsan_release();                         3961         kcsan_release();
3962         instrument_atomic_read_write(v, sizeo    3962         instrument_atomic_read_write(v, sizeof(*v));
3963         return raw_atomic_long_fetch_and_rele    3963         return raw_atomic_long_fetch_and_release(i, v);
3964 }                                                3964 }
3965                                                  3965 
3966 /**                                              3966 /**
3967  * atomic_long_fetch_and_relaxed() - atomic b    3967  * atomic_long_fetch_and_relaxed() - atomic bitwise AND with relaxed ordering
3968  * @i: long value                                3968  * @i: long value
3969  * @v: pointer to atomic_long_t                  3969  * @v: pointer to atomic_long_t
3970  *                                               3970  *
3971  * Atomically updates @v to (@v & @i) with re    3971  * Atomically updates @v to (@v & @i) with relaxed ordering.
3972  *                                               3972  *
3973  * Unsafe to use in noinstr code; use raw_ato    3973  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_and_relaxed() there.
3974  *                                               3974  *
3975  * Return: The original value of @v.             3975  * Return: The original value of @v.
3976  */                                              3976  */
3977 static __always_inline long                      3977 static __always_inline long
3978 atomic_long_fetch_and_relaxed(long i, atomic_    3978 atomic_long_fetch_and_relaxed(long i, atomic_long_t *v)
3979 {                                                3979 {
3980         instrument_atomic_read_write(v, sizeo    3980         instrument_atomic_read_write(v, sizeof(*v));
3981         return raw_atomic_long_fetch_and_rela    3981         return raw_atomic_long_fetch_and_relaxed(i, v);
3982 }                                                3982 }
3983                                                  3983 
3984 /**                                              3984 /**
3985  * atomic_long_andnot() - atomic bitwise AND     3985  * atomic_long_andnot() - atomic bitwise AND NOT with relaxed ordering
3986  * @i: long value                                3986  * @i: long value
3987  * @v: pointer to atomic_long_t                  3987  * @v: pointer to atomic_long_t
3988  *                                               3988  *
3989  * Atomically updates @v to (@v & ~@i) with r    3989  * Atomically updates @v to (@v & ~@i) with relaxed ordering.
3990  *                                               3990  *
3991  * Unsafe to use in noinstr code; use raw_ato    3991  * Unsafe to use in noinstr code; use raw_atomic_long_andnot() there.
3992  *                                               3992  *
3993  * Return: Nothing.                              3993  * Return: Nothing.
3994  */                                              3994  */
3995 static __always_inline void                      3995 static __always_inline void
3996 atomic_long_andnot(long i, atomic_long_t *v)     3996 atomic_long_andnot(long i, atomic_long_t *v)
3997 {                                                3997 {
3998         instrument_atomic_read_write(v, sizeo    3998         instrument_atomic_read_write(v, sizeof(*v));
3999         raw_atomic_long_andnot(i, v);            3999         raw_atomic_long_andnot(i, v);
4000 }                                                4000 }
4001                                                  4001 
4002 /**                                              4002 /**
4003  * atomic_long_fetch_andnot() - atomic bitwis    4003  * atomic_long_fetch_andnot() - atomic bitwise AND NOT with full ordering
4004  * @i: long value                                4004  * @i: long value
4005  * @v: pointer to atomic_long_t                  4005  * @v: pointer to atomic_long_t
4006  *                                               4006  *
4007  * Atomically updates @v to (@v & ~@i) with f    4007  * Atomically updates @v to (@v & ~@i) with full ordering.
4008  *                                               4008  *
4009  * Unsafe to use in noinstr code; use raw_ato    4009  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_andnot() there.
4010  *                                               4010  *
4011  * Return: The original value of @v.             4011  * Return: The original value of @v.
4012  */                                              4012  */
4013 static __always_inline long                      4013 static __always_inline long
4014 atomic_long_fetch_andnot(long i, atomic_long_    4014 atomic_long_fetch_andnot(long i, atomic_long_t *v)
4015 {                                                4015 {
4016         kcsan_mb();                              4016         kcsan_mb();
4017         instrument_atomic_read_write(v, sizeo    4017         instrument_atomic_read_write(v, sizeof(*v));
4018         return raw_atomic_long_fetch_andnot(i    4018         return raw_atomic_long_fetch_andnot(i, v);
4019 }                                                4019 }
4020                                                  4020 
4021 /**                                              4021 /**
4022  * atomic_long_fetch_andnot_acquire() - atomi    4022  * atomic_long_fetch_andnot_acquire() - atomic bitwise AND NOT with acquire ordering
4023  * @i: long value                                4023  * @i: long value
4024  * @v: pointer to atomic_long_t                  4024  * @v: pointer to atomic_long_t
4025  *                                               4025  *
4026  * Atomically updates @v to (@v & ~@i) with a    4026  * Atomically updates @v to (@v & ~@i) with acquire ordering.
4027  *                                               4027  *
4028  * Unsafe to use in noinstr code; use raw_ato    4028  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_andnot_acquire() there.
4029  *                                               4029  *
4030  * Return: The original value of @v.             4030  * Return: The original value of @v.
4031  */                                              4031  */
4032 static __always_inline long                      4032 static __always_inline long
4033 atomic_long_fetch_andnot_acquire(long i, atom    4033 atomic_long_fetch_andnot_acquire(long i, atomic_long_t *v)
4034 {                                                4034 {
4035         instrument_atomic_read_write(v, sizeo    4035         instrument_atomic_read_write(v, sizeof(*v));
4036         return raw_atomic_long_fetch_andnot_a    4036         return raw_atomic_long_fetch_andnot_acquire(i, v);
4037 }                                                4037 }
4038                                                  4038 
4039 /**                                              4039 /**
4040  * atomic_long_fetch_andnot_release() - atomi    4040  * atomic_long_fetch_andnot_release() - atomic bitwise AND NOT with release ordering
4041  * @i: long value                                4041  * @i: long value
4042  * @v: pointer to atomic_long_t                  4042  * @v: pointer to atomic_long_t
4043  *                                               4043  *
4044  * Atomically updates @v to (@v & ~@i) with r    4044  * Atomically updates @v to (@v & ~@i) with release ordering.
4045  *                                               4045  *
4046  * Unsafe to use in noinstr code; use raw_ato    4046  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_andnot_release() there.
4047  *                                               4047  *
4048  * Return: The original value of @v.             4048  * Return: The original value of @v.
4049  */                                              4049  */
4050 static __always_inline long                      4050 static __always_inline long
4051 atomic_long_fetch_andnot_release(long i, atom    4051 atomic_long_fetch_andnot_release(long i, atomic_long_t *v)
4052 {                                                4052 {
4053         kcsan_release();                         4053         kcsan_release();
4054         instrument_atomic_read_write(v, sizeo    4054         instrument_atomic_read_write(v, sizeof(*v));
4055         return raw_atomic_long_fetch_andnot_r    4055         return raw_atomic_long_fetch_andnot_release(i, v);
4056 }                                                4056 }
4057                                                  4057 
4058 /**                                              4058 /**
4059  * atomic_long_fetch_andnot_relaxed() - atomi    4059  * atomic_long_fetch_andnot_relaxed() - atomic bitwise AND NOT with relaxed ordering
4060  * @i: long value                                4060  * @i: long value
4061  * @v: pointer to atomic_long_t                  4061  * @v: pointer to atomic_long_t
4062  *                                               4062  *
4063  * Atomically updates @v to (@v & ~@i) with r    4063  * Atomically updates @v to (@v & ~@i) with relaxed ordering.
4064  *                                               4064  *
4065  * Unsafe to use in noinstr code; use raw_ato    4065  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_andnot_relaxed() there.
4066  *                                               4066  *
4067  * Return: The original value of @v.             4067  * Return: The original value of @v.
4068  */                                              4068  */
4069 static __always_inline long                      4069 static __always_inline long
4070 atomic_long_fetch_andnot_relaxed(long i, atom    4070 atomic_long_fetch_andnot_relaxed(long i, atomic_long_t *v)
4071 {                                                4071 {
4072         instrument_atomic_read_write(v, sizeo    4072         instrument_atomic_read_write(v, sizeof(*v));
4073         return raw_atomic_long_fetch_andnot_r    4073         return raw_atomic_long_fetch_andnot_relaxed(i, v);
4074 }                                                4074 }
4075                                                  4075 
4076 /**                                              4076 /**
4077  * atomic_long_or() - atomic bitwise OR with     4077  * atomic_long_or() - atomic bitwise OR with relaxed ordering
4078  * @i: long value                                4078  * @i: long value
4079  * @v: pointer to atomic_long_t                  4079  * @v: pointer to atomic_long_t
4080  *                                               4080  *
4081  * Atomically updates @v to (@v | @i) with re    4081  * Atomically updates @v to (@v | @i) with relaxed ordering.
4082  *                                               4082  *
4083  * Unsafe to use in noinstr code; use raw_ato    4083  * Unsafe to use in noinstr code; use raw_atomic_long_or() there.
4084  *                                               4084  *
4085  * Return: Nothing.                              4085  * Return: Nothing.
4086  */                                              4086  */
4087 static __always_inline void                      4087 static __always_inline void
4088 atomic_long_or(long i, atomic_long_t *v)         4088 atomic_long_or(long i, atomic_long_t *v)
4089 {                                                4089 {
4090         instrument_atomic_read_write(v, sizeo    4090         instrument_atomic_read_write(v, sizeof(*v));
4091         raw_atomic_long_or(i, v);                4091         raw_atomic_long_or(i, v);
4092 }                                                4092 }
4093                                                  4093 
4094 /**                                              4094 /**
4095  * atomic_long_fetch_or() - atomic bitwise OR    4095  * atomic_long_fetch_or() - atomic bitwise OR with full ordering
4096  * @i: long value                                4096  * @i: long value
4097  * @v: pointer to atomic_long_t                  4097  * @v: pointer to atomic_long_t
4098  *                                               4098  *
4099  * Atomically updates @v to (@v | @i) with fu    4099  * Atomically updates @v to (@v | @i) with full ordering.
4100  *                                               4100  *
4101  * Unsafe to use in noinstr code; use raw_ato    4101  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_or() there.
4102  *                                               4102  *
4103  * Return: The original value of @v.             4103  * Return: The original value of @v.
4104  */                                              4104  */
4105 static __always_inline long                      4105 static __always_inline long
4106 atomic_long_fetch_or(long i, atomic_long_t *v    4106 atomic_long_fetch_or(long i, atomic_long_t *v)
4107 {                                                4107 {
4108         kcsan_mb();                              4108         kcsan_mb();
4109         instrument_atomic_read_write(v, sizeo    4109         instrument_atomic_read_write(v, sizeof(*v));
4110         return raw_atomic_long_fetch_or(i, v)    4110         return raw_atomic_long_fetch_or(i, v);
4111 }                                                4111 }
4112                                                  4112 
4113 /**                                              4113 /**
4114  * atomic_long_fetch_or_acquire() - atomic bi    4114  * atomic_long_fetch_or_acquire() - atomic bitwise OR with acquire ordering
4115  * @i: long value                                4115  * @i: long value
4116  * @v: pointer to atomic_long_t                  4116  * @v: pointer to atomic_long_t
4117  *                                               4117  *
4118  * Atomically updates @v to (@v | @i) with ac    4118  * Atomically updates @v to (@v | @i) with acquire ordering.
4119  *                                               4119  *
4120  * Unsafe to use in noinstr code; use raw_ato    4120  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_or_acquire() there.
4121  *                                               4121  *
4122  * Return: The original value of @v.             4122  * Return: The original value of @v.
4123  */                                              4123  */
4124 static __always_inline long                      4124 static __always_inline long
4125 atomic_long_fetch_or_acquire(long i, atomic_l    4125 atomic_long_fetch_or_acquire(long i, atomic_long_t *v)
4126 {                                                4126 {
4127         instrument_atomic_read_write(v, sizeo    4127         instrument_atomic_read_write(v, sizeof(*v));
4128         return raw_atomic_long_fetch_or_acqui    4128         return raw_atomic_long_fetch_or_acquire(i, v);
4129 }                                                4129 }
4130                                                  4130 
4131 /**                                              4131 /**
4132  * atomic_long_fetch_or_release() - atomic bi    4132  * atomic_long_fetch_or_release() - atomic bitwise OR with release ordering
4133  * @i: long value                                4133  * @i: long value
4134  * @v: pointer to atomic_long_t                  4134  * @v: pointer to atomic_long_t
4135  *                                               4135  *
4136  * Atomically updates @v to (@v | @i) with re    4136  * Atomically updates @v to (@v | @i) with release ordering.
4137  *                                               4137  *
4138  * Unsafe to use in noinstr code; use raw_ato    4138  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_or_release() there.
4139  *                                               4139  *
4140  * Return: The original value of @v.             4140  * Return: The original value of @v.
4141  */                                              4141  */
4142 static __always_inline long                      4142 static __always_inline long
4143 atomic_long_fetch_or_release(long i, atomic_l    4143 atomic_long_fetch_or_release(long i, atomic_long_t *v)
4144 {                                                4144 {
4145         kcsan_release();                         4145         kcsan_release();
4146         instrument_atomic_read_write(v, sizeo    4146         instrument_atomic_read_write(v, sizeof(*v));
4147         return raw_atomic_long_fetch_or_relea    4147         return raw_atomic_long_fetch_or_release(i, v);
4148 }                                                4148 }
4149                                                  4149 
4150 /**                                              4150 /**
4151  * atomic_long_fetch_or_relaxed() - atomic bi    4151  * atomic_long_fetch_or_relaxed() - atomic bitwise OR with relaxed ordering
4152  * @i: long value                                4152  * @i: long value
4153  * @v: pointer to atomic_long_t                  4153  * @v: pointer to atomic_long_t
4154  *                                               4154  *
4155  * Atomically updates @v to (@v | @i) with re    4155  * Atomically updates @v to (@v | @i) with relaxed ordering.
4156  *                                               4156  *
4157  * Unsafe to use in noinstr code; use raw_ato    4157  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_or_relaxed() there.
4158  *                                               4158  *
4159  * Return: The original value of @v.             4159  * Return: The original value of @v.
4160  */                                              4160  */
4161 static __always_inline long                      4161 static __always_inline long
4162 atomic_long_fetch_or_relaxed(long i, atomic_l    4162 atomic_long_fetch_or_relaxed(long i, atomic_long_t *v)
4163 {                                                4163 {
4164         instrument_atomic_read_write(v, sizeo    4164         instrument_atomic_read_write(v, sizeof(*v));
4165         return raw_atomic_long_fetch_or_relax    4165         return raw_atomic_long_fetch_or_relaxed(i, v);
4166 }                                                4166 }
4167                                                  4167 
4168 /**                                              4168 /**
4169  * atomic_long_xor() - atomic bitwise XOR wit    4169  * atomic_long_xor() - atomic bitwise XOR with relaxed ordering
4170  * @i: long value                                4170  * @i: long value
4171  * @v: pointer to atomic_long_t                  4171  * @v: pointer to atomic_long_t
4172  *                                               4172  *
4173  * Atomically updates @v to (@v ^ @i) with re    4173  * Atomically updates @v to (@v ^ @i) with relaxed ordering.
4174  *                                               4174  *
4175  * Unsafe to use in noinstr code; use raw_ato    4175  * Unsafe to use in noinstr code; use raw_atomic_long_xor() there.
4176  *                                               4176  *
4177  * Return: Nothing.                              4177  * Return: Nothing.
4178  */                                              4178  */
4179 static __always_inline void                      4179 static __always_inline void
4180 atomic_long_xor(long i, atomic_long_t *v)        4180 atomic_long_xor(long i, atomic_long_t *v)
4181 {                                                4181 {
4182         instrument_atomic_read_write(v, sizeo    4182         instrument_atomic_read_write(v, sizeof(*v));
4183         raw_atomic_long_xor(i, v);               4183         raw_atomic_long_xor(i, v);
4184 }                                                4184 }
4185                                                  4185 
4186 /**                                              4186 /**
4187  * atomic_long_fetch_xor() - atomic bitwise X    4187  * atomic_long_fetch_xor() - atomic bitwise XOR with full ordering
4188  * @i: long value                                4188  * @i: long value
4189  * @v: pointer to atomic_long_t                  4189  * @v: pointer to atomic_long_t
4190  *                                               4190  *
4191  * Atomically updates @v to (@v ^ @i) with fu    4191  * Atomically updates @v to (@v ^ @i) with full ordering.
4192  *                                               4192  *
4193  * Unsafe to use in noinstr code; use raw_ato    4193  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_xor() there.
4194  *                                               4194  *
4195  * Return: The original value of @v.             4195  * Return: The original value of @v.
4196  */                                              4196  */
4197 static __always_inline long                      4197 static __always_inline long
4198 atomic_long_fetch_xor(long i, atomic_long_t *    4198 atomic_long_fetch_xor(long i, atomic_long_t *v)
4199 {                                                4199 {
4200         kcsan_mb();                              4200         kcsan_mb();
4201         instrument_atomic_read_write(v, sizeo    4201         instrument_atomic_read_write(v, sizeof(*v));
4202         return raw_atomic_long_fetch_xor(i, v    4202         return raw_atomic_long_fetch_xor(i, v);
4203 }                                                4203 }
4204                                                  4204 
4205 /**                                              4205 /**
4206  * atomic_long_fetch_xor_acquire() - atomic b    4206  * atomic_long_fetch_xor_acquire() - atomic bitwise XOR with acquire ordering
4207  * @i: long value                                4207  * @i: long value
4208  * @v: pointer to atomic_long_t                  4208  * @v: pointer to atomic_long_t
4209  *                                               4209  *
4210  * Atomically updates @v to (@v ^ @i) with ac    4210  * Atomically updates @v to (@v ^ @i) with acquire ordering.
4211  *                                               4211  *
4212  * Unsafe to use in noinstr code; use raw_ato    4212  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_xor_acquire() there.
4213  *                                               4213  *
4214  * Return: The original value of @v.             4214  * Return: The original value of @v.
4215  */                                              4215  */
4216 static __always_inline long                      4216 static __always_inline long
4217 atomic_long_fetch_xor_acquire(long i, atomic_    4217 atomic_long_fetch_xor_acquire(long i, atomic_long_t *v)
4218 {                                                4218 {
4219         instrument_atomic_read_write(v, sizeo    4219         instrument_atomic_read_write(v, sizeof(*v));
4220         return raw_atomic_long_fetch_xor_acqu    4220         return raw_atomic_long_fetch_xor_acquire(i, v);
4221 }                                                4221 }
4222                                                  4222 
4223 /**                                              4223 /**
4224  * atomic_long_fetch_xor_release() - atomic b    4224  * atomic_long_fetch_xor_release() - atomic bitwise XOR with release ordering
4225  * @i: long value                                4225  * @i: long value
4226  * @v: pointer to atomic_long_t                  4226  * @v: pointer to atomic_long_t
4227  *                                               4227  *
4228  * Atomically updates @v to (@v ^ @i) with re    4228  * Atomically updates @v to (@v ^ @i) with release ordering.
4229  *                                               4229  *
4230  * Unsafe to use in noinstr code; use raw_ato    4230  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_xor_release() there.
4231  *                                               4231  *
4232  * Return: The original value of @v.             4232  * Return: The original value of @v.
4233  */                                              4233  */
4234 static __always_inline long                      4234 static __always_inline long
4235 atomic_long_fetch_xor_release(long i, atomic_    4235 atomic_long_fetch_xor_release(long i, atomic_long_t *v)
4236 {                                                4236 {
4237         kcsan_release();                         4237         kcsan_release();
4238         instrument_atomic_read_write(v, sizeo    4238         instrument_atomic_read_write(v, sizeof(*v));
4239         return raw_atomic_long_fetch_xor_rele    4239         return raw_atomic_long_fetch_xor_release(i, v);
4240 }                                                4240 }
4241                                                  4241 
4242 /**                                              4242 /**
4243  * atomic_long_fetch_xor_relaxed() - atomic b    4243  * atomic_long_fetch_xor_relaxed() - atomic bitwise XOR with relaxed ordering
4244  * @i: long value                                4244  * @i: long value
4245  * @v: pointer to atomic_long_t                  4245  * @v: pointer to atomic_long_t
4246  *                                               4246  *
4247  * Atomically updates @v to (@v ^ @i) with re    4247  * Atomically updates @v to (@v ^ @i) with relaxed ordering.
4248  *                                               4248  *
4249  * Unsafe to use in noinstr code; use raw_ato    4249  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_xor_relaxed() there.
4250  *                                               4250  *
4251  * Return: The original value of @v.             4251  * Return: The original value of @v.
4252  */                                              4252  */
4253 static __always_inline long                      4253 static __always_inline long
4254 atomic_long_fetch_xor_relaxed(long i, atomic_    4254 atomic_long_fetch_xor_relaxed(long i, atomic_long_t *v)
4255 {                                                4255 {
4256         instrument_atomic_read_write(v, sizeo    4256         instrument_atomic_read_write(v, sizeof(*v));
4257         return raw_atomic_long_fetch_xor_rela    4257         return raw_atomic_long_fetch_xor_relaxed(i, v);
4258 }                                                4258 }
4259                                                  4259 
4260 /**                                              4260 /**
4261  * atomic_long_xchg() - atomic exchange with     4261  * atomic_long_xchg() - atomic exchange with full ordering
4262  * @v: pointer to atomic_long_t                  4262  * @v: pointer to atomic_long_t
4263  * @new: long value to assign                    4263  * @new: long value to assign
4264  *                                               4264  *
4265  * Atomically updates @v to @new with full or    4265  * Atomically updates @v to @new with full ordering.
4266  *                                               4266  *
4267  * Unsafe to use in noinstr code; use raw_ato    4267  * Unsafe to use in noinstr code; use raw_atomic_long_xchg() there.
4268  *                                               4268  *
4269  * Return: The original value of @v.             4269  * Return: The original value of @v.
4270  */                                              4270  */
4271 static __always_inline long                      4271 static __always_inline long
4272 atomic_long_xchg(atomic_long_t *v, long new)     4272 atomic_long_xchg(atomic_long_t *v, long new)
4273 {                                                4273 {
4274         kcsan_mb();                              4274         kcsan_mb();
4275         instrument_atomic_read_write(v, sizeo    4275         instrument_atomic_read_write(v, sizeof(*v));
4276         return raw_atomic_long_xchg(v, new);     4276         return raw_atomic_long_xchg(v, new);
4277 }                                                4277 }
4278                                                  4278 
4279 /**                                              4279 /**
4280  * atomic_long_xchg_acquire() - atomic exchan    4280  * atomic_long_xchg_acquire() - atomic exchange with acquire ordering
4281  * @v: pointer to atomic_long_t                  4281  * @v: pointer to atomic_long_t
4282  * @new: long value to assign                    4282  * @new: long value to assign
4283  *                                               4283  *
4284  * Atomically updates @v to @new with acquire    4284  * Atomically updates @v to @new with acquire ordering.
4285  *                                               4285  *
4286  * Unsafe to use in noinstr code; use raw_ato    4286  * Unsafe to use in noinstr code; use raw_atomic_long_xchg_acquire() there.
4287  *                                               4287  *
4288  * Return: The original value of @v.             4288  * Return: The original value of @v.
4289  */                                              4289  */
4290 static __always_inline long                      4290 static __always_inline long
4291 atomic_long_xchg_acquire(atomic_long_t *v, lo    4291 atomic_long_xchg_acquire(atomic_long_t *v, long new)
4292 {                                                4292 {
4293         instrument_atomic_read_write(v, sizeo    4293         instrument_atomic_read_write(v, sizeof(*v));
4294         return raw_atomic_long_xchg_acquire(v    4294         return raw_atomic_long_xchg_acquire(v, new);
4295 }                                                4295 }
4296                                                  4296 
4297 /**                                              4297 /**
4298  * atomic_long_xchg_release() - atomic exchan    4298  * atomic_long_xchg_release() - atomic exchange with release ordering
4299  * @v: pointer to atomic_long_t                  4299  * @v: pointer to atomic_long_t
4300  * @new: long value to assign                    4300  * @new: long value to assign
4301  *                                               4301  *
4302  * Atomically updates @v to @new with release    4302  * Atomically updates @v to @new with release ordering.
4303  *                                               4303  *
4304  * Unsafe to use in noinstr code; use raw_ato    4304  * Unsafe to use in noinstr code; use raw_atomic_long_xchg_release() there.
4305  *                                               4305  *
4306  * Return: The original value of @v.             4306  * Return: The original value of @v.
4307  */                                              4307  */
4308 static __always_inline long                      4308 static __always_inline long
4309 atomic_long_xchg_release(atomic_long_t *v, lo    4309 atomic_long_xchg_release(atomic_long_t *v, long new)
4310 {                                                4310 {
4311         kcsan_release();                         4311         kcsan_release();
4312         instrument_atomic_read_write(v, sizeo    4312         instrument_atomic_read_write(v, sizeof(*v));
4313         return raw_atomic_long_xchg_release(v    4313         return raw_atomic_long_xchg_release(v, new);
4314 }                                                4314 }
4315                                                  4315 
4316 /**                                              4316 /**
4317  * atomic_long_xchg_relaxed() - atomic exchan    4317  * atomic_long_xchg_relaxed() - atomic exchange with relaxed ordering
4318  * @v: pointer to atomic_long_t                  4318  * @v: pointer to atomic_long_t
4319  * @new: long value to assign                    4319  * @new: long value to assign
4320  *                                               4320  *
4321  * Atomically updates @v to @new with relaxed    4321  * Atomically updates @v to @new with relaxed ordering.
4322  *                                               4322  *
4323  * Unsafe to use in noinstr code; use raw_ato    4323  * Unsafe to use in noinstr code; use raw_atomic_long_xchg_relaxed() there.
4324  *                                               4324  *
4325  * Return: The original value of @v.             4325  * Return: The original value of @v.
4326  */                                              4326  */
4327 static __always_inline long                      4327 static __always_inline long
4328 atomic_long_xchg_relaxed(atomic_long_t *v, lo    4328 atomic_long_xchg_relaxed(atomic_long_t *v, long new)
4329 {                                                4329 {
4330         instrument_atomic_read_write(v, sizeo    4330         instrument_atomic_read_write(v, sizeof(*v));
4331         return raw_atomic_long_xchg_relaxed(v    4331         return raw_atomic_long_xchg_relaxed(v, new);
4332 }                                                4332 }
4333                                                  4333 
4334 /**                                              4334 /**
4335  * atomic_long_cmpxchg() - atomic compare and    4335  * atomic_long_cmpxchg() - atomic compare and exchange with full ordering
4336  * @v: pointer to atomic_long_t                  4336  * @v: pointer to atomic_long_t
4337  * @old: long value to compare with              4337  * @old: long value to compare with
4338  * @new: long value to assign                    4338  * @new: long value to assign
4339  *                                               4339  *
4340  * If (@v == @old), atomically updates @v to     4340  * If (@v == @old), atomically updates @v to @new with full ordering.
4341  * Otherwise, @v is not modified and relaxed     4341  * Otherwise, @v is not modified and relaxed ordering is provided.
4342  *                                               4342  *
4343  * Unsafe to use in noinstr code; use raw_ato    4343  * Unsafe to use in noinstr code; use raw_atomic_long_cmpxchg() there.
4344  *                                               4344  *
4345  * Return: The original value of @v.             4345  * Return: The original value of @v.
4346  */                                              4346  */
4347 static __always_inline long                      4347 static __always_inline long
4348 atomic_long_cmpxchg(atomic_long_t *v, long ol    4348 atomic_long_cmpxchg(atomic_long_t *v, long old, long new)
4349 {                                                4349 {
4350         kcsan_mb();                              4350         kcsan_mb();
4351         instrument_atomic_read_write(v, sizeo    4351         instrument_atomic_read_write(v, sizeof(*v));
4352         return raw_atomic_long_cmpxchg(v, old    4352         return raw_atomic_long_cmpxchg(v, old, new);
4353 }                                                4353 }
4354                                                  4354 
4355 /**                                              4355 /**
4356  * atomic_long_cmpxchg_acquire() - atomic com    4356  * atomic_long_cmpxchg_acquire() - atomic compare and exchange with acquire ordering
4357  * @v: pointer to atomic_long_t                  4357  * @v: pointer to atomic_long_t
4358  * @old: long value to compare with              4358  * @old: long value to compare with
4359  * @new: long value to assign                    4359  * @new: long value to assign
4360  *                                               4360  *
4361  * If (@v == @old), atomically updates @v to     4361  * If (@v == @old), atomically updates @v to @new with acquire ordering.
4362  * Otherwise, @v is not modified and relaxed     4362  * Otherwise, @v is not modified and relaxed ordering is provided.
4363  *                                               4363  *
4364  * Unsafe to use in noinstr code; use raw_ato    4364  * Unsafe to use in noinstr code; use raw_atomic_long_cmpxchg_acquire() there.
4365  *                                               4365  *
4366  * Return: The original value of @v.             4366  * Return: The original value of @v.
4367  */                                              4367  */
4368 static __always_inline long                      4368 static __always_inline long
4369 atomic_long_cmpxchg_acquire(atomic_long_t *v,    4369 atomic_long_cmpxchg_acquire(atomic_long_t *v, long old, long new)
4370 {                                                4370 {
4371         instrument_atomic_read_write(v, sizeo    4371         instrument_atomic_read_write(v, sizeof(*v));
4372         return raw_atomic_long_cmpxchg_acquir    4372         return raw_atomic_long_cmpxchg_acquire(v, old, new);
4373 }                                                4373 }
4374                                                  4374 
4375 /**                                              4375 /**
4376  * atomic_long_cmpxchg_release() - atomic com    4376  * atomic_long_cmpxchg_release() - atomic compare and exchange with release ordering
4377  * @v: pointer to atomic_long_t                  4377  * @v: pointer to atomic_long_t
4378  * @old: long value to compare with              4378  * @old: long value to compare with
4379  * @new: long value to assign                    4379  * @new: long value to assign
4380  *                                               4380  *
4381  * If (@v == @old), atomically updates @v to     4381  * If (@v == @old), atomically updates @v to @new with release ordering.
4382  * Otherwise, @v is not modified and relaxed     4382  * Otherwise, @v is not modified and relaxed ordering is provided.
4383  *                                               4383  *
4384  * Unsafe to use in noinstr code; use raw_ato    4384  * Unsafe to use in noinstr code; use raw_atomic_long_cmpxchg_release() there.
4385  *                                               4385  *
4386  * Return: The original value of @v.             4386  * Return: The original value of @v.
4387  */                                              4387  */
4388 static __always_inline long                      4388 static __always_inline long
4389 atomic_long_cmpxchg_release(atomic_long_t *v,    4389 atomic_long_cmpxchg_release(atomic_long_t *v, long old, long new)
4390 {                                                4390 {
4391         kcsan_release();                         4391         kcsan_release();
4392         instrument_atomic_read_write(v, sizeo    4392         instrument_atomic_read_write(v, sizeof(*v));
4393         return raw_atomic_long_cmpxchg_releas    4393         return raw_atomic_long_cmpxchg_release(v, old, new);
4394 }                                                4394 }
4395                                                  4395 
4396 /**                                              4396 /**
4397  * atomic_long_cmpxchg_relaxed() - atomic com    4397  * atomic_long_cmpxchg_relaxed() - atomic compare and exchange with relaxed ordering
4398  * @v: pointer to atomic_long_t                  4398  * @v: pointer to atomic_long_t
4399  * @old: long value to compare with              4399  * @old: long value to compare with
4400  * @new: long value to assign                    4400  * @new: long value to assign
4401  *                                               4401  *
4402  * If (@v == @old), atomically updates @v to     4402  * If (@v == @old), atomically updates @v to @new with relaxed ordering.
4403  * Otherwise, @v is not modified and relaxed     4403  * Otherwise, @v is not modified and relaxed ordering is provided.
4404  *                                               4404  *
4405  * Unsafe to use in noinstr code; use raw_ato    4405  * Unsafe to use in noinstr code; use raw_atomic_long_cmpxchg_relaxed() there.
4406  *                                               4406  *
4407  * Return: The original value of @v.             4407  * Return: The original value of @v.
4408  */                                              4408  */
4409 static __always_inline long                      4409 static __always_inline long
4410 atomic_long_cmpxchg_relaxed(atomic_long_t *v,    4410 atomic_long_cmpxchg_relaxed(atomic_long_t *v, long old, long new)
4411 {                                                4411 {
4412         instrument_atomic_read_write(v, sizeo    4412         instrument_atomic_read_write(v, sizeof(*v));
4413         return raw_atomic_long_cmpxchg_relaxe    4413         return raw_atomic_long_cmpxchg_relaxed(v, old, new);
4414 }                                                4414 }
4415                                                  4415 
4416 /**                                              4416 /**
4417  * atomic_long_try_cmpxchg() - atomic compare    4417  * atomic_long_try_cmpxchg() - atomic compare and exchange with full ordering
4418  * @v: pointer to atomic_long_t                  4418  * @v: pointer to atomic_long_t
4419  * @old: pointer to long value to compare wit    4419  * @old: pointer to long value to compare with
4420  * @new: long value to assign                    4420  * @new: long value to assign
4421  *                                               4421  *
4422  * If (@v == @old), atomically updates @v to     4422  * If (@v == @old), atomically updates @v to @new with full ordering.
4423  * Otherwise, @v is not modified, @old is upd    4423  * Otherwise, @v is not modified, @old is updated to the current value of @v,
4424  * and relaxed ordering is provided.             4424  * and relaxed ordering is provided.
4425  *                                               4425  *
4426  * Unsafe to use in noinstr code; use raw_ato    4426  * Unsafe to use in noinstr code; use raw_atomic_long_try_cmpxchg() there.
4427  *                                               4427  *
4428  * Return: @true if the exchange occured, @fa    4428  * Return: @true if the exchange occured, @false otherwise.
4429  */                                              4429  */
4430 static __always_inline bool                      4430 static __always_inline bool
4431 atomic_long_try_cmpxchg(atomic_long_t *v, lon    4431 atomic_long_try_cmpxchg(atomic_long_t *v, long *old, long new)
4432 {                                                4432 {
4433         kcsan_mb();                              4433         kcsan_mb();
4434         instrument_atomic_read_write(v, sizeo    4434         instrument_atomic_read_write(v, sizeof(*v));
4435         instrument_atomic_read_write(old, siz    4435         instrument_atomic_read_write(old, sizeof(*old));
4436         return raw_atomic_long_try_cmpxchg(v,    4436         return raw_atomic_long_try_cmpxchg(v, old, new);
4437 }                                                4437 }
4438                                                  4438 
4439 /**                                              4439 /**
4440  * atomic_long_try_cmpxchg_acquire() - atomic    4440  * atomic_long_try_cmpxchg_acquire() - atomic compare and exchange with acquire ordering
4441  * @v: pointer to atomic_long_t                  4441  * @v: pointer to atomic_long_t
4442  * @old: pointer to long value to compare wit    4442  * @old: pointer to long value to compare with
4443  * @new: long value to assign                    4443  * @new: long value to assign
4444  *                                               4444  *
4445  * If (@v == @old), atomically updates @v to     4445  * If (@v == @old), atomically updates @v to @new with acquire ordering.
4446  * Otherwise, @v is not modified, @old is upd    4446  * Otherwise, @v is not modified, @old is updated to the current value of @v,
4447  * and relaxed ordering is provided.             4447  * and relaxed ordering is provided.
4448  *                                               4448  *
4449  * Unsafe to use in noinstr code; use raw_ato    4449  * Unsafe to use in noinstr code; use raw_atomic_long_try_cmpxchg_acquire() there.
4450  *                                               4450  *
4451  * Return: @true if the exchange occured, @fa    4451  * Return: @true if the exchange occured, @false otherwise.
4452  */                                              4452  */
4453 static __always_inline bool                      4453 static __always_inline bool
4454 atomic_long_try_cmpxchg_acquire(atomic_long_t    4454 atomic_long_try_cmpxchg_acquire(atomic_long_t *v, long *old, long new)
4455 {                                                4455 {
4456         instrument_atomic_read_write(v, sizeo    4456         instrument_atomic_read_write(v, sizeof(*v));
4457         instrument_atomic_read_write(old, siz    4457         instrument_atomic_read_write(old, sizeof(*old));
4458         return raw_atomic_long_try_cmpxchg_ac    4458         return raw_atomic_long_try_cmpxchg_acquire(v, old, new);
4459 }                                                4459 }
4460                                                  4460 
4461 /**                                              4461 /**
4462  * atomic_long_try_cmpxchg_release() - atomic    4462  * atomic_long_try_cmpxchg_release() - atomic compare and exchange with release ordering
4463  * @v: pointer to atomic_long_t                  4463  * @v: pointer to atomic_long_t
4464  * @old: pointer to long value to compare wit    4464  * @old: pointer to long value to compare with
4465  * @new: long value to assign                    4465  * @new: long value to assign
4466  *                                               4466  *
4467  * If (@v == @old), atomically updates @v to     4467  * If (@v == @old), atomically updates @v to @new with release ordering.
4468  * Otherwise, @v is not modified, @old is upd    4468  * Otherwise, @v is not modified, @old is updated to the current value of @v,
4469  * and relaxed ordering is provided.             4469  * and relaxed ordering is provided.
4470  *                                               4470  *
4471  * Unsafe to use in noinstr code; use raw_ato    4471  * Unsafe to use in noinstr code; use raw_atomic_long_try_cmpxchg_release() there.
4472  *                                               4472  *
4473  * Return: @true if the exchange occured, @fa    4473  * Return: @true if the exchange occured, @false otherwise.
4474  */                                              4474  */
4475 static __always_inline bool                      4475 static __always_inline bool
4476 atomic_long_try_cmpxchg_release(atomic_long_t    4476 atomic_long_try_cmpxchg_release(atomic_long_t *v, long *old, long new)
4477 {                                                4477 {
4478         kcsan_release();                         4478         kcsan_release();
4479         instrument_atomic_read_write(v, sizeo    4479         instrument_atomic_read_write(v, sizeof(*v));
4480         instrument_atomic_read_write(old, siz    4480         instrument_atomic_read_write(old, sizeof(*old));
4481         return raw_atomic_long_try_cmpxchg_re    4481         return raw_atomic_long_try_cmpxchg_release(v, old, new);
4482 }                                                4482 }
4483                                                  4483 
4484 /**                                              4484 /**
4485  * atomic_long_try_cmpxchg_relaxed() - atomic    4485  * atomic_long_try_cmpxchg_relaxed() - atomic compare and exchange with relaxed ordering
4486  * @v: pointer to atomic_long_t                  4486  * @v: pointer to atomic_long_t
4487  * @old: pointer to long value to compare wit    4487  * @old: pointer to long value to compare with
4488  * @new: long value to assign                    4488  * @new: long value to assign
4489  *                                               4489  *
4490  * If (@v == @old), atomically updates @v to     4490  * If (@v == @old), atomically updates @v to @new with relaxed ordering.
4491  * Otherwise, @v is not modified, @old is upd    4491  * Otherwise, @v is not modified, @old is updated to the current value of @v,
4492  * and relaxed ordering is provided.             4492  * and relaxed ordering is provided.
4493  *                                               4493  *
4494  * Unsafe to use in noinstr code; use raw_ato    4494  * Unsafe to use in noinstr code; use raw_atomic_long_try_cmpxchg_relaxed() there.
4495  *                                               4495  *
4496  * Return: @true if the exchange occured, @fa    4496  * Return: @true if the exchange occured, @false otherwise.
4497  */                                              4497  */
4498 static __always_inline bool                      4498 static __always_inline bool
4499 atomic_long_try_cmpxchg_relaxed(atomic_long_t    4499 atomic_long_try_cmpxchg_relaxed(atomic_long_t *v, long *old, long new)
4500 {                                                4500 {
4501         instrument_atomic_read_write(v, sizeo    4501         instrument_atomic_read_write(v, sizeof(*v));
4502         instrument_atomic_read_write(old, siz    4502         instrument_atomic_read_write(old, sizeof(*old));
4503         return raw_atomic_long_try_cmpxchg_re    4503         return raw_atomic_long_try_cmpxchg_relaxed(v, old, new);
4504 }                                                4504 }
4505                                                  4505 
4506 /**                                              4506 /**
4507  * atomic_long_sub_and_test() - atomic subtra    4507  * atomic_long_sub_and_test() - atomic subtract and test if zero with full ordering
4508  * @i: long value to subtract                    4508  * @i: long value to subtract
4509  * @v: pointer to atomic_long_t                  4509  * @v: pointer to atomic_long_t
4510  *                                               4510  *
4511  * Atomically updates @v to (@v - @i) with fu    4511  * Atomically updates @v to (@v - @i) with full ordering.
4512  *                                               4512  *
4513  * Unsafe to use in noinstr code; use raw_ato    4513  * Unsafe to use in noinstr code; use raw_atomic_long_sub_and_test() there.
4514  *                                               4514  *
4515  * Return: @true if the resulting value of @v    4515  * Return: @true if the resulting value of @v is zero, @false otherwise.
4516  */                                              4516  */
4517 static __always_inline bool                      4517 static __always_inline bool
4518 atomic_long_sub_and_test(long i, atomic_long_    4518 atomic_long_sub_and_test(long i, atomic_long_t *v)
4519 {                                                4519 {
4520         kcsan_mb();                              4520         kcsan_mb();
4521         instrument_atomic_read_write(v, sizeo    4521         instrument_atomic_read_write(v, sizeof(*v));
4522         return raw_atomic_long_sub_and_test(i    4522         return raw_atomic_long_sub_and_test(i, v);
4523 }                                                4523 }
4524                                                  4524 
4525 /**                                              4525 /**
4526  * atomic_long_dec_and_test() - atomic decrem    4526  * atomic_long_dec_and_test() - atomic decrement and test if zero with full ordering
4527  * @v: pointer to atomic_long_t                  4527  * @v: pointer to atomic_long_t
4528  *                                               4528  *
4529  * Atomically updates @v to (@v - 1) with ful    4529  * Atomically updates @v to (@v - 1) with full ordering.
4530  *                                               4530  *
4531  * Unsafe to use in noinstr code; use raw_ato    4531  * Unsafe to use in noinstr code; use raw_atomic_long_dec_and_test() there.
4532  *                                               4532  *
4533  * Return: @true if the resulting value of @v    4533  * Return: @true if the resulting value of @v is zero, @false otherwise.
4534  */                                              4534  */
4535 static __always_inline bool                      4535 static __always_inline bool
4536 atomic_long_dec_and_test(atomic_long_t *v)       4536 atomic_long_dec_and_test(atomic_long_t *v)
4537 {                                                4537 {
4538         kcsan_mb();                              4538         kcsan_mb();
4539         instrument_atomic_read_write(v, sizeo    4539         instrument_atomic_read_write(v, sizeof(*v));
4540         return raw_atomic_long_dec_and_test(v    4540         return raw_atomic_long_dec_and_test(v);
4541 }                                                4541 }
4542                                                  4542 
4543 /**                                              4543 /**
4544  * atomic_long_inc_and_test() - atomic increm    4544  * atomic_long_inc_and_test() - atomic increment and test if zero with full ordering
4545  * @v: pointer to atomic_long_t                  4545  * @v: pointer to atomic_long_t
4546  *                                               4546  *
4547  * Atomically updates @v to (@v + 1) with ful    4547  * Atomically updates @v to (@v + 1) with full ordering.
4548  *                                               4548  *
4549  * Unsafe to use in noinstr code; use raw_ato    4549  * Unsafe to use in noinstr code; use raw_atomic_long_inc_and_test() there.
4550  *                                               4550  *
4551  * Return: @true if the resulting value of @v    4551  * Return: @true if the resulting value of @v is zero, @false otherwise.
4552  */                                              4552  */
4553 static __always_inline bool                      4553 static __always_inline bool
4554 atomic_long_inc_and_test(atomic_long_t *v)       4554 atomic_long_inc_and_test(atomic_long_t *v)
4555 {                                                4555 {
4556         kcsan_mb();                              4556         kcsan_mb();
4557         instrument_atomic_read_write(v, sizeo    4557         instrument_atomic_read_write(v, sizeof(*v));
4558         return raw_atomic_long_inc_and_test(v    4558         return raw_atomic_long_inc_and_test(v);
4559 }                                                4559 }
4560                                                  4560 
4561 /**                                              4561 /**
4562  * atomic_long_add_negative() - atomic add an    4562  * atomic_long_add_negative() - atomic add and test if negative with full ordering
4563  * @i: long value to add                         4563  * @i: long value to add
4564  * @v: pointer to atomic_long_t                  4564  * @v: pointer to atomic_long_t
4565  *                                               4565  *
4566  * Atomically updates @v to (@v + @i) with fu    4566  * Atomically updates @v to (@v + @i) with full ordering.
4567  *                                               4567  *
4568  * Unsafe to use in noinstr code; use raw_ato    4568  * Unsafe to use in noinstr code; use raw_atomic_long_add_negative() there.
4569  *                                               4569  *
4570  * Return: @true if the resulting value of @v    4570  * Return: @true if the resulting value of @v is negative, @false otherwise.
4571  */                                              4571  */
4572 static __always_inline bool                      4572 static __always_inline bool
4573 atomic_long_add_negative(long i, atomic_long_    4573 atomic_long_add_negative(long i, atomic_long_t *v)
4574 {                                                4574 {
4575         kcsan_mb();                              4575         kcsan_mb();
4576         instrument_atomic_read_write(v, sizeo    4576         instrument_atomic_read_write(v, sizeof(*v));
4577         return raw_atomic_long_add_negative(i    4577         return raw_atomic_long_add_negative(i, v);
4578 }                                                4578 }
4579                                                  4579 
4580 /**                                              4580 /**
4581  * atomic_long_add_negative_acquire() - atomi    4581  * atomic_long_add_negative_acquire() - atomic add and test if negative with acquire ordering
4582  * @i: long value to add                         4582  * @i: long value to add
4583  * @v: pointer to atomic_long_t                  4583  * @v: pointer to atomic_long_t
4584  *                                               4584  *
4585  * Atomically updates @v to (@v + @i) with ac    4585  * Atomically updates @v to (@v + @i) with acquire ordering.
4586  *                                               4586  *
4587  * Unsafe to use in noinstr code; use raw_ato    4587  * Unsafe to use in noinstr code; use raw_atomic_long_add_negative_acquire() there.
4588  *                                               4588  *
4589  * Return: @true if the resulting value of @v    4589  * Return: @true if the resulting value of @v is negative, @false otherwise.
4590  */                                              4590  */
4591 static __always_inline bool                      4591 static __always_inline bool
4592 atomic_long_add_negative_acquire(long i, atom    4592 atomic_long_add_negative_acquire(long i, atomic_long_t *v)
4593 {                                                4593 {
4594         instrument_atomic_read_write(v, sizeo    4594         instrument_atomic_read_write(v, sizeof(*v));
4595         return raw_atomic_long_add_negative_a    4595         return raw_atomic_long_add_negative_acquire(i, v);
4596 }                                                4596 }
4597                                                  4597 
4598 /**                                              4598 /**
4599  * atomic_long_add_negative_release() - atomi    4599  * atomic_long_add_negative_release() - atomic add and test if negative with release ordering
4600  * @i: long value to add                         4600  * @i: long value to add
4601  * @v: pointer to atomic_long_t                  4601  * @v: pointer to atomic_long_t
4602  *                                               4602  *
4603  * Atomically updates @v to (@v + @i) with re    4603  * Atomically updates @v to (@v + @i) with release ordering.
4604  *                                               4604  *
4605  * Unsafe to use in noinstr code; use raw_ato    4605  * Unsafe to use in noinstr code; use raw_atomic_long_add_negative_release() there.
4606  *                                               4606  *
4607  * Return: @true if the resulting value of @v    4607  * Return: @true if the resulting value of @v is negative, @false otherwise.
4608  */                                              4608  */
4609 static __always_inline bool                      4609 static __always_inline bool
4610 atomic_long_add_negative_release(long i, atom    4610 atomic_long_add_negative_release(long i, atomic_long_t *v)
4611 {                                                4611 {
4612         kcsan_release();                         4612         kcsan_release();
4613         instrument_atomic_read_write(v, sizeo    4613         instrument_atomic_read_write(v, sizeof(*v));
4614         return raw_atomic_long_add_negative_r    4614         return raw_atomic_long_add_negative_release(i, v);
4615 }                                                4615 }
4616                                                  4616 
4617 /**                                              4617 /**
4618  * atomic_long_add_negative_relaxed() - atomi    4618  * atomic_long_add_negative_relaxed() - atomic add and test if negative with relaxed ordering
4619  * @i: long value to add                         4619  * @i: long value to add
4620  * @v: pointer to atomic_long_t                  4620  * @v: pointer to atomic_long_t
4621  *                                               4621  *
4622  * Atomically updates @v to (@v + @i) with re    4622  * Atomically updates @v to (@v + @i) with relaxed ordering.
4623  *                                               4623  *
4624  * Unsafe to use in noinstr code; use raw_ato    4624  * Unsafe to use in noinstr code; use raw_atomic_long_add_negative_relaxed() there.
4625  *                                               4625  *
4626  * Return: @true if the resulting value of @v    4626  * Return: @true if the resulting value of @v is negative, @false otherwise.
4627  */                                              4627  */
4628 static __always_inline bool                      4628 static __always_inline bool
4629 atomic_long_add_negative_relaxed(long i, atom    4629 atomic_long_add_negative_relaxed(long i, atomic_long_t *v)
4630 {                                                4630 {
4631         instrument_atomic_read_write(v, sizeo    4631         instrument_atomic_read_write(v, sizeof(*v));
4632         return raw_atomic_long_add_negative_r    4632         return raw_atomic_long_add_negative_relaxed(i, v);
4633 }                                                4633 }
4634                                                  4634 
4635 /**                                              4635 /**
4636  * atomic_long_fetch_add_unless() - atomic ad    4636  * atomic_long_fetch_add_unless() - atomic add unless value with full ordering
4637  * @v: pointer to atomic_long_t                  4637  * @v: pointer to atomic_long_t
4638  * @a: long value to add                         4638  * @a: long value to add
4639  * @u: long value to compare with                4639  * @u: long value to compare with
4640  *                                               4640  *
4641  * If (@v != @u), atomically updates @v to (@    4641  * If (@v != @u), atomically updates @v to (@v + @a) with full ordering.
4642  * Otherwise, @v is not modified and relaxed     4642  * Otherwise, @v is not modified and relaxed ordering is provided.
4643  *                                               4643  *
4644  * Unsafe to use in noinstr code; use raw_ato    4644  * Unsafe to use in noinstr code; use raw_atomic_long_fetch_add_unless() there.
4645  *                                               4645  *
4646  * Return: The original value of @v.             4646  * Return: The original value of @v.
4647  */                                              4647  */
4648 static __always_inline long                      4648 static __always_inline long
4649 atomic_long_fetch_add_unless(atomic_long_t *v    4649 atomic_long_fetch_add_unless(atomic_long_t *v, long a, long u)
4650 {                                                4650 {
4651         kcsan_mb();                              4651         kcsan_mb();
4652         instrument_atomic_read_write(v, sizeo    4652         instrument_atomic_read_write(v, sizeof(*v));
4653         return raw_atomic_long_fetch_add_unle    4653         return raw_atomic_long_fetch_add_unless(v, a, u);
4654 }                                                4654 }
4655                                                  4655 
4656 /**                                              4656 /**
4657  * atomic_long_add_unless() - atomic add unle    4657  * atomic_long_add_unless() - atomic add unless value with full ordering
4658  * @v: pointer to atomic_long_t                  4658  * @v: pointer to atomic_long_t
4659  * @a: long value to add                         4659  * @a: long value to add
4660  * @u: long value to compare with                4660  * @u: long value to compare with
4661  *                                               4661  *
4662  * If (@v != @u), atomically updates @v to (@    4662  * If (@v != @u), atomically updates @v to (@v + @a) with full ordering.
4663  * Otherwise, @v is not modified and relaxed     4663  * Otherwise, @v is not modified and relaxed ordering is provided.
4664  *                                               4664  *
4665  * Unsafe to use in noinstr code; use raw_ato    4665  * Unsafe to use in noinstr code; use raw_atomic_long_add_unless() there.
4666  *                                               4666  *
4667  * Return: @true if @v was updated, @false ot    4667  * Return: @true if @v was updated, @false otherwise.
4668  */                                              4668  */
4669 static __always_inline bool                      4669 static __always_inline bool
4670 atomic_long_add_unless(atomic_long_t *v, long    4670 atomic_long_add_unless(atomic_long_t *v, long a, long u)
4671 {                                                4671 {
4672         kcsan_mb();                              4672         kcsan_mb();
4673         instrument_atomic_read_write(v, sizeo    4673         instrument_atomic_read_write(v, sizeof(*v));
4674         return raw_atomic_long_add_unless(v,     4674         return raw_atomic_long_add_unless(v, a, u);
4675 }                                                4675 }
4676                                                  4676 
4677 /**                                              4677 /**
4678  * atomic_long_inc_not_zero() - atomic increm    4678  * atomic_long_inc_not_zero() - atomic increment unless zero with full ordering
4679  * @v: pointer to atomic_long_t                  4679  * @v: pointer to atomic_long_t
4680  *                                               4680  *
4681  * If (@v != 0), atomically updates @v to (@v    4681  * If (@v != 0), atomically updates @v to (@v + 1) with full ordering.
4682  * Otherwise, @v is not modified and relaxed     4682  * Otherwise, @v is not modified and relaxed ordering is provided.
4683  *                                               4683  *
4684  * Unsafe to use in noinstr code; use raw_ato    4684  * Unsafe to use in noinstr code; use raw_atomic_long_inc_not_zero() there.
4685  *                                               4685  *
4686  * Return: @true if @v was updated, @false ot    4686  * Return: @true if @v was updated, @false otherwise.
4687  */                                              4687  */
4688 static __always_inline bool                      4688 static __always_inline bool
4689 atomic_long_inc_not_zero(atomic_long_t *v)       4689 atomic_long_inc_not_zero(atomic_long_t *v)
4690 {                                                4690 {
4691         kcsan_mb();                              4691         kcsan_mb();
4692         instrument_atomic_read_write(v, sizeo    4692         instrument_atomic_read_write(v, sizeof(*v));
4693         return raw_atomic_long_inc_not_zero(v    4693         return raw_atomic_long_inc_not_zero(v);
4694 }                                                4694 }
4695                                                  4695 
4696 /**                                              4696 /**
4697  * atomic_long_inc_unless_negative() - atomic    4697  * atomic_long_inc_unless_negative() - atomic increment unless negative with full ordering
4698  * @v: pointer to atomic_long_t                  4698  * @v: pointer to atomic_long_t
4699  *                                               4699  *
4700  * If (@v >= 0), atomically updates @v to (@v    4700  * If (@v >= 0), atomically updates @v to (@v + 1) with full ordering.
4701  * Otherwise, @v is not modified and relaxed     4701  * Otherwise, @v is not modified and relaxed ordering is provided.
4702  *                                               4702  *
4703  * Unsafe to use in noinstr code; use raw_ato    4703  * Unsafe to use in noinstr code; use raw_atomic_long_inc_unless_negative() there.
4704  *                                               4704  *
4705  * Return: @true if @v was updated, @false ot    4705  * Return: @true if @v was updated, @false otherwise.
4706  */                                              4706  */
4707 static __always_inline bool                      4707 static __always_inline bool
4708 atomic_long_inc_unless_negative(atomic_long_t    4708 atomic_long_inc_unless_negative(atomic_long_t *v)
4709 {                                                4709 {
4710         kcsan_mb();                              4710         kcsan_mb();
4711         instrument_atomic_read_write(v, sizeo    4711         instrument_atomic_read_write(v, sizeof(*v));
4712         return raw_atomic_long_inc_unless_neg    4712         return raw_atomic_long_inc_unless_negative(v);
4713 }                                                4713 }
4714                                                  4714 
4715 /**                                              4715 /**
4716  * atomic_long_dec_unless_positive() - atomic    4716  * atomic_long_dec_unless_positive() - atomic decrement unless positive with full ordering
4717  * @v: pointer to atomic_long_t                  4717  * @v: pointer to atomic_long_t
4718  *                                               4718  *
4719  * If (@v <= 0), atomically updates @v to (@v    4719  * If (@v <= 0), atomically updates @v to (@v - 1) with full ordering.
4720  * Otherwise, @v is not modified and relaxed     4720  * Otherwise, @v is not modified and relaxed ordering is provided.
4721  *                                               4721  *
4722  * Unsafe to use in noinstr code; use raw_ato    4722  * Unsafe to use in noinstr code; use raw_atomic_long_dec_unless_positive() there.
4723  *                                               4723  *
4724  * Return: @true if @v was updated, @false ot    4724  * Return: @true if @v was updated, @false otherwise.
4725  */                                              4725  */
4726 static __always_inline bool                      4726 static __always_inline bool
4727 atomic_long_dec_unless_positive(atomic_long_t    4727 atomic_long_dec_unless_positive(atomic_long_t *v)
4728 {                                                4728 {
4729         kcsan_mb();                              4729         kcsan_mb();
4730         instrument_atomic_read_write(v, sizeo    4730         instrument_atomic_read_write(v, sizeof(*v));
4731         return raw_atomic_long_dec_unless_pos    4731         return raw_atomic_long_dec_unless_positive(v);
4732 }                                                4732 }
4733                                                  4733 
4734 /**                                              4734 /**
4735  * atomic_long_dec_if_positive() - atomic dec    4735  * atomic_long_dec_if_positive() - atomic decrement if positive with full ordering
4736  * @v: pointer to atomic_long_t                  4736  * @v: pointer to atomic_long_t
4737  *                                               4737  *
4738  * If (@v > 0), atomically updates @v to (@v     4738  * If (@v > 0), atomically updates @v to (@v - 1) with full ordering.
4739  * Otherwise, @v is not modified and relaxed     4739  * Otherwise, @v is not modified and relaxed ordering is provided.
4740  *                                               4740  *
4741  * Unsafe to use in noinstr code; use raw_ato    4741  * Unsafe to use in noinstr code; use raw_atomic_long_dec_if_positive() there.
4742  *                                               4742  *
4743  * Return: The old value of (@v - 1), regardl    4743  * Return: The old value of (@v - 1), regardless of whether @v was updated.
4744  */                                              4744  */
4745 static __always_inline long                      4745 static __always_inline long
4746 atomic_long_dec_if_positive(atomic_long_t *v)    4746 atomic_long_dec_if_positive(atomic_long_t *v)
4747 {                                                4747 {
4748         kcsan_mb();                              4748         kcsan_mb();
4749         instrument_atomic_read_write(v, sizeo    4749         instrument_atomic_read_write(v, sizeof(*v));
4750         return raw_atomic_long_dec_if_positiv    4750         return raw_atomic_long_dec_if_positive(v);
4751 }                                                4751 }
4752                                                  4752 
4753 #define xchg(ptr, ...) \                         4753 #define xchg(ptr, ...) \
4754 ({ \                                             4754 ({ \
4755         typeof(ptr) __ai_ptr = (ptr); \          4755         typeof(ptr) __ai_ptr = (ptr); \
4756         kcsan_mb(); \                            4756         kcsan_mb(); \
4757         instrument_atomic_read_write(__ai_ptr    4757         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4758         raw_xchg(__ai_ptr, __VA_ARGS__); \       4758         raw_xchg(__ai_ptr, __VA_ARGS__); \
4759 })                                               4759 })
4760                                                  4760 
4761 #define xchg_acquire(ptr, ...) \                 4761 #define xchg_acquire(ptr, ...) \
4762 ({ \                                             4762 ({ \
4763         typeof(ptr) __ai_ptr = (ptr); \          4763         typeof(ptr) __ai_ptr = (ptr); \
4764         instrument_atomic_read_write(__ai_ptr    4764         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4765         raw_xchg_acquire(__ai_ptr, __VA_ARGS_    4765         raw_xchg_acquire(__ai_ptr, __VA_ARGS__); \
4766 })                                               4766 })
4767                                                  4767 
4768 #define xchg_release(ptr, ...) \                 4768 #define xchg_release(ptr, ...) \
4769 ({ \                                             4769 ({ \
4770         typeof(ptr) __ai_ptr = (ptr); \          4770         typeof(ptr) __ai_ptr = (ptr); \
4771         kcsan_release(); \                       4771         kcsan_release(); \
4772         instrument_atomic_read_write(__ai_ptr    4772         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4773         raw_xchg_release(__ai_ptr, __VA_ARGS_    4773         raw_xchg_release(__ai_ptr, __VA_ARGS__); \
4774 })                                               4774 })
4775                                                  4775 
4776 #define xchg_relaxed(ptr, ...) \                 4776 #define xchg_relaxed(ptr, ...) \
4777 ({ \                                             4777 ({ \
4778         typeof(ptr) __ai_ptr = (ptr); \          4778         typeof(ptr) __ai_ptr = (ptr); \
4779         instrument_atomic_read_write(__ai_ptr    4779         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4780         raw_xchg_relaxed(__ai_ptr, __VA_ARGS_    4780         raw_xchg_relaxed(__ai_ptr, __VA_ARGS__); \
4781 })                                               4781 })
4782                                                  4782 
4783 #define cmpxchg(ptr, ...) \                      4783 #define cmpxchg(ptr, ...) \
4784 ({ \                                             4784 ({ \
4785         typeof(ptr) __ai_ptr = (ptr); \          4785         typeof(ptr) __ai_ptr = (ptr); \
4786         kcsan_mb(); \                            4786         kcsan_mb(); \
4787         instrument_atomic_read_write(__ai_ptr    4787         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4788         raw_cmpxchg(__ai_ptr, __VA_ARGS__); \    4788         raw_cmpxchg(__ai_ptr, __VA_ARGS__); \
4789 })                                               4789 })
4790                                                  4790 
4791 #define cmpxchg_acquire(ptr, ...) \              4791 #define cmpxchg_acquire(ptr, ...) \
4792 ({ \                                             4792 ({ \
4793         typeof(ptr) __ai_ptr = (ptr); \          4793         typeof(ptr) __ai_ptr = (ptr); \
4794         instrument_atomic_read_write(__ai_ptr    4794         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4795         raw_cmpxchg_acquire(__ai_ptr, __VA_AR    4795         raw_cmpxchg_acquire(__ai_ptr, __VA_ARGS__); \
4796 })                                               4796 })
4797                                                  4797 
4798 #define cmpxchg_release(ptr, ...) \              4798 #define cmpxchg_release(ptr, ...) \
4799 ({ \                                             4799 ({ \
4800         typeof(ptr) __ai_ptr = (ptr); \          4800         typeof(ptr) __ai_ptr = (ptr); \
4801         kcsan_release(); \                       4801         kcsan_release(); \
4802         instrument_atomic_read_write(__ai_ptr    4802         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4803         raw_cmpxchg_release(__ai_ptr, __VA_AR    4803         raw_cmpxchg_release(__ai_ptr, __VA_ARGS__); \
4804 })                                               4804 })
4805                                                  4805 
4806 #define cmpxchg_relaxed(ptr, ...) \              4806 #define cmpxchg_relaxed(ptr, ...) \
4807 ({ \                                             4807 ({ \
4808         typeof(ptr) __ai_ptr = (ptr); \          4808         typeof(ptr) __ai_ptr = (ptr); \
4809         instrument_atomic_read_write(__ai_ptr    4809         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4810         raw_cmpxchg_relaxed(__ai_ptr, __VA_AR    4810         raw_cmpxchg_relaxed(__ai_ptr, __VA_ARGS__); \
4811 })                                               4811 })
4812                                                  4812 
4813 #define cmpxchg64(ptr, ...) \                    4813 #define cmpxchg64(ptr, ...) \
4814 ({ \                                             4814 ({ \
4815         typeof(ptr) __ai_ptr = (ptr); \          4815         typeof(ptr) __ai_ptr = (ptr); \
4816         kcsan_mb(); \                            4816         kcsan_mb(); \
4817         instrument_atomic_read_write(__ai_ptr    4817         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4818         raw_cmpxchg64(__ai_ptr, __VA_ARGS__);    4818         raw_cmpxchg64(__ai_ptr, __VA_ARGS__); \
4819 })                                               4819 })
4820                                                  4820 
4821 #define cmpxchg64_acquire(ptr, ...) \            4821 #define cmpxchg64_acquire(ptr, ...) \
4822 ({ \                                             4822 ({ \
4823         typeof(ptr) __ai_ptr = (ptr); \          4823         typeof(ptr) __ai_ptr = (ptr); \
4824         instrument_atomic_read_write(__ai_ptr    4824         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4825         raw_cmpxchg64_acquire(__ai_ptr, __VA_    4825         raw_cmpxchg64_acquire(__ai_ptr, __VA_ARGS__); \
4826 })                                               4826 })
4827                                                  4827 
4828 #define cmpxchg64_release(ptr, ...) \            4828 #define cmpxchg64_release(ptr, ...) \
4829 ({ \                                             4829 ({ \
4830         typeof(ptr) __ai_ptr = (ptr); \          4830         typeof(ptr) __ai_ptr = (ptr); \
4831         kcsan_release(); \                       4831         kcsan_release(); \
4832         instrument_atomic_read_write(__ai_ptr    4832         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4833         raw_cmpxchg64_release(__ai_ptr, __VA_    4833         raw_cmpxchg64_release(__ai_ptr, __VA_ARGS__); \
4834 })                                               4834 })
4835                                                  4835 
4836 #define cmpxchg64_relaxed(ptr, ...) \            4836 #define cmpxchg64_relaxed(ptr, ...) \
4837 ({ \                                             4837 ({ \
4838         typeof(ptr) __ai_ptr = (ptr); \          4838         typeof(ptr) __ai_ptr = (ptr); \
4839         instrument_atomic_read_write(__ai_ptr    4839         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4840         raw_cmpxchg64_relaxed(__ai_ptr, __VA_    4840         raw_cmpxchg64_relaxed(__ai_ptr, __VA_ARGS__); \
4841 })                                               4841 })
4842                                                  4842 
4843 #define cmpxchg128(ptr, ...) \                   4843 #define cmpxchg128(ptr, ...) \
4844 ({ \                                             4844 ({ \
4845         typeof(ptr) __ai_ptr = (ptr); \          4845         typeof(ptr) __ai_ptr = (ptr); \
4846         kcsan_mb(); \                            4846         kcsan_mb(); \
4847         instrument_atomic_read_write(__ai_ptr    4847         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4848         raw_cmpxchg128(__ai_ptr, __VA_ARGS__)    4848         raw_cmpxchg128(__ai_ptr, __VA_ARGS__); \
4849 })                                               4849 })
4850                                                  4850 
4851 #define cmpxchg128_acquire(ptr, ...) \           4851 #define cmpxchg128_acquire(ptr, ...) \
4852 ({ \                                             4852 ({ \
4853         typeof(ptr) __ai_ptr = (ptr); \          4853         typeof(ptr) __ai_ptr = (ptr); \
4854         instrument_atomic_read_write(__ai_ptr    4854         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4855         raw_cmpxchg128_acquire(__ai_ptr, __VA    4855         raw_cmpxchg128_acquire(__ai_ptr, __VA_ARGS__); \
4856 })                                               4856 })
4857                                                  4857 
4858 #define cmpxchg128_release(ptr, ...) \           4858 #define cmpxchg128_release(ptr, ...) \
4859 ({ \                                             4859 ({ \
4860         typeof(ptr) __ai_ptr = (ptr); \          4860         typeof(ptr) __ai_ptr = (ptr); \
4861         kcsan_release(); \                       4861         kcsan_release(); \
4862         instrument_atomic_read_write(__ai_ptr    4862         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4863         raw_cmpxchg128_release(__ai_ptr, __VA    4863         raw_cmpxchg128_release(__ai_ptr, __VA_ARGS__); \
4864 })                                               4864 })
4865                                                  4865 
4866 #define cmpxchg128_relaxed(ptr, ...) \           4866 #define cmpxchg128_relaxed(ptr, ...) \
4867 ({ \                                             4867 ({ \
4868         typeof(ptr) __ai_ptr = (ptr); \          4868         typeof(ptr) __ai_ptr = (ptr); \
4869         instrument_atomic_read_write(__ai_ptr    4869         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4870         raw_cmpxchg128_relaxed(__ai_ptr, __VA    4870         raw_cmpxchg128_relaxed(__ai_ptr, __VA_ARGS__); \
4871 })                                               4871 })
4872                                                  4872 
4873 #define try_cmpxchg(ptr, oldp, ...) \            4873 #define try_cmpxchg(ptr, oldp, ...) \
4874 ({ \                                             4874 ({ \
4875         typeof(ptr) __ai_ptr = (ptr); \          4875         typeof(ptr) __ai_ptr = (ptr); \
4876         typeof(oldp) __ai_oldp = (oldp); \       4876         typeof(oldp) __ai_oldp = (oldp); \
4877         kcsan_mb(); \                            4877         kcsan_mb(); \
4878         instrument_atomic_read_write(__ai_ptr    4878         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4879         instrument_read_write(__ai_oldp, size    4879         instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4880         raw_try_cmpxchg(__ai_ptr, __ai_oldp,     4880         raw_try_cmpxchg(__ai_ptr, __ai_oldp, __VA_ARGS__); \
4881 })                                               4881 })
4882                                                  4882 
4883 #define try_cmpxchg_acquire(ptr, oldp, ...) \    4883 #define try_cmpxchg_acquire(ptr, oldp, ...) \
4884 ({ \                                             4884 ({ \
4885         typeof(ptr) __ai_ptr = (ptr); \          4885         typeof(ptr) __ai_ptr = (ptr); \
4886         typeof(oldp) __ai_oldp = (oldp); \       4886         typeof(oldp) __ai_oldp = (oldp); \
4887         instrument_atomic_read_write(__ai_ptr    4887         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4888         instrument_read_write(__ai_oldp, size    4888         instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4889         raw_try_cmpxchg_acquire(__ai_ptr, __a    4889         raw_try_cmpxchg_acquire(__ai_ptr, __ai_oldp, __VA_ARGS__); \
4890 })                                               4890 })
4891                                                  4891 
4892 #define try_cmpxchg_release(ptr, oldp, ...) \    4892 #define try_cmpxchg_release(ptr, oldp, ...) \
4893 ({ \                                             4893 ({ \
4894         typeof(ptr) __ai_ptr = (ptr); \          4894         typeof(ptr) __ai_ptr = (ptr); \
4895         typeof(oldp) __ai_oldp = (oldp); \       4895         typeof(oldp) __ai_oldp = (oldp); \
4896         kcsan_release(); \                       4896         kcsan_release(); \
4897         instrument_atomic_read_write(__ai_ptr    4897         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4898         instrument_read_write(__ai_oldp, size    4898         instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4899         raw_try_cmpxchg_release(__ai_ptr, __a    4899         raw_try_cmpxchg_release(__ai_ptr, __ai_oldp, __VA_ARGS__); \
4900 })                                               4900 })
4901                                                  4901 
4902 #define try_cmpxchg_relaxed(ptr, oldp, ...) \    4902 #define try_cmpxchg_relaxed(ptr, oldp, ...) \
4903 ({ \                                             4903 ({ \
4904         typeof(ptr) __ai_ptr = (ptr); \          4904         typeof(ptr) __ai_ptr = (ptr); \
4905         typeof(oldp) __ai_oldp = (oldp); \       4905         typeof(oldp) __ai_oldp = (oldp); \
4906         instrument_atomic_read_write(__ai_ptr    4906         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4907         instrument_read_write(__ai_oldp, size    4907         instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4908         raw_try_cmpxchg_relaxed(__ai_ptr, __a    4908         raw_try_cmpxchg_relaxed(__ai_ptr, __ai_oldp, __VA_ARGS__); \
4909 })                                               4909 })
4910                                                  4910 
4911 #define try_cmpxchg64(ptr, oldp, ...) \          4911 #define try_cmpxchg64(ptr, oldp, ...) \
4912 ({ \                                             4912 ({ \
4913         typeof(ptr) __ai_ptr = (ptr); \          4913         typeof(ptr) __ai_ptr = (ptr); \
4914         typeof(oldp) __ai_oldp = (oldp); \       4914         typeof(oldp) __ai_oldp = (oldp); \
4915         kcsan_mb(); \                            4915         kcsan_mb(); \
4916         instrument_atomic_read_write(__ai_ptr    4916         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4917         instrument_read_write(__ai_oldp, size    4917         instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4918         raw_try_cmpxchg64(__ai_ptr, __ai_oldp    4918         raw_try_cmpxchg64(__ai_ptr, __ai_oldp, __VA_ARGS__); \
4919 })                                               4919 })
4920                                                  4920 
4921 #define try_cmpxchg64_acquire(ptr, oldp, ...)    4921 #define try_cmpxchg64_acquire(ptr, oldp, ...) \
4922 ({ \                                             4922 ({ \
4923         typeof(ptr) __ai_ptr = (ptr); \          4923         typeof(ptr) __ai_ptr = (ptr); \
4924         typeof(oldp) __ai_oldp = (oldp); \       4924         typeof(oldp) __ai_oldp = (oldp); \
4925         instrument_atomic_read_write(__ai_ptr    4925         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4926         instrument_read_write(__ai_oldp, size    4926         instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4927         raw_try_cmpxchg64_acquire(__ai_ptr, _    4927         raw_try_cmpxchg64_acquire(__ai_ptr, __ai_oldp, __VA_ARGS__); \
4928 })                                               4928 })
4929                                                  4929 
4930 #define try_cmpxchg64_release(ptr, oldp, ...)    4930 #define try_cmpxchg64_release(ptr, oldp, ...) \
4931 ({ \                                             4931 ({ \
4932         typeof(ptr) __ai_ptr = (ptr); \          4932         typeof(ptr) __ai_ptr = (ptr); \
4933         typeof(oldp) __ai_oldp = (oldp); \       4933         typeof(oldp) __ai_oldp = (oldp); \
4934         kcsan_release(); \                       4934         kcsan_release(); \
4935         instrument_atomic_read_write(__ai_ptr    4935         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4936         instrument_read_write(__ai_oldp, size    4936         instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4937         raw_try_cmpxchg64_release(__ai_ptr, _    4937         raw_try_cmpxchg64_release(__ai_ptr, __ai_oldp, __VA_ARGS__); \
4938 })                                               4938 })
4939                                                  4939 
4940 #define try_cmpxchg64_relaxed(ptr, oldp, ...)    4940 #define try_cmpxchg64_relaxed(ptr, oldp, ...) \
4941 ({ \                                             4941 ({ \
4942         typeof(ptr) __ai_ptr = (ptr); \          4942         typeof(ptr) __ai_ptr = (ptr); \
4943         typeof(oldp) __ai_oldp = (oldp); \       4943         typeof(oldp) __ai_oldp = (oldp); \
4944         instrument_atomic_read_write(__ai_ptr    4944         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4945         instrument_read_write(__ai_oldp, size    4945         instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4946         raw_try_cmpxchg64_relaxed(__ai_ptr, _    4946         raw_try_cmpxchg64_relaxed(__ai_ptr, __ai_oldp, __VA_ARGS__); \
4947 })                                               4947 })
4948                                                  4948 
4949 #define try_cmpxchg128(ptr, oldp, ...) \         4949 #define try_cmpxchg128(ptr, oldp, ...) \
4950 ({ \                                             4950 ({ \
4951         typeof(ptr) __ai_ptr = (ptr); \          4951         typeof(ptr) __ai_ptr = (ptr); \
4952         typeof(oldp) __ai_oldp = (oldp); \       4952         typeof(oldp) __ai_oldp = (oldp); \
4953         kcsan_mb(); \                            4953         kcsan_mb(); \
4954         instrument_atomic_read_write(__ai_ptr    4954         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4955         instrument_read_write(__ai_oldp, size    4955         instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4956         raw_try_cmpxchg128(__ai_ptr, __ai_old    4956         raw_try_cmpxchg128(__ai_ptr, __ai_oldp, __VA_ARGS__); \
4957 })                                               4957 })
4958                                                  4958 
4959 #define try_cmpxchg128_acquire(ptr, oldp, ...    4959 #define try_cmpxchg128_acquire(ptr, oldp, ...) \
4960 ({ \                                             4960 ({ \
4961         typeof(ptr) __ai_ptr = (ptr); \          4961         typeof(ptr) __ai_ptr = (ptr); \
4962         typeof(oldp) __ai_oldp = (oldp); \       4962         typeof(oldp) __ai_oldp = (oldp); \
4963         instrument_atomic_read_write(__ai_ptr    4963         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4964         instrument_read_write(__ai_oldp, size    4964         instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4965         raw_try_cmpxchg128_acquire(__ai_ptr,     4965         raw_try_cmpxchg128_acquire(__ai_ptr, __ai_oldp, __VA_ARGS__); \
4966 })                                               4966 })
4967                                                  4967 
4968 #define try_cmpxchg128_release(ptr, oldp, ...    4968 #define try_cmpxchg128_release(ptr, oldp, ...) \
4969 ({ \                                             4969 ({ \
4970         typeof(ptr) __ai_ptr = (ptr); \          4970         typeof(ptr) __ai_ptr = (ptr); \
4971         typeof(oldp) __ai_oldp = (oldp); \       4971         typeof(oldp) __ai_oldp = (oldp); \
4972         kcsan_release(); \                       4972         kcsan_release(); \
4973         instrument_atomic_read_write(__ai_ptr    4973         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4974         instrument_read_write(__ai_oldp, size    4974         instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4975         raw_try_cmpxchg128_release(__ai_ptr,     4975         raw_try_cmpxchg128_release(__ai_ptr, __ai_oldp, __VA_ARGS__); \
4976 })                                               4976 })
4977                                                  4977 
4978 #define try_cmpxchg128_relaxed(ptr, oldp, ...    4978 #define try_cmpxchg128_relaxed(ptr, oldp, ...) \
4979 ({ \                                             4979 ({ \
4980         typeof(ptr) __ai_ptr = (ptr); \          4980         typeof(ptr) __ai_ptr = (ptr); \
4981         typeof(oldp) __ai_oldp = (oldp); \       4981         typeof(oldp) __ai_oldp = (oldp); \
4982         instrument_atomic_read_write(__ai_ptr    4982         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4983         instrument_read_write(__ai_oldp, size    4983         instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4984         raw_try_cmpxchg128_relaxed(__ai_ptr,     4984         raw_try_cmpxchg128_relaxed(__ai_ptr, __ai_oldp, __VA_ARGS__); \
4985 })                                               4985 })
4986                                                  4986 
4987 #define cmpxchg_local(ptr, ...) \                4987 #define cmpxchg_local(ptr, ...) \
4988 ({ \                                             4988 ({ \
4989         typeof(ptr) __ai_ptr = (ptr); \          4989         typeof(ptr) __ai_ptr = (ptr); \
4990         instrument_atomic_read_write(__ai_ptr    4990         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4991         raw_cmpxchg_local(__ai_ptr, __VA_ARGS    4991         raw_cmpxchg_local(__ai_ptr, __VA_ARGS__); \
4992 })                                               4992 })
4993                                                  4993 
4994 #define cmpxchg64_local(ptr, ...) \              4994 #define cmpxchg64_local(ptr, ...) \
4995 ({ \                                             4995 ({ \
4996         typeof(ptr) __ai_ptr = (ptr); \          4996         typeof(ptr) __ai_ptr = (ptr); \
4997         instrument_atomic_read_write(__ai_ptr    4997         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4998         raw_cmpxchg64_local(__ai_ptr, __VA_AR    4998         raw_cmpxchg64_local(__ai_ptr, __VA_ARGS__); \
4999 })                                               4999 })
5000                                                  5000 
5001 #define cmpxchg128_local(ptr, ...) \             5001 #define cmpxchg128_local(ptr, ...) \
5002 ({ \                                             5002 ({ \
5003         typeof(ptr) __ai_ptr = (ptr); \          5003         typeof(ptr) __ai_ptr = (ptr); \
5004         instrument_atomic_read_write(__ai_ptr    5004         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
5005         raw_cmpxchg128_local(__ai_ptr, __VA_A    5005         raw_cmpxchg128_local(__ai_ptr, __VA_ARGS__); \
5006 })                                               5006 })
5007                                                  5007 
5008 #define sync_cmpxchg(ptr, ...) \                 5008 #define sync_cmpxchg(ptr, ...) \
5009 ({ \                                             5009 ({ \
5010         typeof(ptr) __ai_ptr = (ptr); \          5010         typeof(ptr) __ai_ptr = (ptr); \
5011         kcsan_mb(); \                            5011         kcsan_mb(); \
5012         instrument_atomic_read_write(__ai_ptr    5012         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
5013         raw_sync_cmpxchg(__ai_ptr, __VA_ARGS_    5013         raw_sync_cmpxchg(__ai_ptr, __VA_ARGS__); \
5014 })                                               5014 })
5015                                                  5015 
5016 #define try_cmpxchg_local(ptr, oldp, ...) \      5016 #define try_cmpxchg_local(ptr, oldp, ...) \
5017 ({ \                                             5017 ({ \
5018         typeof(ptr) __ai_ptr = (ptr); \          5018         typeof(ptr) __ai_ptr = (ptr); \
5019         typeof(oldp) __ai_oldp = (oldp); \       5019         typeof(oldp) __ai_oldp = (oldp); \
5020         instrument_atomic_read_write(__ai_ptr    5020         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
5021         instrument_read_write(__ai_oldp, size    5021         instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
5022         raw_try_cmpxchg_local(__ai_ptr, __ai_    5022         raw_try_cmpxchg_local(__ai_ptr, __ai_oldp, __VA_ARGS__); \
5023 })                                               5023 })
5024                                                  5024 
5025 #define try_cmpxchg64_local(ptr, oldp, ...) \    5025 #define try_cmpxchg64_local(ptr, oldp, ...) \
5026 ({ \                                             5026 ({ \
5027         typeof(ptr) __ai_ptr = (ptr); \          5027         typeof(ptr) __ai_ptr = (ptr); \
5028         typeof(oldp) __ai_oldp = (oldp); \       5028         typeof(oldp) __ai_oldp = (oldp); \
5029         instrument_atomic_read_write(__ai_ptr    5029         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
5030         instrument_read_write(__ai_oldp, size    5030         instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
5031         raw_try_cmpxchg64_local(__ai_ptr, __a    5031         raw_try_cmpxchg64_local(__ai_ptr, __ai_oldp, __VA_ARGS__); \
5032 })                                               5032 })
5033                                                  5033 
5034 #define try_cmpxchg128_local(ptr, oldp, ...)     5034 #define try_cmpxchg128_local(ptr, oldp, ...) \
5035 ({ \                                             5035 ({ \
5036         typeof(ptr) __ai_ptr = (ptr); \          5036         typeof(ptr) __ai_ptr = (ptr); \
5037         typeof(oldp) __ai_oldp = (oldp); \       5037         typeof(oldp) __ai_oldp = (oldp); \
5038         instrument_atomic_read_write(__ai_ptr    5038         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
5039         instrument_read_write(__ai_oldp, size    5039         instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
5040         raw_try_cmpxchg128_local(__ai_ptr, __    5040         raw_try_cmpxchg128_local(__ai_ptr, __ai_oldp, __VA_ARGS__); \
5041 })                                               5041 })
5042                                                  5042 
5043 #define sync_try_cmpxchg(ptr, ...) \             5043 #define sync_try_cmpxchg(ptr, ...) \
5044 ({ \                                             5044 ({ \
5045         typeof(ptr) __ai_ptr = (ptr); \          5045         typeof(ptr) __ai_ptr = (ptr); \
5046         kcsan_mb(); \                            5046         kcsan_mb(); \
5047         instrument_atomic_read_write(__ai_ptr    5047         instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
5048         raw_sync_try_cmpxchg(__ai_ptr, __VA_A    5048         raw_sync_try_cmpxchg(__ai_ptr, __VA_ARGS__); \
5049 })                                               5049 })
5050                                                  5050 
5051                                                  5051 
5052 #endif /* _LINUX_ATOMIC_INSTRUMENTED_H */        5052 #endif /* _LINUX_ATOMIC_INSTRUMENTED_H */
5053 // 8829b337928e9508259079d32581775ececd415b      5053 // 8829b337928e9508259079d32581775ececd415b
5054                                                  5054 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php