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