locking/barriers, kcsan: Support generic instrumentation
[linux-block.git] / include / linux / atomic / atomic-instrumented.h
CommitLineData
aa525d06
MR
1// SPDX-License-Identifier: GPL-2.0
2
3// Generated by scripts/atomic/gen-atomic-instrumented.sh
4// DO NOT MODIFY THIS FILE DIRECTLY
5
ac605bee
DV
6/*
7 * This file provides wrappers with KASAN instrumentation for atomic operations.
8 * To use this functionality an arch's atomic.h file needs to define all
9 * atomic operations with arch_ prefix (e.g. arch_atomic_read()) and include
10 * this file at the end. This file provides atomic_read() that forwards to
11 * arch_atomic_read() for actual atomic operation.
12 * Note: if an arch atomic operation is implemented by means of other atomic
13 * operations (e.g. atomic_read()/atomic_cmpxchg() loop), then it needs to use
14 * arch_ variants (i.e. arch_atomic_read()/arch_atomic_cmpxchg()) to avoid
15 * double instrumentation.
16 */
e3d18cee
MR
17#ifndef _LINUX_ATOMIC_INSTRUMENTED_H
18#define _LINUX_ATOMIC_INSTRUMENTED_H
aa525d06
MR
19
20#include <linux/build_bug.h>
c020395b 21#include <linux/compiler.h>
ed8af2e4 22#include <linux/instrumented.h>
aa525d06 23
c020395b 24static __always_inline int
aa525d06
MR
25atomic_read(const atomic_t *v)
26{
ed8af2e4 27 instrument_atomic_read(v, sizeof(*v));
aa525d06
MR
28 return arch_atomic_read(v);
29}
aa525d06 30
c020395b 31static __always_inline int
aa525d06
MR
32atomic_read_acquire(const atomic_t *v)
33{
ed8af2e4 34 instrument_atomic_read(v, sizeof(*v));
aa525d06
MR
35 return arch_atomic_read_acquire(v);
36}
aa525d06 37
c020395b 38static __always_inline void
aa525d06
MR
39atomic_set(atomic_t *v, int i)
40{
ed8af2e4 41 instrument_atomic_write(v, sizeof(*v));
aa525d06
MR
42 arch_atomic_set(v, i);
43}
aa525d06 44
c020395b 45static __always_inline void
aa525d06
MR
46atomic_set_release(atomic_t *v, int i)
47{
ed8af2e4 48 instrument_atomic_write(v, sizeof(*v));
aa525d06
MR
49 arch_atomic_set_release(v, i);
50}
aa525d06 51
c020395b 52static __always_inline void
aa525d06
MR
53atomic_add(int i, atomic_t *v)
54{
3570a1bc 55 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
56 arch_atomic_add(i, v);
57}
aa525d06 58
c020395b 59static __always_inline int
aa525d06
MR
60atomic_add_return(int i, atomic_t *v)
61{
3570a1bc 62 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
63 return arch_atomic_add_return(i, v);
64}
aa525d06 65
c020395b 66static __always_inline int
aa525d06
MR
67atomic_add_return_acquire(int i, atomic_t *v)
68{
3570a1bc 69 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
70 return arch_atomic_add_return_acquire(i, v);
71}
aa525d06 72
c020395b 73static __always_inline int
aa525d06
MR
74atomic_add_return_release(int i, atomic_t *v)
75{
3570a1bc 76 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
77 return arch_atomic_add_return_release(i, v);
78}
aa525d06 79
c020395b 80static __always_inline int
aa525d06
MR
81atomic_add_return_relaxed(int i, atomic_t *v)
82{
3570a1bc 83 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
84 return arch_atomic_add_return_relaxed(i, v);
85}
aa525d06 86
c020395b 87static __always_inline int
aa525d06
MR
88atomic_fetch_add(int i, atomic_t *v)
89{
3570a1bc 90 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
91 return arch_atomic_fetch_add(i, v);
92}
aa525d06 93
c020395b 94static __always_inline int
aa525d06
MR
95atomic_fetch_add_acquire(int i, atomic_t *v)
96{
3570a1bc 97 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
98 return arch_atomic_fetch_add_acquire(i, v);
99}
aa525d06 100
c020395b 101static __always_inline int
aa525d06
MR
102atomic_fetch_add_release(int i, atomic_t *v)
103{
3570a1bc 104 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
105 return arch_atomic_fetch_add_release(i, v);
106}
aa525d06 107
c020395b 108static __always_inline int
aa525d06
MR
109atomic_fetch_add_relaxed(int i, atomic_t *v)
110{
3570a1bc 111 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
112 return arch_atomic_fetch_add_relaxed(i, v);
113}
aa525d06 114
c020395b 115static __always_inline void
aa525d06
MR
116atomic_sub(int i, atomic_t *v)
117{
3570a1bc 118 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
119 arch_atomic_sub(i, v);
120}
aa525d06 121
c020395b 122static __always_inline int
aa525d06
MR
123atomic_sub_return(int i, atomic_t *v)
124{
3570a1bc 125 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
126 return arch_atomic_sub_return(i, v);
127}
aa525d06 128
c020395b 129static __always_inline int
aa525d06
MR
130atomic_sub_return_acquire(int i, atomic_t *v)
131{
3570a1bc 132 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
133 return arch_atomic_sub_return_acquire(i, v);
134}
aa525d06 135
c020395b 136static __always_inline int
aa525d06
MR
137atomic_sub_return_release(int i, atomic_t *v)
138{
3570a1bc 139 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
140 return arch_atomic_sub_return_release(i, v);
141}
aa525d06 142
c020395b 143static __always_inline int
aa525d06
MR
144atomic_sub_return_relaxed(int i, atomic_t *v)
145{
3570a1bc 146 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
147 return arch_atomic_sub_return_relaxed(i, v);
148}
aa525d06 149
c020395b 150static __always_inline int
aa525d06
MR
151atomic_fetch_sub(int i, atomic_t *v)
152{
3570a1bc 153 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
154 return arch_atomic_fetch_sub(i, v);
155}
aa525d06 156
c020395b 157static __always_inline int
aa525d06
MR
158atomic_fetch_sub_acquire(int i, atomic_t *v)
159{
3570a1bc 160 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
161 return arch_atomic_fetch_sub_acquire(i, v);
162}
aa525d06 163
c020395b 164static __always_inline int
aa525d06
MR
165atomic_fetch_sub_release(int i, atomic_t *v)
166{
3570a1bc 167 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
168 return arch_atomic_fetch_sub_release(i, v);
169}
aa525d06 170
c020395b 171static __always_inline int
aa525d06
MR
172atomic_fetch_sub_relaxed(int i, atomic_t *v)
173{
3570a1bc 174 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
175 return arch_atomic_fetch_sub_relaxed(i, v);
176}
aa525d06 177
c020395b 178static __always_inline void
aa525d06
MR
179atomic_inc(atomic_t *v)
180{
3570a1bc 181 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
182 arch_atomic_inc(v);
183}
aa525d06 184
c020395b 185static __always_inline int
aa525d06
MR
186atomic_inc_return(atomic_t *v)
187{
3570a1bc 188 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
189 return arch_atomic_inc_return(v);
190}
aa525d06 191
c020395b 192static __always_inline int
aa525d06
MR
193atomic_inc_return_acquire(atomic_t *v)
194{
3570a1bc 195 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
196 return arch_atomic_inc_return_acquire(v);
197}
aa525d06 198
c020395b 199static __always_inline int
aa525d06
MR
200atomic_inc_return_release(atomic_t *v)
201{
3570a1bc 202 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
203 return arch_atomic_inc_return_release(v);
204}
aa525d06 205
c020395b 206static __always_inline int
aa525d06
MR
207atomic_inc_return_relaxed(atomic_t *v)
208{
3570a1bc 209 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
210 return arch_atomic_inc_return_relaxed(v);
211}
aa525d06 212
c020395b 213static __always_inline int
aa525d06
MR
214atomic_fetch_inc(atomic_t *v)
215{
3570a1bc 216 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
217 return arch_atomic_fetch_inc(v);
218}
aa525d06 219
c020395b 220static __always_inline int
aa525d06
MR
221atomic_fetch_inc_acquire(atomic_t *v)
222{
3570a1bc 223 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
224 return arch_atomic_fetch_inc_acquire(v);
225}
aa525d06 226
c020395b 227static __always_inline int
aa525d06
MR
228atomic_fetch_inc_release(atomic_t *v)
229{
3570a1bc 230 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
231 return arch_atomic_fetch_inc_release(v);
232}
aa525d06 233
c020395b 234static __always_inline int
aa525d06
MR
235atomic_fetch_inc_relaxed(atomic_t *v)
236{
3570a1bc 237 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
238 return arch_atomic_fetch_inc_relaxed(v);
239}
aa525d06 240
c020395b 241static __always_inline void
aa525d06
MR
242atomic_dec(atomic_t *v)
243{
3570a1bc 244 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
245 arch_atomic_dec(v);
246}
aa525d06 247
c020395b 248static __always_inline int
aa525d06
MR
249atomic_dec_return(atomic_t *v)
250{
3570a1bc 251 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
252 return arch_atomic_dec_return(v);
253}
aa525d06 254
c020395b 255static __always_inline int
aa525d06
MR
256atomic_dec_return_acquire(atomic_t *v)
257{
3570a1bc 258 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
259 return arch_atomic_dec_return_acquire(v);
260}
aa525d06 261
c020395b 262static __always_inline int
aa525d06
MR
263atomic_dec_return_release(atomic_t *v)
264{
3570a1bc 265 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
266 return arch_atomic_dec_return_release(v);
267}
aa525d06 268
c020395b 269static __always_inline int
aa525d06
MR
270atomic_dec_return_relaxed(atomic_t *v)
271{
3570a1bc 272 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
273 return arch_atomic_dec_return_relaxed(v);
274}
aa525d06 275
c020395b 276static __always_inline int
aa525d06
MR
277atomic_fetch_dec(atomic_t *v)
278{
3570a1bc 279 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
280 return arch_atomic_fetch_dec(v);
281}
aa525d06 282
c020395b 283static __always_inline int
aa525d06
MR
284atomic_fetch_dec_acquire(atomic_t *v)
285{
3570a1bc 286 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
287 return arch_atomic_fetch_dec_acquire(v);
288}
aa525d06 289
c020395b 290static __always_inline int
aa525d06
MR
291atomic_fetch_dec_release(atomic_t *v)
292{
3570a1bc 293 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
294 return arch_atomic_fetch_dec_release(v);
295}
aa525d06 296
c020395b 297static __always_inline int
aa525d06
MR
298atomic_fetch_dec_relaxed(atomic_t *v)
299{
3570a1bc 300 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
301 return arch_atomic_fetch_dec_relaxed(v);
302}
aa525d06 303
c020395b 304static __always_inline void
aa525d06
MR
305atomic_and(int i, atomic_t *v)
306{
3570a1bc 307 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
308 arch_atomic_and(i, v);
309}
aa525d06 310
c020395b 311static __always_inline int
aa525d06
MR
312atomic_fetch_and(int i, atomic_t *v)
313{
3570a1bc 314 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
315 return arch_atomic_fetch_and(i, v);
316}
aa525d06 317
c020395b 318static __always_inline int
aa525d06
MR
319atomic_fetch_and_acquire(int i, atomic_t *v)
320{
3570a1bc 321 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
322 return arch_atomic_fetch_and_acquire(i, v);
323}
aa525d06 324
c020395b 325static __always_inline int
aa525d06
MR
326atomic_fetch_and_release(int i, atomic_t *v)
327{
3570a1bc 328 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
329 return arch_atomic_fetch_and_release(i, v);
330}
aa525d06 331
c020395b 332static __always_inline int
aa525d06
MR
333atomic_fetch_and_relaxed(int i, atomic_t *v)
334{
3570a1bc 335 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
336 return arch_atomic_fetch_and_relaxed(i, v);
337}
aa525d06 338
c020395b 339static __always_inline void
aa525d06
MR
340atomic_andnot(int i, atomic_t *v)
341{
3570a1bc 342 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
343 arch_atomic_andnot(i, v);
344}
aa525d06 345
c020395b 346static __always_inline int
aa525d06
MR
347atomic_fetch_andnot(int i, atomic_t *v)
348{
3570a1bc 349 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
350 return arch_atomic_fetch_andnot(i, v);
351}
aa525d06 352
c020395b 353static __always_inline int
aa525d06
MR
354atomic_fetch_andnot_acquire(int i, atomic_t *v)
355{
3570a1bc 356 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
357 return arch_atomic_fetch_andnot_acquire(i, v);
358}
aa525d06 359
c020395b 360static __always_inline int
aa525d06
MR
361atomic_fetch_andnot_release(int i, atomic_t *v)
362{
3570a1bc 363 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
364 return arch_atomic_fetch_andnot_release(i, v);
365}
aa525d06 366
c020395b 367static __always_inline int
aa525d06
MR
368atomic_fetch_andnot_relaxed(int i, atomic_t *v)
369{
3570a1bc 370 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
371 return arch_atomic_fetch_andnot_relaxed(i, v);
372}
aa525d06 373
c020395b 374static __always_inline void
aa525d06
MR
375atomic_or(int i, atomic_t *v)
376{
3570a1bc 377 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
378 arch_atomic_or(i, v);
379}
aa525d06 380
c020395b 381static __always_inline int
aa525d06
MR
382atomic_fetch_or(int i, atomic_t *v)
383{
3570a1bc 384 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
385 return arch_atomic_fetch_or(i, v);
386}
aa525d06 387
c020395b 388static __always_inline int
aa525d06
MR
389atomic_fetch_or_acquire(int i, atomic_t *v)
390{
3570a1bc 391 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
392 return arch_atomic_fetch_or_acquire(i, v);
393}
aa525d06 394
c020395b 395static __always_inline int
aa525d06
MR
396atomic_fetch_or_release(int i, atomic_t *v)
397{
3570a1bc 398 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
399 return arch_atomic_fetch_or_release(i, v);
400}
aa525d06 401
c020395b 402static __always_inline int
aa525d06
MR
403atomic_fetch_or_relaxed(int i, atomic_t *v)
404{
3570a1bc 405 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
406 return arch_atomic_fetch_or_relaxed(i, v);
407}
aa525d06 408
c020395b 409static __always_inline void
aa525d06
MR
410atomic_xor(int i, atomic_t *v)
411{
3570a1bc 412 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
413 arch_atomic_xor(i, v);
414}
aa525d06 415
c020395b 416static __always_inline int
aa525d06
MR
417atomic_fetch_xor(int i, atomic_t *v)
418{
3570a1bc 419 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
420 return arch_atomic_fetch_xor(i, v);
421}
aa525d06 422
c020395b 423static __always_inline int
aa525d06
MR
424atomic_fetch_xor_acquire(int i, atomic_t *v)
425{
3570a1bc 426 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
427 return arch_atomic_fetch_xor_acquire(i, v);
428}
aa525d06 429
c020395b 430static __always_inline int
aa525d06
MR
431atomic_fetch_xor_release(int i, atomic_t *v)
432{
3570a1bc 433 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
434 return arch_atomic_fetch_xor_release(i, v);
435}
aa525d06 436
c020395b 437static __always_inline int
aa525d06
MR
438atomic_fetch_xor_relaxed(int i, atomic_t *v)
439{
3570a1bc 440 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
441 return arch_atomic_fetch_xor_relaxed(i, v);
442}
aa525d06 443
c020395b 444static __always_inline int
aa525d06
MR
445atomic_xchg(atomic_t *v, int i)
446{
3570a1bc 447 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
448 return arch_atomic_xchg(v, i);
449}
aa525d06 450
c020395b 451static __always_inline int
aa525d06
MR
452atomic_xchg_acquire(atomic_t *v, int i)
453{
3570a1bc 454 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
455 return arch_atomic_xchg_acquire(v, i);
456}
aa525d06 457
c020395b 458static __always_inline int
aa525d06
MR
459atomic_xchg_release(atomic_t *v, int i)
460{
3570a1bc 461 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
462 return arch_atomic_xchg_release(v, i);
463}
aa525d06 464
c020395b 465static __always_inline int
aa525d06
MR
466atomic_xchg_relaxed(atomic_t *v, int i)
467{
3570a1bc 468 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
469 return arch_atomic_xchg_relaxed(v, i);
470}
aa525d06 471
c020395b 472static __always_inline int
aa525d06
MR
473atomic_cmpxchg(atomic_t *v, int old, int new)
474{
3570a1bc 475 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
476 return arch_atomic_cmpxchg(v, old, new);
477}
aa525d06 478
c020395b 479static __always_inline int
aa525d06
MR
480atomic_cmpxchg_acquire(atomic_t *v, int old, int new)
481{
3570a1bc 482 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
483 return arch_atomic_cmpxchg_acquire(v, old, new);
484}
aa525d06 485
c020395b 486static __always_inline int
aa525d06
MR
487atomic_cmpxchg_release(atomic_t *v, int old, int new)
488{
3570a1bc 489 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
490 return arch_atomic_cmpxchg_release(v, old, new);
491}
aa525d06 492
c020395b 493static __always_inline int
aa525d06
MR
494atomic_cmpxchg_relaxed(atomic_t *v, int old, int new)
495{
3570a1bc 496 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
497 return arch_atomic_cmpxchg_relaxed(v, old, new);
498}
aa525d06 499
c020395b 500static __always_inline bool
aa525d06
MR
501atomic_try_cmpxchg(atomic_t *v, int *old, int new)
502{
3570a1bc
ME
503 instrument_atomic_read_write(v, sizeof(*v));
504 instrument_atomic_read_write(old, sizeof(*old));
aa525d06
MR
505 return arch_atomic_try_cmpxchg(v, old, new);
506}
aa525d06 507
c020395b 508static __always_inline bool
aa525d06
MR
509atomic_try_cmpxchg_acquire(atomic_t *v, int *old, int new)
510{
3570a1bc
ME
511 instrument_atomic_read_write(v, sizeof(*v));
512 instrument_atomic_read_write(old, sizeof(*old));
aa525d06
MR
513 return arch_atomic_try_cmpxchg_acquire(v, old, new);
514}
aa525d06 515
c020395b 516static __always_inline bool
aa525d06
MR
517atomic_try_cmpxchg_release(atomic_t *v, int *old, int new)
518{
3570a1bc
ME
519 instrument_atomic_read_write(v, sizeof(*v));
520 instrument_atomic_read_write(old, sizeof(*old));
aa525d06
MR
521 return arch_atomic_try_cmpxchg_release(v, old, new);
522}
aa525d06 523
c020395b 524static __always_inline bool
aa525d06
MR
525atomic_try_cmpxchg_relaxed(atomic_t *v, int *old, int new)
526{
3570a1bc
ME
527 instrument_atomic_read_write(v, sizeof(*v));
528 instrument_atomic_read_write(old, sizeof(*old));
aa525d06
MR
529 return arch_atomic_try_cmpxchg_relaxed(v, old, new);
530}
aa525d06 531
c020395b 532static __always_inline bool
aa525d06
MR
533atomic_sub_and_test(int i, atomic_t *v)
534{
3570a1bc 535 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
536 return arch_atomic_sub_and_test(i, v);
537}
aa525d06 538
c020395b 539static __always_inline bool
aa525d06
MR
540atomic_dec_and_test(atomic_t *v)
541{
3570a1bc 542 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
543 return arch_atomic_dec_and_test(v);
544}
aa525d06 545
c020395b 546static __always_inline bool
aa525d06
MR
547atomic_inc_and_test(atomic_t *v)
548{
3570a1bc 549 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
550 return arch_atomic_inc_and_test(v);
551}
aa525d06 552
c020395b 553static __always_inline bool
aa525d06
MR
554atomic_add_negative(int i, atomic_t *v)
555{
3570a1bc 556 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
557 return arch_atomic_add_negative(i, v);
558}
aa525d06 559
c020395b 560static __always_inline int
aa525d06
MR
561atomic_fetch_add_unless(atomic_t *v, int a, int u)
562{
3570a1bc 563 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
564 return arch_atomic_fetch_add_unless(v, a, u);
565}
aa525d06 566
c020395b 567static __always_inline bool
aa525d06
MR
568atomic_add_unless(atomic_t *v, int a, int u)
569{
3570a1bc 570 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
571 return arch_atomic_add_unless(v, a, u);
572}
aa525d06 573
c020395b 574static __always_inline bool
aa525d06
MR
575atomic_inc_not_zero(atomic_t *v)
576{
3570a1bc 577 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
578 return arch_atomic_inc_not_zero(v);
579}
aa525d06 580
c020395b 581static __always_inline bool
aa525d06
MR
582atomic_inc_unless_negative(atomic_t *v)
583{
3570a1bc 584 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
585 return arch_atomic_inc_unless_negative(v);
586}
aa525d06 587
c020395b 588static __always_inline bool
aa525d06
MR
589atomic_dec_unless_positive(atomic_t *v)
590{
3570a1bc 591 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
592 return arch_atomic_dec_unless_positive(v);
593}
aa525d06 594
c020395b 595static __always_inline int
aa525d06
MR
596atomic_dec_if_positive(atomic_t *v)
597{
3570a1bc 598 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
599 return arch_atomic_dec_if_positive(v);
600}
aa525d06 601
c020395b 602static __always_inline s64
aa525d06
MR
603atomic64_read(const atomic64_t *v)
604{
ed8af2e4 605 instrument_atomic_read(v, sizeof(*v));
aa525d06
MR
606 return arch_atomic64_read(v);
607}
aa525d06 608
c020395b 609static __always_inline s64
aa525d06
MR
610atomic64_read_acquire(const atomic64_t *v)
611{
ed8af2e4 612 instrument_atomic_read(v, sizeof(*v));
aa525d06
MR
613 return arch_atomic64_read_acquire(v);
614}
aa525d06 615
c020395b 616static __always_inline void
aa525d06
MR
617atomic64_set(atomic64_t *v, s64 i)
618{
ed8af2e4 619 instrument_atomic_write(v, sizeof(*v));
aa525d06
MR
620 arch_atomic64_set(v, i);
621}
aa525d06 622
c020395b 623static __always_inline void
aa525d06
MR
624atomic64_set_release(atomic64_t *v, s64 i)
625{
ed8af2e4 626 instrument_atomic_write(v, sizeof(*v));
aa525d06
MR
627 arch_atomic64_set_release(v, i);
628}
aa525d06 629
c020395b 630static __always_inline void
aa525d06
MR
631atomic64_add(s64 i, atomic64_t *v)
632{
3570a1bc 633 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
634 arch_atomic64_add(i, v);
635}
aa525d06 636
c020395b 637static __always_inline s64
aa525d06
MR
638atomic64_add_return(s64 i, atomic64_t *v)
639{
3570a1bc 640 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
641 return arch_atomic64_add_return(i, v);
642}
aa525d06 643
c020395b 644static __always_inline s64
aa525d06
MR
645atomic64_add_return_acquire(s64 i, atomic64_t *v)
646{
3570a1bc 647 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
648 return arch_atomic64_add_return_acquire(i, v);
649}
aa525d06 650
c020395b 651static __always_inline s64
aa525d06
MR
652atomic64_add_return_release(s64 i, atomic64_t *v)
653{
3570a1bc 654 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
655 return arch_atomic64_add_return_release(i, v);
656}
aa525d06 657
c020395b 658static __always_inline s64
aa525d06
MR
659atomic64_add_return_relaxed(s64 i, atomic64_t *v)
660{
3570a1bc 661 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
662 return arch_atomic64_add_return_relaxed(i, v);
663}
aa525d06 664
c020395b 665static __always_inline s64
aa525d06
MR
666atomic64_fetch_add(s64 i, atomic64_t *v)
667{
3570a1bc 668 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
669 return arch_atomic64_fetch_add(i, v);
670}
aa525d06 671
c020395b 672static __always_inline s64
aa525d06
MR
673atomic64_fetch_add_acquire(s64 i, atomic64_t *v)
674{
3570a1bc 675 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
676 return arch_atomic64_fetch_add_acquire(i, v);
677}
aa525d06 678
c020395b 679static __always_inline s64
aa525d06
MR
680atomic64_fetch_add_release(s64 i, atomic64_t *v)
681{
3570a1bc 682 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
683 return arch_atomic64_fetch_add_release(i, v);
684}
aa525d06 685
c020395b 686static __always_inline s64
aa525d06
MR
687atomic64_fetch_add_relaxed(s64 i, atomic64_t *v)
688{
3570a1bc 689 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
690 return arch_atomic64_fetch_add_relaxed(i, v);
691}
aa525d06 692
c020395b 693static __always_inline void
aa525d06
MR
694atomic64_sub(s64 i, atomic64_t *v)
695{
3570a1bc 696 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
697 arch_atomic64_sub(i, v);
698}
ac605bee 699
c020395b 700static __always_inline s64
aa525d06
MR
701atomic64_sub_return(s64 i, atomic64_t *v)
702{
3570a1bc 703 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
704 return arch_atomic64_sub_return(i, v);
705}
b06ed71a 706
c020395b 707static __always_inline s64
aa525d06
MR
708atomic64_sub_return_acquire(s64 i, atomic64_t *v)
709{
3570a1bc 710 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
711 return arch_atomic64_sub_return_acquire(i, v);
712}
b06ed71a 713
c020395b 714static __always_inline s64
aa525d06 715atomic64_sub_return_release(s64 i, atomic64_t *v)
b06ed71a 716{
3570a1bc 717 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 718 return arch_atomic64_sub_return_release(i, v);
b06ed71a
DV
719}
720
c020395b 721static __always_inline s64
aa525d06 722atomic64_sub_return_relaxed(s64 i, atomic64_t *v)
b06ed71a 723{
3570a1bc 724 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 725 return arch_atomic64_sub_return_relaxed(i, v);
b06ed71a
DV
726}
727
c020395b 728static __always_inline s64
aa525d06 729atomic64_fetch_sub(s64 i, atomic64_t *v)
b06ed71a 730{
3570a1bc 731 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 732 return arch_atomic64_fetch_sub(i, v);
b06ed71a
DV
733}
734
c020395b 735static __always_inline s64
aa525d06 736atomic64_fetch_sub_acquire(s64 i, atomic64_t *v)
b06ed71a 737{
3570a1bc 738 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 739 return arch_atomic64_fetch_sub_acquire(i, v);
b06ed71a
DV
740}
741
c020395b 742static __always_inline s64
aa525d06 743atomic64_fetch_sub_release(s64 i, atomic64_t *v)
b06ed71a 744{
3570a1bc 745 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 746 return arch_atomic64_fetch_sub_release(i, v);
b06ed71a
DV
747}
748
c020395b 749static __always_inline s64
aa525d06 750atomic64_fetch_sub_relaxed(s64 i, atomic64_t *v)
b06ed71a 751{
3570a1bc 752 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 753 return arch_atomic64_fetch_sub_relaxed(i, v);
b06ed71a
DV
754}
755
c020395b 756static __always_inline void
aa525d06 757atomic64_inc(atomic64_t *v)
b06ed71a 758{
3570a1bc 759 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 760 arch_atomic64_inc(v);
b06ed71a
DV
761}
762
c020395b 763static __always_inline s64
aa525d06 764atomic64_inc_return(atomic64_t *v)
b06ed71a 765{
3570a1bc 766 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 767 return arch_atomic64_inc_return(v);
b06ed71a
DV
768}
769
c020395b 770static __always_inline s64
aa525d06 771atomic64_inc_return_acquire(atomic64_t *v)
b06ed71a 772{
3570a1bc 773 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 774 return arch_atomic64_inc_return_acquire(v);
b06ed71a 775}
b06ed71a 776
c020395b 777static __always_inline s64
aa525d06 778atomic64_inc_return_release(atomic64_t *v)
b06ed71a 779{
3570a1bc 780 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 781 return arch_atomic64_inc_return_release(v);
b06ed71a 782}
b06ed71a 783
c020395b 784static __always_inline s64
aa525d06 785atomic64_inc_return_relaxed(atomic64_t *v)
b06ed71a 786{
3570a1bc 787 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 788 return arch_atomic64_inc_return_relaxed(v);
b06ed71a 789}
b06ed71a 790
c020395b 791static __always_inline s64
aa525d06 792atomic64_fetch_inc(atomic64_t *v)
0ae1d994 793{
3570a1bc 794 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 795 return arch_atomic64_fetch_inc(v);
0ae1d994 796}
b06ed71a 797
c020395b 798static __always_inline s64
aa525d06 799atomic64_fetch_inc_acquire(atomic64_t *v)
b06ed71a 800{
3570a1bc 801 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 802 return arch_atomic64_fetch_inc_acquire(v);
b06ed71a
DV
803}
804
c020395b 805static __always_inline s64
aa525d06 806atomic64_fetch_inc_release(atomic64_t *v)
b06ed71a 807{
3570a1bc 808 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 809 return arch_atomic64_fetch_inc_release(v);
b06ed71a
DV
810}
811
c020395b 812static __always_inline s64
aa525d06 813atomic64_fetch_inc_relaxed(atomic64_t *v)
b06ed71a 814{
3570a1bc 815 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 816 return arch_atomic64_fetch_inc_relaxed(v);
b06ed71a
DV
817}
818
c020395b 819static __always_inline void
aa525d06 820atomic64_dec(atomic64_t *v)
b06ed71a 821{
3570a1bc 822 instrument_atomic_read_write(v, sizeof(*v));
b06ed71a
DV
823 arch_atomic64_dec(v);
824}
825
c020395b 826static __always_inline s64
aa525d06 827atomic64_dec_return(atomic64_t *v)
b06ed71a 828{
3570a1bc 829 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 830 return arch_atomic64_dec_return(v);
b06ed71a
DV
831}
832
c020395b 833static __always_inline s64
aa525d06 834atomic64_dec_return_acquire(atomic64_t *v)
b06ed71a 835{
3570a1bc 836 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 837 return arch_atomic64_dec_return_acquire(v);
b06ed71a
DV
838}
839
c020395b 840static __always_inline s64
aa525d06 841atomic64_dec_return_release(atomic64_t *v)
b06ed71a 842{
3570a1bc 843 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 844 return arch_atomic64_dec_return_release(v);
b06ed71a
DV
845}
846
c020395b 847static __always_inline s64
aa525d06 848atomic64_dec_return_relaxed(atomic64_t *v)
b06ed71a 849{
3570a1bc 850 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 851 return arch_atomic64_dec_return_relaxed(v);
b06ed71a
DV
852}
853
c020395b 854static __always_inline s64
aa525d06 855atomic64_fetch_dec(atomic64_t *v)
b06ed71a 856{
3570a1bc 857 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
858 return arch_atomic64_fetch_dec(v);
859}
aa525d06 860
c020395b 861static __always_inline s64
aa525d06
MR
862atomic64_fetch_dec_acquire(atomic64_t *v)
863{
3570a1bc 864 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
865 return arch_atomic64_fetch_dec_acquire(v);
866}
aa525d06 867
c020395b 868static __always_inline s64
aa525d06
MR
869atomic64_fetch_dec_release(atomic64_t *v)
870{
3570a1bc 871 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 872 return arch_atomic64_fetch_dec_release(v);
b06ed71a 873}
aa525d06 874
c020395b 875static __always_inline s64
aa525d06
MR
876atomic64_fetch_dec_relaxed(atomic64_t *v)
877{
3570a1bc 878 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
879 return arch_atomic64_fetch_dec_relaxed(v);
880}
b06ed71a 881
c020395b 882static __always_inline void
aa525d06 883atomic64_and(s64 i, atomic64_t *v)
b06ed71a 884{
3570a1bc 885 instrument_atomic_read_write(v, sizeof(*v));
b06ed71a
DV
886 arch_atomic64_and(i, v);
887}
888
c020395b 889static __always_inline s64
aa525d06 890atomic64_fetch_and(s64 i, atomic64_t *v)
b06ed71a 891{
3570a1bc 892 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 893 return arch_atomic64_fetch_and(i, v);
b06ed71a
DV
894}
895
c020395b 896static __always_inline s64
aa525d06 897atomic64_fetch_and_acquire(s64 i, atomic64_t *v)
b06ed71a 898{
3570a1bc 899 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 900 return arch_atomic64_fetch_and_acquire(i, v);
b06ed71a
DV
901}
902
c020395b 903static __always_inline s64
aa525d06 904atomic64_fetch_and_release(s64 i, atomic64_t *v)
b06ed71a 905{
3570a1bc 906 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 907 return arch_atomic64_fetch_and_release(i, v);
b06ed71a
DV
908}
909
c020395b 910static __always_inline s64
aa525d06 911atomic64_fetch_and_relaxed(s64 i, atomic64_t *v)
b06ed71a 912{
3570a1bc 913 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 914 return arch_atomic64_fetch_and_relaxed(i, v);
b06ed71a
DV
915}
916
c020395b 917static __always_inline void
aa525d06 918atomic64_andnot(s64 i, atomic64_t *v)
b06ed71a 919{
3570a1bc 920 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 921 arch_atomic64_andnot(i, v);
b06ed71a
DV
922}
923
c020395b 924static __always_inline s64
aa525d06 925atomic64_fetch_andnot(s64 i, atomic64_t *v)
b06ed71a 926{
3570a1bc 927 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 928 return arch_atomic64_fetch_andnot(i, v);
b06ed71a
DV
929}
930
c020395b 931static __always_inline s64
aa525d06 932atomic64_fetch_andnot_acquire(s64 i, atomic64_t *v)
b06ed71a 933{
3570a1bc 934 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 935 return arch_atomic64_fetch_andnot_acquire(i, v);
b06ed71a
DV
936}
937
c020395b 938static __always_inline s64
aa525d06 939atomic64_fetch_andnot_release(s64 i, atomic64_t *v)
b06ed71a 940{
3570a1bc 941 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 942 return arch_atomic64_fetch_andnot_release(i, v);
b06ed71a
DV
943}
944
c020395b 945static __always_inline s64
aa525d06 946atomic64_fetch_andnot_relaxed(s64 i, atomic64_t *v)
b06ed71a 947{
3570a1bc 948 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 949 return arch_atomic64_fetch_andnot_relaxed(i, v);
b06ed71a
DV
950}
951
c020395b 952static __always_inline void
aa525d06 953atomic64_or(s64 i, atomic64_t *v)
b06ed71a 954{
3570a1bc 955 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
956 arch_atomic64_or(i, v);
957}
aa525d06 958
c020395b 959static __always_inline s64
aa525d06
MR
960atomic64_fetch_or(s64 i, atomic64_t *v)
961{
3570a1bc 962 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 963 return arch_atomic64_fetch_or(i, v);
b06ed71a
DV
964}
965
c020395b 966static __always_inline s64
aa525d06 967atomic64_fetch_or_acquire(s64 i, atomic64_t *v)
b06ed71a 968{
3570a1bc 969 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 970 return arch_atomic64_fetch_or_acquire(i, v);
b06ed71a
DV
971}
972
c020395b 973static __always_inline s64
aa525d06 974atomic64_fetch_or_release(s64 i, atomic64_t *v)
b06ed71a 975{
3570a1bc 976 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 977 return arch_atomic64_fetch_or_release(i, v);
b06ed71a
DV
978}
979
c020395b 980static __always_inline s64
aa525d06 981atomic64_fetch_or_relaxed(s64 i, atomic64_t *v)
b06ed71a 982{
3570a1bc 983 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 984 return arch_atomic64_fetch_or_relaxed(i, v);
b06ed71a
DV
985}
986
c020395b 987static __always_inline void
aa525d06 988atomic64_xor(s64 i, atomic64_t *v)
b06ed71a 989{
3570a1bc 990 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
991 arch_atomic64_xor(i, v);
992}
aa525d06 993
c020395b 994static __always_inline s64
aa525d06
MR
995atomic64_fetch_xor(s64 i, atomic64_t *v)
996{
3570a1bc 997 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 998 return arch_atomic64_fetch_xor(i, v);
b06ed71a
DV
999}
1000
c020395b 1001static __always_inline s64
aa525d06 1002atomic64_fetch_xor_acquire(s64 i, atomic64_t *v)
b06ed71a 1003{
3570a1bc 1004 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 1005 return arch_atomic64_fetch_xor_acquire(i, v);
b06ed71a
DV
1006}
1007
c020395b 1008static __always_inline s64
aa525d06 1009atomic64_fetch_xor_release(s64 i, atomic64_t *v)
b06ed71a 1010{
3570a1bc 1011 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 1012 return arch_atomic64_fetch_xor_release(i, v);
b06ed71a
DV
1013}
1014
c020395b 1015static __always_inline s64
aa525d06 1016atomic64_fetch_xor_relaxed(s64 i, atomic64_t *v)
b06ed71a 1017{
3570a1bc 1018 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 1019 return arch_atomic64_fetch_xor_relaxed(i, v);
b06ed71a
DV
1020}
1021
c020395b 1022static __always_inline s64
aa525d06 1023atomic64_xchg(atomic64_t *v, s64 i)
b06ed71a 1024{
3570a1bc 1025 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 1026 return arch_atomic64_xchg(v, i);
b06ed71a
DV
1027}
1028
c020395b 1029static __always_inline s64
aa525d06 1030atomic64_xchg_acquire(atomic64_t *v, s64 i)
b06ed71a 1031{
3570a1bc 1032 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 1033 return arch_atomic64_xchg_acquire(v, i);
b06ed71a
DV
1034}
1035
c020395b 1036static __always_inline s64
aa525d06 1037atomic64_xchg_release(atomic64_t *v, s64 i)
b06ed71a 1038{
3570a1bc 1039 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 1040 return arch_atomic64_xchg_release(v, i);
b06ed71a
DV
1041}
1042
c020395b 1043static __always_inline s64
aa525d06 1044atomic64_xchg_relaxed(atomic64_t *v, s64 i)
b06ed71a 1045{
3570a1bc 1046 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 1047 return arch_atomic64_xchg_relaxed(v, i);
b06ed71a
DV
1048}
1049
c020395b 1050static __always_inline s64
aa525d06 1051atomic64_cmpxchg(atomic64_t *v, s64 old, s64 new)
b06ed71a 1052{
3570a1bc 1053 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 1054 return arch_atomic64_cmpxchg(v, old, new);
b06ed71a
DV
1055}
1056
c020395b 1057static __always_inline s64
aa525d06 1058atomic64_cmpxchg_acquire(atomic64_t *v, s64 old, s64 new)
b06ed71a 1059{
3570a1bc 1060 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 1061 return arch_atomic64_cmpxchg_acquire(v, old, new);
b06ed71a
DV
1062}
1063
c020395b 1064static __always_inline s64
aa525d06 1065atomic64_cmpxchg_release(atomic64_t *v, s64 old, s64 new)
b06ed71a 1066{
3570a1bc 1067 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 1068 return arch_atomic64_cmpxchg_release(v, old, new);
b06ed71a
DV
1069}
1070
c020395b 1071static __always_inline s64
aa525d06 1072atomic64_cmpxchg_relaxed(atomic64_t *v, s64 old, s64 new)
b06ed71a 1073{
3570a1bc 1074 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 1075 return arch_atomic64_cmpxchg_relaxed(v, old, new);
b06ed71a
DV
1076}
1077
c020395b 1078static __always_inline bool
aa525d06 1079atomic64_try_cmpxchg(atomic64_t *v, s64 *old, s64 new)
b06ed71a 1080{
3570a1bc
ME
1081 instrument_atomic_read_write(v, sizeof(*v));
1082 instrument_atomic_read_write(old, sizeof(*old));
aa525d06 1083 return arch_atomic64_try_cmpxchg(v, old, new);
b06ed71a
DV
1084}
1085
c020395b 1086static __always_inline bool
aa525d06 1087atomic64_try_cmpxchg_acquire(atomic64_t *v, s64 *old, s64 new)
b06ed71a 1088{
3570a1bc
ME
1089 instrument_atomic_read_write(v, sizeof(*v));
1090 instrument_atomic_read_write(old, sizeof(*old));
aa525d06 1091 return arch_atomic64_try_cmpxchg_acquire(v, old, new);
b06ed71a
DV
1092}
1093
c020395b 1094static __always_inline bool
aa525d06 1095atomic64_try_cmpxchg_release(atomic64_t *v, s64 *old, s64 new)
b06ed71a 1096{
3570a1bc
ME
1097 instrument_atomic_read_write(v, sizeof(*v));
1098 instrument_atomic_read_write(old, sizeof(*old));
aa525d06 1099 return arch_atomic64_try_cmpxchg_release(v, old, new);
b06ed71a
DV
1100}
1101
c020395b 1102static __always_inline bool
aa525d06 1103atomic64_try_cmpxchg_relaxed(atomic64_t *v, s64 *old, s64 new)
b06ed71a 1104{
3570a1bc
ME
1105 instrument_atomic_read_write(v, sizeof(*v));
1106 instrument_atomic_read_write(old, sizeof(*old));
aa525d06 1107 return arch_atomic64_try_cmpxchg_relaxed(v, old, new);
b06ed71a
DV
1108}
1109
c020395b 1110static __always_inline bool
aa525d06 1111atomic64_sub_and_test(s64 i, atomic64_t *v)
b06ed71a 1112{
3570a1bc 1113 instrument_atomic_read_write(v, sizeof(*v));
b06ed71a
DV
1114 return arch_atomic64_sub_and_test(i, v);
1115}
1116
c020395b 1117static __always_inline bool
aa525d06 1118atomic64_dec_and_test(atomic64_t *v)
b06ed71a 1119{
3570a1bc 1120 instrument_atomic_read_write(v, sizeof(*v));
aa525d06 1121 return arch_atomic64_dec_and_test(v);
b06ed71a
DV
1122}
1123
c020395b 1124static __always_inline bool
aa525d06
MR
1125atomic64_inc_and_test(atomic64_t *v)
1126{
3570a1bc 1127 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
1128 return arch_atomic64_inc_and_test(v);
1129}
aa525d06 1130
c020395b 1131static __always_inline bool
aa525d06 1132atomic64_add_negative(s64 i, atomic64_t *v)
b06ed71a 1133{
3570a1bc 1134 instrument_atomic_read_write(v, sizeof(*v));
b06ed71a
DV
1135 return arch_atomic64_add_negative(i, v);
1136}
aa525d06 1137
c020395b 1138static __always_inline s64
aa525d06
MR
1139atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u)
1140{
3570a1bc 1141 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
1142 return arch_atomic64_fetch_add_unless(v, a, u);
1143}
aa525d06 1144
c020395b 1145static __always_inline bool
aa525d06
MR
1146atomic64_add_unless(atomic64_t *v, s64 a, s64 u)
1147{
3570a1bc 1148 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
1149 return arch_atomic64_add_unless(v, a, u);
1150}
aa525d06 1151
c020395b 1152static __always_inline bool
aa525d06
MR
1153atomic64_inc_not_zero(atomic64_t *v)
1154{
3570a1bc 1155 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
1156 return arch_atomic64_inc_not_zero(v);
1157}
aa525d06 1158
c020395b 1159static __always_inline bool
aa525d06
MR
1160atomic64_inc_unless_negative(atomic64_t *v)
1161{
3570a1bc 1162 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
1163 return arch_atomic64_inc_unless_negative(v);
1164}
b06ed71a 1165
c020395b 1166static __always_inline bool
aa525d06
MR
1167atomic64_dec_unless_positive(atomic64_t *v)
1168{
3570a1bc 1169 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
1170 return arch_atomic64_dec_unless_positive(v);
1171}
aa525d06 1172
c020395b 1173static __always_inline s64
aa525d06
MR
1174atomic64_dec_if_positive(atomic64_t *v)
1175{
3570a1bc 1176 instrument_atomic_read_write(v, sizeof(*v));
aa525d06
MR
1177 return arch_atomic64_dec_if_positive(v);
1178}
aa525d06 1179
67d1b0de
MR
1180static __always_inline long
1181atomic_long_read(const atomic_long_t *v)
1182{
1183 instrument_atomic_read(v, sizeof(*v));
1184 return arch_atomic_long_read(v);
1185}
1186
1187static __always_inline long
1188atomic_long_read_acquire(const atomic_long_t *v)
1189{
1190 instrument_atomic_read(v, sizeof(*v));
1191 return arch_atomic_long_read_acquire(v);
1192}
1193
1194static __always_inline void
1195atomic_long_set(atomic_long_t *v, long i)
1196{
1197 instrument_atomic_write(v, sizeof(*v));
1198 arch_atomic_long_set(v, i);
1199}
1200
1201static __always_inline void
1202atomic_long_set_release(atomic_long_t *v, long i)
1203{
1204 instrument_atomic_write(v, sizeof(*v));
1205 arch_atomic_long_set_release(v, i);
1206}
1207
1208static __always_inline void
1209atomic_long_add(long i, atomic_long_t *v)
1210{
1211 instrument_atomic_read_write(v, sizeof(*v));
1212 arch_atomic_long_add(i, v);
1213}
1214
1215static __always_inline long
1216atomic_long_add_return(long i, atomic_long_t *v)
1217{
1218 instrument_atomic_read_write(v, sizeof(*v));
1219 return arch_atomic_long_add_return(i, v);
1220}
1221
1222static __always_inline long
1223atomic_long_add_return_acquire(long i, atomic_long_t *v)
1224{
1225 instrument_atomic_read_write(v, sizeof(*v));
1226 return arch_atomic_long_add_return_acquire(i, v);
1227}
1228
1229static __always_inline long
1230atomic_long_add_return_release(long i, atomic_long_t *v)
1231{
1232 instrument_atomic_read_write(v, sizeof(*v));
1233 return arch_atomic_long_add_return_release(i, v);
1234}
1235
1236static __always_inline long
1237atomic_long_add_return_relaxed(long i, atomic_long_t *v)
1238{
1239 instrument_atomic_read_write(v, sizeof(*v));
1240 return arch_atomic_long_add_return_relaxed(i, v);
1241}
1242
1243static __always_inline long
1244atomic_long_fetch_add(long i, atomic_long_t *v)
1245{
1246 instrument_atomic_read_write(v, sizeof(*v));
1247 return arch_atomic_long_fetch_add(i, v);
1248}
1249
1250static __always_inline long
1251atomic_long_fetch_add_acquire(long i, atomic_long_t *v)
1252{
1253 instrument_atomic_read_write(v, sizeof(*v));
1254 return arch_atomic_long_fetch_add_acquire(i, v);
1255}
1256
1257static __always_inline long
1258atomic_long_fetch_add_release(long i, atomic_long_t *v)
1259{
1260 instrument_atomic_read_write(v, sizeof(*v));
1261 return arch_atomic_long_fetch_add_release(i, v);
1262}
1263
1264static __always_inline long
1265atomic_long_fetch_add_relaxed(long i, atomic_long_t *v)
1266{
1267 instrument_atomic_read_write(v, sizeof(*v));
1268 return arch_atomic_long_fetch_add_relaxed(i, v);
1269}
1270
1271static __always_inline void
1272atomic_long_sub(long i, atomic_long_t *v)
1273{
1274 instrument_atomic_read_write(v, sizeof(*v));
1275 arch_atomic_long_sub(i, v);
1276}
1277
1278static __always_inline long
1279atomic_long_sub_return(long i, atomic_long_t *v)
1280{
1281 instrument_atomic_read_write(v, sizeof(*v));
1282 return arch_atomic_long_sub_return(i, v);
1283}
1284
1285static __always_inline long
1286atomic_long_sub_return_acquire(long i, atomic_long_t *v)
1287{
1288 instrument_atomic_read_write(v, sizeof(*v));
1289 return arch_atomic_long_sub_return_acquire(i, v);
1290}
1291
1292static __always_inline long
1293atomic_long_sub_return_release(long i, atomic_long_t *v)
1294{
1295 instrument_atomic_read_write(v, sizeof(*v));
1296 return arch_atomic_long_sub_return_release(i, v);
1297}
1298
1299static __always_inline long
1300atomic_long_sub_return_relaxed(long i, atomic_long_t *v)
1301{
1302 instrument_atomic_read_write(v, sizeof(*v));
1303 return arch_atomic_long_sub_return_relaxed(i, v);
1304}
1305
1306static __always_inline long
1307atomic_long_fetch_sub(long i, atomic_long_t *v)
1308{
1309 instrument_atomic_read_write(v, sizeof(*v));
1310 return arch_atomic_long_fetch_sub(i, v);
1311}
1312
1313static __always_inline long
1314atomic_long_fetch_sub_acquire(long i, atomic_long_t *v)
1315{
1316 instrument_atomic_read_write(v, sizeof(*v));
1317 return arch_atomic_long_fetch_sub_acquire(i, v);
1318}
1319
1320static __always_inline long
1321atomic_long_fetch_sub_release(long i, atomic_long_t *v)
1322{
1323 instrument_atomic_read_write(v, sizeof(*v));
1324 return arch_atomic_long_fetch_sub_release(i, v);
1325}
1326
1327static __always_inline long
1328atomic_long_fetch_sub_relaxed(long i, atomic_long_t *v)
1329{
1330 instrument_atomic_read_write(v, sizeof(*v));
1331 return arch_atomic_long_fetch_sub_relaxed(i, v);
1332}
1333
1334static __always_inline void
1335atomic_long_inc(atomic_long_t *v)
1336{
1337 instrument_atomic_read_write(v, sizeof(*v));
1338 arch_atomic_long_inc(v);
1339}
1340
1341static __always_inline long
1342atomic_long_inc_return(atomic_long_t *v)
1343{
1344 instrument_atomic_read_write(v, sizeof(*v));
1345 return arch_atomic_long_inc_return(v);
1346}
1347
1348static __always_inline long
1349atomic_long_inc_return_acquire(atomic_long_t *v)
1350{
1351 instrument_atomic_read_write(v, sizeof(*v));
1352 return arch_atomic_long_inc_return_acquire(v);
1353}
1354
1355static __always_inline long
1356atomic_long_inc_return_release(atomic_long_t *v)
1357{
1358 instrument_atomic_read_write(v, sizeof(*v));
1359 return arch_atomic_long_inc_return_release(v);
1360}
1361
1362static __always_inline long
1363atomic_long_inc_return_relaxed(atomic_long_t *v)
1364{
1365 instrument_atomic_read_write(v, sizeof(*v));
1366 return arch_atomic_long_inc_return_relaxed(v);
1367}
1368
1369static __always_inline long
1370atomic_long_fetch_inc(atomic_long_t *v)
1371{
1372 instrument_atomic_read_write(v, sizeof(*v));
1373 return arch_atomic_long_fetch_inc(v);
1374}
1375
1376static __always_inline long
1377atomic_long_fetch_inc_acquire(atomic_long_t *v)
1378{
1379 instrument_atomic_read_write(v, sizeof(*v));
1380 return arch_atomic_long_fetch_inc_acquire(v);
1381}
1382
1383static __always_inline long
1384atomic_long_fetch_inc_release(atomic_long_t *v)
1385{
1386 instrument_atomic_read_write(v, sizeof(*v));
1387 return arch_atomic_long_fetch_inc_release(v);
1388}
1389
1390static __always_inline long
1391atomic_long_fetch_inc_relaxed(atomic_long_t *v)
1392{
1393 instrument_atomic_read_write(v, sizeof(*v));
1394 return arch_atomic_long_fetch_inc_relaxed(v);
1395}
1396
1397static __always_inline void
1398atomic_long_dec(atomic_long_t *v)
1399{
1400 instrument_atomic_read_write(v, sizeof(*v));
1401 arch_atomic_long_dec(v);
1402}
1403
1404static __always_inline long
1405atomic_long_dec_return(atomic_long_t *v)
1406{
1407 instrument_atomic_read_write(v, sizeof(*v));
1408 return arch_atomic_long_dec_return(v);
1409}
1410
1411static __always_inline long
1412atomic_long_dec_return_acquire(atomic_long_t *v)
1413{
1414 instrument_atomic_read_write(v, sizeof(*v));
1415 return arch_atomic_long_dec_return_acquire(v);
1416}
1417
1418static __always_inline long
1419atomic_long_dec_return_release(atomic_long_t *v)
1420{
1421 instrument_atomic_read_write(v, sizeof(*v));
1422 return arch_atomic_long_dec_return_release(v);
1423}
1424
1425static __always_inline long
1426atomic_long_dec_return_relaxed(atomic_long_t *v)
1427{
1428 instrument_atomic_read_write(v, sizeof(*v));
1429 return arch_atomic_long_dec_return_relaxed(v);
1430}
1431
1432static __always_inline long
1433atomic_long_fetch_dec(atomic_long_t *v)
1434{
1435 instrument_atomic_read_write(v, sizeof(*v));
1436 return arch_atomic_long_fetch_dec(v);
1437}
1438
1439static __always_inline long
1440atomic_long_fetch_dec_acquire(atomic_long_t *v)
1441{
1442 instrument_atomic_read_write(v, sizeof(*v));
1443 return arch_atomic_long_fetch_dec_acquire(v);
1444}
1445
1446static __always_inline long
1447atomic_long_fetch_dec_release(atomic_long_t *v)
1448{
1449 instrument_atomic_read_write(v, sizeof(*v));
1450 return arch_atomic_long_fetch_dec_release(v);
1451}
1452
1453static __always_inline long
1454atomic_long_fetch_dec_relaxed(atomic_long_t *v)
1455{
1456 instrument_atomic_read_write(v, sizeof(*v));
1457 return arch_atomic_long_fetch_dec_relaxed(v);
1458}
1459
1460static __always_inline void
1461atomic_long_and(long i, atomic_long_t *v)
1462{
1463 instrument_atomic_read_write(v, sizeof(*v));
1464 arch_atomic_long_and(i, v);
1465}
1466
1467static __always_inline long
1468atomic_long_fetch_and(long i, atomic_long_t *v)
1469{
1470 instrument_atomic_read_write(v, sizeof(*v));
1471 return arch_atomic_long_fetch_and(i, v);
1472}
1473
1474static __always_inline long
1475atomic_long_fetch_and_acquire(long i, atomic_long_t *v)
1476{
1477 instrument_atomic_read_write(v, sizeof(*v));
1478 return arch_atomic_long_fetch_and_acquire(i, v);
1479}
1480
1481static __always_inline long
1482atomic_long_fetch_and_release(long i, atomic_long_t *v)
1483{
1484 instrument_atomic_read_write(v, sizeof(*v));
1485 return arch_atomic_long_fetch_and_release(i, v);
1486}
1487
1488static __always_inline long
1489atomic_long_fetch_and_relaxed(long i, atomic_long_t *v)
1490{
1491 instrument_atomic_read_write(v, sizeof(*v));
1492 return arch_atomic_long_fetch_and_relaxed(i, v);
1493}
1494
1495static __always_inline void
1496atomic_long_andnot(long i, atomic_long_t *v)
1497{
1498 instrument_atomic_read_write(v, sizeof(*v));
1499 arch_atomic_long_andnot(i, v);
1500}
1501
1502static __always_inline long
1503atomic_long_fetch_andnot(long i, atomic_long_t *v)
1504{
1505 instrument_atomic_read_write(v, sizeof(*v));
1506 return arch_atomic_long_fetch_andnot(i, v);
1507}
1508
1509static __always_inline long
1510atomic_long_fetch_andnot_acquire(long i, atomic_long_t *v)
1511{
1512 instrument_atomic_read_write(v, sizeof(*v));
1513 return arch_atomic_long_fetch_andnot_acquire(i, v);
1514}
1515
1516static __always_inline long
1517atomic_long_fetch_andnot_release(long i, atomic_long_t *v)
1518{
1519 instrument_atomic_read_write(v, sizeof(*v));
1520 return arch_atomic_long_fetch_andnot_release(i, v);
1521}
1522
1523static __always_inline long
1524atomic_long_fetch_andnot_relaxed(long i, atomic_long_t *v)
1525{
1526 instrument_atomic_read_write(v, sizeof(*v));
1527 return arch_atomic_long_fetch_andnot_relaxed(i, v);
1528}
1529
1530static __always_inline void
1531atomic_long_or(long i, atomic_long_t *v)
1532{
1533 instrument_atomic_read_write(v, sizeof(*v));
1534 arch_atomic_long_or(i, v);
1535}
1536
1537static __always_inline long
1538atomic_long_fetch_or(long i, atomic_long_t *v)
1539{
1540 instrument_atomic_read_write(v, sizeof(*v));
1541 return arch_atomic_long_fetch_or(i, v);
1542}
1543
1544static __always_inline long
1545atomic_long_fetch_or_acquire(long i, atomic_long_t *v)
1546{
1547 instrument_atomic_read_write(v, sizeof(*v));
1548 return arch_atomic_long_fetch_or_acquire(i, v);
1549}
1550
1551static __always_inline long
1552atomic_long_fetch_or_release(long i, atomic_long_t *v)
1553{
1554 instrument_atomic_read_write(v, sizeof(*v));
1555 return arch_atomic_long_fetch_or_release(i, v);
1556}
1557
1558static __always_inline long
1559atomic_long_fetch_or_relaxed(long i, atomic_long_t *v)
1560{
1561 instrument_atomic_read_write(v, sizeof(*v));
1562 return arch_atomic_long_fetch_or_relaxed(i, v);
1563}
1564
1565static __always_inline void
1566atomic_long_xor(long i, atomic_long_t *v)
1567{
1568 instrument_atomic_read_write(v, sizeof(*v));
1569 arch_atomic_long_xor(i, v);
1570}
1571
1572static __always_inline long
1573atomic_long_fetch_xor(long i, atomic_long_t *v)
1574{
1575 instrument_atomic_read_write(v, sizeof(*v));
1576 return arch_atomic_long_fetch_xor(i, v);
1577}
1578
1579static __always_inline long
1580atomic_long_fetch_xor_acquire(long i, atomic_long_t *v)
1581{
1582 instrument_atomic_read_write(v, sizeof(*v));
1583 return arch_atomic_long_fetch_xor_acquire(i, v);
1584}
1585
1586static __always_inline long
1587atomic_long_fetch_xor_release(long i, atomic_long_t *v)
1588{
1589 instrument_atomic_read_write(v, sizeof(*v));
1590 return arch_atomic_long_fetch_xor_release(i, v);
1591}
1592
1593static __always_inline long
1594atomic_long_fetch_xor_relaxed(long i, atomic_long_t *v)
1595{
1596 instrument_atomic_read_write(v, sizeof(*v));
1597 return arch_atomic_long_fetch_xor_relaxed(i, v);
1598}
1599
1600static __always_inline long
1601atomic_long_xchg(atomic_long_t *v, long i)
1602{
1603 instrument_atomic_read_write(v, sizeof(*v));
1604 return arch_atomic_long_xchg(v, i);
1605}
1606
1607static __always_inline long
1608atomic_long_xchg_acquire(atomic_long_t *v, long i)
1609{
1610 instrument_atomic_read_write(v, sizeof(*v));
1611 return arch_atomic_long_xchg_acquire(v, i);
1612}
1613
1614static __always_inline long
1615atomic_long_xchg_release(atomic_long_t *v, long i)
1616{
1617 instrument_atomic_read_write(v, sizeof(*v));
1618 return arch_atomic_long_xchg_release(v, i);
1619}
1620
1621static __always_inline long
1622atomic_long_xchg_relaxed(atomic_long_t *v, long i)
1623{
1624 instrument_atomic_read_write(v, sizeof(*v));
1625 return arch_atomic_long_xchg_relaxed(v, i);
1626}
1627
1628static __always_inline long
1629atomic_long_cmpxchg(atomic_long_t *v, long old, long new)
1630{
1631 instrument_atomic_read_write(v, sizeof(*v));
1632 return arch_atomic_long_cmpxchg(v, old, new);
1633}
1634
1635static __always_inline long
1636atomic_long_cmpxchg_acquire(atomic_long_t *v, long old, long new)
1637{
1638 instrument_atomic_read_write(v, sizeof(*v));
1639 return arch_atomic_long_cmpxchg_acquire(v, old, new);
1640}
1641
1642static __always_inline long
1643atomic_long_cmpxchg_release(atomic_long_t *v, long old, long new)
1644{
1645 instrument_atomic_read_write(v, sizeof(*v));
1646 return arch_atomic_long_cmpxchg_release(v, old, new);
1647}
1648
1649static __always_inline long
1650atomic_long_cmpxchg_relaxed(atomic_long_t *v, long old, long new)
1651{
1652 instrument_atomic_read_write(v, sizeof(*v));
1653 return arch_atomic_long_cmpxchg_relaxed(v, old, new);
1654}
1655
1656static __always_inline bool
1657atomic_long_try_cmpxchg(atomic_long_t *v, long *old, long new)
1658{
1659 instrument_atomic_read_write(v, sizeof(*v));
1660 instrument_atomic_read_write(old, sizeof(*old));
1661 return arch_atomic_long_try_cmpxchg(v, old, new);
1662}
1663
1664static __always_inline bool
1665atomic_long_try_cmpxchg_acquire(atomic_long_t *v, long *old, long new)
1666{
1667 instrument_atomic_read_write(v, sizeof(*v));
1668 instrument_atomic_read_write(old, sizeof(*old));
1669 return arch_atomic_long_try_cmpxchg_acquire(v, old, new);
1670}
1671
1672static __always_inline bool
1673atomic_long_try_cmpxchg_release(atomic_long_t *v, long *old, long new)
1674{
1675 instrument_atomic_read_write(v, sizeof(*v));
1676 instrument_atomic_read_write(old, sizeof(*old));
1677 return arch_atomic_long_try_cmpxchg_release(v, old, new);
1678}
1679
1680static __always_inline bool
1681atomic_long_try_cmpxchg_relaxed(atomic_long_t *v, long *old, long new)
1682{
1683 instrument_atomic_read_write(v, sizeof(*v));
1684 instrument_atomic_read_write(old, sizeof(*old));
1685 return arch_atomic_long_try_cmpxchg_relaxed(v, old, new);
1686}
1687
1688static __always_inline bool
1689atomic_long_sub_and_test(long i, atomic_long_t *v)
1690{
1691 instrument_atomic_read_write(v, sizeof(*v));
1692 return arch_atomic_long_sub_and_test(i, v);
1693}
1694
1695static __always_inline bool
1696atomic_long_dec_and_test(atomic_long_t *v)
1697{
1698 instrument_atomic_read_write(v, sizeof(*v));
1699 return arch_atomic_long_dec_and_test(v);
1700}
1701
1702static __always_inline bool
1703atomic_long_inc_and_test(atomic_long_t *v)
1704{
1705 instrument_atomic_read_write(v, sizeof(*v));
1706 return arch_atomic_long_inc_and_test(v);
1707}
1708
1709static __always_inline bool
1710atomic_long_add_negative(long i, atomic_long_t *v)
1711{
1712 instrument_atomic_read_write(v, sizeof(*v));
1713 return arch_atomic_long_add_negative(i, v);
1714}
1715
1716static __always_inline long
1717atomic_long_fetch_add_unless(atomic_long_t *v, long a, long u)
1718{
1719 instrument_atomic_read_write(v, sizeof(*v));
1720 return arch_atomic_long_fetch_add_unless(v, a, u);
1721}
1722
1723static __always_inline bool
1724atomic_long_add_unless(atomic_long_t *v, long a, long u)
1725{
1726 instrument_atomic_read_write(v, sizeof(*v));
1727 return arch_atomic_long_add_unless(v, a, u);
1728}
1729
1730static __always_inline bool
1731atomic_long_inc_not_zero(atomic_long_t *v)
1732{
1733 instrument_atomic_read_write(v, sizeof(*v));
1734 return arch_atomic_long_inc_not_zero(v);
1735}
1736
1737static __always_inline bool
1738atomic_long_inc_unless_negative(atomic_long_t *v)
1739{
1740 instrument_atomic_read_write(v, sizeof(*v));
1741 return arch_atomic_long_inc_unless_negative(v);
1742}
1743
1744static __always_inline bool
1745atomic_long_dec_unless_positive(atomic_long_t *v)
1746{
1747 instrument_atomic_read_write(v, sizeof(*v));
1748 return arch_atomic_long_dec_unless_positive(v);
1749}
1750
1751static __always_inline long
1752atomic_long_dec_if_positive(atomic_long_t *v)
1753{
1754 instrument_atomic_read_write(v, sizeof(*v));
1755 return arch_atomic_long_dec_if_positive(v);
1756}
1757
29f006fd
PZ
1758#define xchg(ptr, ...) \
1759({ \
1760 typeof(ptr) __ai_ptr = (ptr); \
1761 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1762 arch_xchg(__ai_ptr, __VA_ARGS__); \
aa525d06 1763})
aa525d06 1764
29f006fd
PZ
1765#define xchg_acquire(ptr, ...) \
1766({ \
1767 typeof(ptr) __ai_ptr = (ptr); \
1768 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1769 arch_xchg_acquire(__ai_ptr, __VA_ARGS__); \
aa525d06 1770})
aa525d06 1771
29f006fd
PZ
1772#define xchg_release(ptr, ...) \
1773({ \
1774 typeof(ptr) __ai_ptr = (ptr); \
1775 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1776 arch_xchg_release(__ai_ptr, __VA_ARGS__); \
aa525d06 1777})
aa525d06 1778
29f006fd
PZ
1779#define xchg_relaxed(ptr, ...) \
1780({ \
1781 typeof(ptr) __ai_ptr = (ptr); \
1782 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1783 arch_xchg_relaxed(__ai_ptr, __VA_ARGS__); \
aa525d06 1784})
aa525d06 1785
29f006fd
PZ
1786#define cmpxchg(ptr, ...) \
1787({ \
1788 typeof(ptr) __ai_ptr = (ptr); \
1789 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1790 arch_cmpxchg(__ai_ptr, __VA_ARGS__); \
f9881cc4 1791})
aa525d06 1792
29f006fd
PZ
1793#define cmpxchg_acquire(ptr, ...) \
1794({ \
1795 typeof(ptr) __ai_ptr = (ptr); \
1796 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1797 arch_cmpxchg_acquire(__ai_ptr, __VA_ARGS__); \
aa525d06 1798})
aa525d06 1799
29f006fd
PZ
1800#define cmpxchg_release(ptr, ...) \
1801({ \
1802 typeof(ptr) __ai_ptr = (ptr); \
1803 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1804 arch_cmpxchg_release(__ai_ptr, __VA_ARGS__); \
aa525d06 1805})
aa525d06 1806
29f006fd
PZ
1807#define cmpxchg_relaxed(ptr, ...) \
1808({ \
1809 typeof(ptr) __ai_ptr = (ptr); \
1810 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1811 arch_cmpxchg_relaxed(__ai_ptr, __VA_ARGS__); \
aa525d06 1812})
f9881cc4 1813
29f006fd
PZ
1814#define cmpxchg64(ptr, ...) \
1815({ \
1816 typeof(ptr) __ai_ptr = (ptr); \
1817 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1818 arch_cmpxchg64(__ai_ptr, __VA_ARGS__); \
b06ed71a 1819})
aa525d06 1820
29f006fd
PZ
1821#define cmpxchg64_acquire(ptr, ...) \
1822({ \
1823 typeof(ptr) __ai_ptr = (ptr); \
1824 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1825 arch_cmpxchg64_acquire(__ai_ptr, __VA_ARGS__); \
aa525d06 1826})
aa525d06 1827
29f006fd
PZ
1828#define cmpxchg64_release(ptr, ...) \
1829({ \
1830 typeof(ptr) __ai_ptr = (ptr); \
1831 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1832 arch_cmpxchg64_release(__ai_ptr, __VA_ARGS__); \
aa525d06 1833})
b06ed71a 1834
29f006fd
PZ
1835#define cmpxchg64_relaxed(ptr, ...) \
1836({ \
1837 typeof(ptr) __ai_ptr = (ptr); \
1838 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1839 arch_cmpxchg64_relaxed(__ai_ptr, __VA_ARGS__); \
b06ed71a
DV
1840})
1841
29f006fd
PZ
1842#define try_cmpxchg(ptr, oldp, ...) \
1843({ \
1844 typeof(ptr) __ai_ptr = (ptr); \
1845 typeof(oldp) __ai_oldp = (oldp); \
1846 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1847 instrument_atomic_write(__ai_oldp, sizeof(*__ai_oldp)); \
1848 arch_try_cmpxchg(__ai_ptr, __ai_oldp, __VA_ARGS__); \
1849})
29f006fd 1850
29f006fd
PZ
1851#define try_cmpxchg_acquire(ptr, oldp, ...) \
1852({ \
1853 typeof(ptr) __ai_ptr = (ptr); \
1854 typeof(oldp) __ai_oldp = (oldp); \
1855 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1856 instrument_atomic_write(__ai_oldp, sizeof(*__ai_oldp)); \
1857 arch_try_cmpxchg_acquire(__ai_ptr, __ai_oldp, __VA_ARGS__); \
1858})
29f006fd 1859
29f006fd
PZ
1860#define try_cmpxchg_release(ptr, oldp, ...) \
1861({ \
1862 typeof(ptr) __ai_ptr = (ptr); \
1863 typeof(oldp) __ai_oldp = (oldp); \
1864 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1865 instrument_atomic_write(__ai_oldp, sizeof(*__ai_oldp)); \
1866 arch_try_cmpxchg_release(__ai_ptr, __ai_oldp, __VA_ARGS__); \
1867})
29f006fd 1868
29f006fd
PZ
1869#define try_cmpxchg_relaxed(ptr, oldp, ...) \
1870({ \
1871 typeof(ptr) __ai_ptr = (ptr); \
1872 typeof(oldp) __ai_oldp = (oldp); \
1873 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1874 instrument_atomic_write(__ai_oldp, sizeof(*__ai_oldp)); \
1875 arch_try_cmpxchg_relaxed(__ai_ptr, __ai_oldp, __VA_ARGS__); \
1876})
29f006fd
PZ
1877
1878#define cmpxchg_local(ptr, ...) \
1879({ \
1880 typeof(ptr) __ai_ptr = (ptr); \
1881 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1882 arch_cmpxchg_local(__ai_ptr, __VA_ARGS__); \
b06ed71a
DV
1883})
1884
29f006fd
PZ
1885#define cmpxchg64_local(ptr, ...) \
1886({ \
1887 typeof(ptr) __ai_ptr = (ptr); \
1888 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1889 arch_cmpxchg64_local(__ai_ptr, __VA_ARGS__); \
b06ed71a
DV
1890})
1891
29f006fd
PZ
1892#define sync_cmpxchg(ptr, ...) \
1893({ \
1894 typeof(ptr) __ai_ptr = (ptr); \
1895 instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1896 arch_sync_cmpxchg(__ai_ptr, __VA_ARGS__); \
b06ed71a
DV
1897})
1898
29f006fd
PZ
1899#define cmpxchg_double(ptr, ...) \
1900({ \
1901 typeof(ptr) __ai_ptr = (ptr); \
1902 instrument_atomic_write(__ai_ptr, 2 * sizeof(*__ai_ptr)); \
1903 arch_cmpxchg_double(__ai_ptr, __VA_ARGS__); \
b06ed71a
DV
1904})
1905
aa525d06 1906
29f006fd
PZ
1907#define cmpxchg_double_local(ptr, ...) \
1908({ \
1909 typeof(ptr) __ai_ptr = (ptr); \
1910 instrument_atomic_write(__ai_ptr, 2 * sizeof(*__ai_ptr)); \
1911 arch_cmpxchg_double_local(__ai_ptr, __VA_ARGS__); \
b06ed71a
DV
1912})
1913
e3d18cee 1914#endif /* _LINUX_ATOMIC_INSTRUMENTED_H */
67d1b0de 1915// 2a9553f0a9d5619f19151092df5cabbbf16ce835