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