at v5.12 63 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2 3// Generated by scripts/atomic/gen-atomic-fallback.sh 4// DO NOT MODIFY THIS FILE DIRECTLY 5 6#ifndef _LINUX_ATOMIC_FALLBACK_H 7#define _LINUX_ATOMIC_FALLBACK_H 8 9#include <linux/compiler.h> 10 11#ifndef arch_xchg_relaxed 12#define arch_xchg_acquire arch_xchg 13#define arch_xchg_release arch_xchg 14#define arch_xchg_relaxed arch_xchg 15#else /* arch_xchg_relaxed */ 16 17#ifndef arch_xchg_acquire 18#define arch_xchg_acquire(...) \ 19 __atomic_op_acquire(arch_xchg, __VA_ARGS__) 20#endif 21 22#ifndef arch_xchg_release 23#define arch_xchg_release(...) \ 24 __atomic_op_release(arch_xchg, __VA_ARGS__) 25#endif 26 27#ifndef arch_xchg 28#define arch_xchg(...) \ 29 __atomic_op_fence(arch_xchg, __VA_ARGS__) 30#endif 31 32#endif /* arch_xchg_relaxed */ 33 34#ifndef arch_cmpxchg_relaxed 35#define arch_cmpxchg_acquire arch_cmpxchg 36#define arch_cmpxchg_release arch_cmpxchg 37#define arch_cmpxchg_relaxed arch_cmpxchg 38#else /* arch_cmpxchg_relaxed */ 39 40#ifndef arch_cmpxchg_acquire 41#define arch_cmpxchg_acquire(...) \ 42 __atomic_op_acquire(arch_cmpxchg, __VA_ARGS__) 43#endif 44 45#ifndef arch_cmpxchg_release 46#define arch_cmpxchg_release(...) \ 47 __atomic_op_release(arch_cmpxchg, __VA_ARGS__) 48#endif 49 50#ifndef arch_cmpxchg 51#define arch_cmpxchg(...) \ 52 __atomic_op_fence(arch_cmpxchg, __VA_ARGS__) 53#endif 54 55#endif /* arch_cmpxchg_relaxed */ 56 57#ifndef arch_cmpxchg64_relaxed 58#define arch_cmpxchg64_acquire arch_cmpxchg64 59#define arch_cmpxchg64_release arch_cmpxchg64 60#define arch_cmpxchg64_relaxed arch_cmpxchg64 61#else /* arch_cmpxchg64_relaxed */ 62 63#ifndef arch_cmpxchg64_acquire 64#define arch_cmpxchg64_acquire(...) \ 65 __atomic_op_acquire(arch_cmpxchg64, __VA_ARGS__) 66#endif 67 68#ifndef arch_cmpxchg64_release 69#define arch_cmpxchg64_release(...) \ 70 __atomic_op_release(arch_cmpxchg64, __VA_ARGS__) 71#endif 72 73#ifndef arch_cmpxchg64 74#define arch_cmpxchg64(...) \ 75 __atomic_op_fence(arch_cmpxchg64, __VA_ARGS__) 76#endif 77 78#endif /* arch_cmpxchg64_relaxed */ 79 80#ifndef arch_try_cmpxchg_relaxed 81#ifdef arch_try_cmpxchg 82#define arch_try_cmpxchg_acquire arch_try_cmpxchg 83#define arch_try_cmpxchg_release arch_try_cmpxchg 84#define arch_try_cmpxchg_relaxed arch_try_cmpxchg 85#endif /* arch_try_cmpxchg */ 86 87#ifndef arch_try_cmpxchg 88#define arch_try_cmpxchg(_ptr, _oldp, _new) \ 89({ \ 90 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \ 91 ___r = arch_cmpxchg((_ptr), ___o, (_new)); \ 92 if (unlikely(___r != ___o)) \ 93 *___op = ___r; \ 94 likely(___r == ___o); \ 95}) 96#endif /* arch_try_cmpxchg */ 97 98#ifndef arch_try_cmpxchg_acquire 99#define arch_try_cmpxchg_acquire(_ptr, _oldp, _new) \ 100({ \ 101 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \ 102 ___r = arch_cmpxchg_acquire((_ptr), ___o, (_new)); \ 103 if (unlikely(___r != ___o)) \ 104 *___op = ___r; \ 105 likely(___r == ___o); \ 106}) 107#endif /* arch_try_cmpxchg_acquire */ 108 109#ifndef arch_try_cmpxchg_release 110#define arch_try_cmpxchg_release(_ptr, _oldp, _new) \ 111({ \ 112 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \ 113 ___r = arch_cmpxchg_release((_ptr), ___o, (_new)); \ 114 if (unlikely(___r != ___o)) \ 115 *___op = ___r; \ 116 likely(___r == ___o); \ 117}) 118#endif /* arch_try_cmpxchg_release */ 119 120#ifndef arch_try_cmpxchg_relaxed 121#define arch_try_cmpxchg_relaxed(_ptr, _oldp, _new) \ 122({ \ 123 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \ 124 ___r = arch_cmpxchg_relaxed((_ptr), ___o, (_new)); \ 125 if (unlikely(___r != ___o)) \ 126 *___op = ___r; \ 127 likely(___r == ___o); \ 128}) 129#endif /* arch_try_cmpxchg_relaxed */ 130 131#else /* arch_try_cmpxchg_relaxed */ 132 133#ifndef arch_try_cmpxchg_acquire 134#define arch_try_cmpxchg_acquire(...) \ 135 __atomic_op_acquire(arch_try_cmpxchg, __VA_ARGS__) 136#endif 137 138#ifndef arch_try_cmpxchg_release 139#define arch_try_cmpxchg_release(...) \ 140 __atomic_op_release(arch_try_cmpxchg, __VA_ARGS__) 141#endif 142 143#ifndef arch_try_cmpxchg 144#define arch_try_cmpxchg(...) \ 145 __atomic_op_fence(arch_try_cmpxchg, __VA_ARGS__) 146#endif 147 148#endif /* arch_try_cmpxchg_relaxed */ 149 150#ifndef arch_atomic_read_acquire 151static __always_inline int 152arch_atomic_read_acquire(const atomic_t *v) 153{ 154 return smp_load_acquire(&(v)->counter); 155} 156#define arch_atomic_read_acquire arch_atomic_read_acquire 157#endif 158 159#ifndef arch_atomic_set_release 160static __always_inline void 161arch_atomic_set_release(atomic_t *v, int i) 162{ 163 smp_store_release(&(v)->counter, i); 164} 165#define arch_atomic_set_release arch_atomic_set_release 166#endif 167 168#ifndef arch_atomic_add_return_relaxed 169#define arch_atomic_add_return_acquire arch_atomic_add_return 170#define arch_atomic_add_return_release arch_atomic_add_return 171#define arch_atomic_add_return_relaxed arch_atomic_add_return 172#else /* arch_atomic_add_return_relaxed */ 173 174#ifndef arch_atomic_add_return_acquire 175static __always_inline int 176arch_atomic_add_return_acquire(int i, atomic_t *v) 177{ 178 int ret = arch_atomic_add_return_relaxed(i, v); 179 __atomic_acquire_fence(); 180 return ret; 181} 182#define arch_atomic_add_return_acquire arch_atomic_add_return_acquire 183#endif 184 185#ifndef arch_atomic_add_return_release 186static __always_inline int 187arch_atomic_add_return_release(int i, atomic_t *v) 188{ 189 __atomic_release_fence(); 190 return arch_atomic_add_return_relaxed(i, v); 191} 192#define arch_atomic_add_return_release arch_atomic_add_return_release 193#endif 194 195#ifndef arch_atomic_add_return 196static __always_inline int 197arch_atomic_add_return(int i, atomic_t *v) 198{ 199 int ret; 200 __atomic_pre_full_fence(); 201 ret = arch_atomic_add_return_relaxed(i, v); 202 __atomic_post_full_fence(); 203 return ret; 204} 205#define arch_atomic_add_return arch_atomic_add_return 206#endif 207 208#endif /* arch_atomic_add_return_relaxed */ 209 210#ifndef arch_atomic_fetch_add_relaxed 211#define arch_atomic_fetch_add_acquire arch_atomic_fetch_add 212#define arch_atomic_fetch_add_release arch_atomic_fetch_add 213#define arch_atomic_fetch_add_relaxed arch_atomic_fetch_add 214#else /* arch_atomic_fetch_add_relaxed */ 215 216#ifndef arch_atomic_fetch_add_acquire 217static __always_inline int 218arch_atomic_fetch_add_acquire(int i, atomic_t *v) 219{ 220 int ret = arch_atomic_fetch_add_relaxed(i, v); 221 __atomic_acquire_fence(); 222 return ret; 223} 224#define arch_atomic_fetch_add_acquire arch_atomic_fetch_add_acquire 225#endif 226 227#ifndef arch_atomic_fetch_add_release 228static __always_inline int 229arch_atomic_fetch_add_release(int i, atomic_t *v) 230{ 231 __atomic_release_fence(); 232 return arch_atomic_fetch_add_relaxed(i, v); 233} 234#define arch_atomic_fetch_add_release arch_atomic_fetch_add_release 235#endif 236 237#ifndef arch_atomic_fetch_add 238static __always_inline int 239arch_atomic_fetch_add(int i, atomic_t *v) 240{ 241 int ret; 242 __atomic_pre_full_fence(); 243 ret = arch_atomic_fetch_add_relaxed(i, v); 244 __atomic_post_full_fence(); 245 return ret; 246} 247#define arch_atomic_fetch_add arch_atomic_fetch_add 248#endif 249 250#endif /* arch_atomic_fetch_add_relaxed */ 251 252#ifndef arch_atomic_sub_return_relaxed 253#define arch_atomic_sub_return_acquire arch_atomic_sub_return 254#define arch_atomic_sub_return_release arch_atomic_sub_return 255#define arch_atomic_sub_return_relaxed arch_atomic_sub_return 256#else /* arch_atomic_sub_return_relaxed */ 257 258#ifndef arch_atomic_sub_return_acquire 259static __always_inline int 260arch_atomic_sub_return_acquire(int i, atomic_t *v) 261{ 262 int ret = arch_atomic_sub_return_relaxed(i, v); 263 __atomic_acquire_fence(); 264 return ret; 265} 266#define arch_atomic_sub_return_acquire arch_atomic_sub_return_acquire 267#endif 268 269#ifndef arch_atomic_sub_return_release 270static __always_inline int 271arch_atomic_sub_return_release(int i, atomic_t *v) 272{ 273 __atomic_release_fence(); 274 return arch_atomic_sub_return_relaxed(i, v); 275} 276#define arch_atomic_sub_return_release arch_atomic_sub_return_release 277#endif 278 279#ifndef arch_atomic_sub_return 280static __always_inline int 281arch_atomic_sub_return(int i, atomic_t *v) 282{ 283 int ret; 284 __atomic_pre_full_fence(); 285 ret = arch_atomic_sub_return_relaxed(i, v); 286 __atomic_post_full_fence(); 287 return ret; 288} 289#define arch_atomic_sub_return arch_atomic_sub_return 290#endif 291 292#endif /* arch_atomic_sub_return_relaxed */ 293 294#ifndef arch_atomic_fetch_sub_relaxed 295#define arch_atomic_fetch_sub_acquire arch_atomic_fetch_sub 296#define arch_atomic_fetch_sub_release arch_atomic_fetch_sub 297#define arch_atomic_fetch_sub_relaxed arch_atomic_fetch_sub 298#else /* arch_atomic_fetch_sub_relaxed */ 299 300#ifndef arch_atomic_fetch_sub_acquire 301static __always_inline int 302arch_atomic_fetch_sub_acquire(int i, atomic_t *v) 303{ 304 int ret = arch_atomic_fetch_sub_relaxed(i, v); 305 __atomic_acquire_fence(); 306 return ret; 307} 308#define arch_atomic_fetch_sub_acquire arch_atomic_fetch_sub_acquire 309#endif 310 311#ifndef arch_atomic_fetch_sub_release 312static __always_inline int 313arch_atomic_fetch_sub_release(int i, atomic_t *v) 314{ 315 __atomic_release_fence(); 316 return arch_atomic_fetch_sub_relaxed(i, v); 317} 318#define arch_atomic_fetch_sub_release arch_atomic_fetch_sub_release 319#endif 320 321#ifndef arch_atomic_fetch_sub 322static __always_inline int 323arch_atomic_fetch_sub(int i, atomic_t *v) 324{ 325 int ret; 326 __atomic_pre_full_fence(); 327 ret = arch_atomic_fetch_sub_relaxed(i, v); 328 __atomic_post_full_fence(); 329 return ret; 330} 331#define arch_atomic_fetch_sub arch_atomic_fetch_sub 332#endif 333 334#endif /* arch_atomic_fetch_sub_relaxed */ 335 336#ifndef arch_atomic_inc 337static __always_inline void 338arch_atomic_inc(atomic_t *v) 339{ 340 arch_atomic_add(1, v); 341} 342#define arch_atomic_inc arch_atomic_inc 343#endif 344 345#ifndef arch_atomic_inc_return_relaxed 346#ifdef arch_atomic_inc_return 347#define arch_atomic_inc_return_acquire arch_atomic_inc_return 348#define arch_atomic_inc_return_release arch_atomic_inc_return 349#define arch_atomic_inc_return_relaxed arch_atomic_inc_return 350#endif /* arch_atomic_inc_return */ 351 352#ifndef arch_atomic_inc_return 353static __always_inline int 354arch_atomic_inc_return(atomic_t *v) 355{ 356 return arch_atomic_add_return(1, v); 357} 358#define arch_atomic_inc_return arch_atomic_inc_return 359#endif 360 361#ifndef arch_atomic_inc_return_acquire 362static __always_inline int 363arch_atomic_inc_return_acquire(atomic_t *v) 364{ 365 return arch_atomic_add_return_acquire(1, v); 366} 367#define arch_atomic_inc_return_acquire arch_atomic_inc_return_acquire 368#endif 369 370#ifndef arch_atomic_inc_return_release 371static __always_inline int 372arch_atomic_inc_return_release(atomic_t *v) 373{ 374 return arch_atomic_add_return_release(1, v); 375} 376#define arch_atomic_inc_return_release arch_atomic_inc_return_release 377#endif 378 379#ifndef arch_atomic_inc_return_relaxed 380static __always_inline int 381arch_atomic_inc_return_relaxed(atomic_t *v) 382{ 383 return arch_atomic_add_return_relaxed(1, v); 384} 385#define arch_atomic_inc_return_relaxed arch_atomic_inc_return_relaxed 386#endif 387 388#else /* arch_atomic_inc_return_relaxed */ 389 390#ifndef arch_atomic_inc_return_acquire 391static __always_inline int 392arch_atomic_inc_return_acquire(atomic_t *v) 393{ 394 int ret = arch_atomic_inc_return_relaxed(v); 395 __atomic_acquire_fence(); 396 return ret; 397} 398#define arch_atomic_inc_return_acquire arch_atomic_inc_return_acquire 399#endif 400 401#ifndef arch_atomic_inc_return_release 402static __always_inline int 403arch_atomic_inc_return_release(atomic_t *v) 404{ 405 __atomic_release_fence(); 406 return arch_atomic_inc_return_relaxed(v); 407} 408#define arch_atomic_inc_return_release arch_atomic_inc_return_release 409#endif 410 411#ifndef arch_atomic_inc_return 412static __always_inline int 413arch_atomic_inc_return(atomic_t *v) 414{ 415 int ret; 416 __atomic_pre_full_fence(); 417 ret = arch_atomic_inc_return_relaxed(v); 418 __atomic_post_full_fence(); 419 return ret; 420} 421#define arch_atomic_inc_return arch_atomic_inc_return 422#endif 423 424#endif /* arch_atomic_inc_return_relaxed */ 425 426#ifndef arch_atomic_fetch_inc_relaxed 427#ifdef arch_atomic_fetch_inc 428#define arch_atomic_fetch_inc_acquire arch_atomic_fetch_inc 429#define arch_atomic_fetch_inc_release arch_atomic_fetch_inc 430#define arch_atomic_fetch_inc_relaxed arch_atomic_fetch_inc 431#endif /* arch_atomic_fetch_inc */ 432 433#ifndef arch_atomic_fetch_inc 434static __always_inline int 435arch_atomic_fetch_inc(atomic_t *v) 436{ 437 return arch_atomic_fetch_add(1, v); 438} 439#define arch_atomic_fetch_inc arch_atomic_fetch_inc 440#endif 441 442#ifndef arch_atomic_fetch_inc_acquire 443static __always_inline int 444arch_atomic_fetch_inc_acquire(atomic_t *v) 445{ 446 return arch_atomic_fetch_add_acquire(1, v); 447} 448#define arch_atomic_fetch_inc_acquire arch_atomic_fetch_inc_acquire 449#endif 450 451#ifndef arch_atomic_fetch_inc_release 452static __always_inline int 453arch_atomic_fetch_inc_release(atomic_t *v) 454{ 455 return arch_atomic_fetch_add_release(1, v); 456} 457#define arch_atomic_fetch_inc_release arch_atomic_fetch_inc_release 458#endif 459 460#ifndef arch_atomic_fetch_inc_relaxed 461static __always_inline int 462arch_atomic_fetch_inc_relaxed(atomic_t *v) 463{ 464 return arch_atomic_fetch_add_relaxed(1, v); 465} 466#define arch_atomic_fetch_inc_relaxed arch_atomic_fetch_inc_relaxed 467#endif 468 469#else /* arch_atomic_fetch_inc_relaxed */ 470 471#ifndef arch_atomic_fetch_inc_acquire 472static __always_inline int 473arch_atomic_fetch_inc_acquire(atomic_t *v) 474{ 475 int ret = arch_atomic_fetch_inc_relaxed(v); 476 __atomic_acquire_fence(); 477 return ret; 478} 479#define arch_atomic_fetch_inc_acquire arch_atomic_fetch_inc_acquire 480#endif 481 482#ifndef arch_atomic_fetch_inc_release 483static __always_inline int 484arch_atomic_fetch_inc_release(atomic_t *v) 485{ 486 __atomic_release_fence(); 487 return arch_atomic_fetch_inc_relaxed(v); 488} 489#define arch_atomic_fetch_inc_release arch_atomic_fetch_inc_release 490#endif 491 492#ifndef arch_atomic_fetch_inc 493static __always_inline int 494arch_atomic_fetch_inc(atomic_t *v) 495{ 496 int ret; 497 __atomic_pre_full_fence(); 498 ret = arch_atomic_fetch_inc_relaxed(v); 499 __atomic_post_full_fence(); 500 return ret; 501} 502#define arch_atomic_fetch_inc arch_atomic_fetch_inc 503#endif 504 505#endif /* arch_atomic_fetch_inc_relaxed */ 506 507#ifndef arch_atomic_dec 508static __always_inline void 509arch_atomic_dec(atomic_t *v) 510{ 511 arch_atomic_sub(1, v); 512} 513#define arch_atomic_dec arch_atomic_dec 514#endif 515 516#ifndef arch_atomic_dec_return_relaxed 517#ifdef arch_atomic_dec_return 518#define arch_atomic_dec_return_acquire arch_atomic_dec_return 519#define arch_atomic_dec_return_release arch_atomic_dec_return 520#define arch_atomic_dec_return_relaxed arch_atomic_dec_return 521#endif /* arch_atomic_dec_return */ 522 523#ifndef arch_atomic_dec_return 524static __always_inline int 525arch_atomic_dec_return(atomic_t *v) 526{ 527 return arch_atomic_sub_return(1, v); 528} 529#define arch_atomic_dec_return arch_atomic_dec_return 530#endif 531 532#ifndef arch_atomic_dec_return_acquire 533static __always_inline int 534arch_atomic_dec_return_acquire(atomic_t *v) 535{ 536 return arch_atomic_sub_return_acquire(1, v); 537} 538#define arch_atomic_dec_return_acquire arch_atomic_dec_return_acquire 539#endif 540 541#ifndef arch_atomic_dec_return_release 542static __always_inline int 543arch_atomic_dec_return_release(atomic_t *v) 544{ 545 return arch_atomic_sub_return_release(1, v); 546} 547#define arch_atomic_dec_return_release arch_atomic_dec_return_release 548#endif 549 550#ifndef arch_atomic_dec_return_relaxed 551static __always_inline int 552arch_atomic_dec_return_relaxed(atomic_t *v) 553{ 554 return arch_atomic_sub_return_relaxed(1, v); 555} 556#define arch_atomic_dec_return_relaxed arch_atomic_dec_return_relaxed 557#endif 558 559#else /* arch_atomic_dec_return_relaxed */ 560 561#ifndef arch_atomic_dec_return_acquire 562static __always_inline int 563arch_atomic_dec_return_acquire(atomic_t *v) 564{ 565 int ret = arch_atomic_dec_return_relaxed(v); 566 __atomic_acquire_fence(); 567 return ret; 568} 569#define arch_atomic_dec_return_acquire arch_atomic_dec_return_acquire 570#endif 571 572#ifndef arch_atomic_dec_return_release 573static __always_inline int 574arch_atomic_dec_return_release(atomic_t *v) 575{ 576 __atomic_release_fence(); 577 return arch_atomic_dec_return_relaxed(v); 578} 579#define arch_atomic_dec_return_release arch_atomic_dec_return_release 580#endif 581 582#ifndef arch_atomic_dec_return 583static __always_inline int 584arch_atomic_dec_return(atomic_t *v) 585{ 586 int ret; 587 __atomic_pre_full_fence(); 588 ret = arch_atomic_dec_return_relaxed(v); 589 __atomic_post_full_fence(); 590 return ret; 591} 592#define arch_atomic_dec_return arch_atomic_dec_return 593#endif 594 595#endif /* arch_atomic_dec_return_relaxed */ 596 597#ifndef arch_atomic_fetch_dec_relaxed 598#ifdef arch_atomic_fetch_dec 599#define arch_atomic_fetch_dec_acquire arch_atomic_fetch_dec 600#define arch_atomic_fetch_dec_release arch_atomic_fetch_dec 601#define arch_atomic_fetch_dec_relaxed arch_atomic_fetch_dec 602#endif /* arch_atomic_fetch_dec */ 603 604#ifndef arch_atomic_fetch_dec 605static __always_inline int 606arch_atomic_fetch_dec(atomic_t *v) 607{ 608 return arch_atomic_fetch_sub(1, v); 609} 610#define arch_atomic_fetch_dec arch_atomic_fetch_dec 611#endif 612 613#ifndef arch_atomic_fetch_dec_acquire 614static __always_inline int 615arch_atomic_fetch_dec_acquire(atomic_t *v) 616{ 617 return arch_atomic_fetch_sub_acquire(1, v); 618} 619#define arch_atomic_fetch_dec_acquire arch_atomic_fetch_dec_acquire 620#endif 621 622#ifndef arch_atomic_fetch_dec_release 623static __always_inline int 624arch_atomic_fetch_dec_release(atomic_t *v) 625{ 626 return arch_atomic_fetch_sub_release(1, v); 627} 628#define arch_atomic_fetch_dec_release arch_atomic_fetch_dec_release 629#endif 630 631#ifndef arch_atomic_fetch_dec_relaxed 632static __always_inline int 633arch_atomic_fetch_dec_relaxed(atomic_t *v) 634{ 635 return arch_atomic_fetch_sub_relaxed(1, v); 636} 637#define arch_atomic_fetch_dec_relaxed arch_atomic_fetch_dec_relaxed 638#endif 639 640#else /* arch_atomic_fetch_dec_relaxed */ 641 642#ifndef arch_atomic_fetch_dec_acquire 643static __always_inline int 644arch_atomic_fetch_dec_acquire(atomic_t *v) 645{ 646 int ret = arch_atomic_fetch_dec_relaxed(v); 647 __atomic_acquire_fence(); 648 return ret; 649} 650#define arch_atomic_fetch_dec_acquire arch_atomic_fetch_dec_acquire 651#endif 652 653#ifndef arch_atomic_fetch_dec_release 654static __always_inline int 655arch_atomic_fetch_dec_release(atomic_t *v) 656{ 657 __atomic_release_fence(); 658 return arch_atomic_fetch_dec_relaxed(v); 659} 660#define arch_atomic_fetch_dec_release arch_atomic_fetch_dec_release 661#endif 662 663#ifndef arch_atomic_fetch_dec 664static __always_inline int 665arch_atomic_fetch_dec(atomic_t *v) 666{ 667 int ret; 668 __atomic_pre_full_fence(); 669 ret = arch_atomic_fetch_dec_relaxed(v); 670 __atomic_post_full_fence(); 671 return ret; 672} 673#define arch_atomic_fetch_dec arch_atomic_fetch_dec 674#endif 675 676#endif /* arch_atomic_fetch_dec_relaxed */ 677 678#ifndef arch_atomic_fetch_and_relaxed 679#define arch_atomic_fetch_and_acquire arch_atomic_fetch_and 680#define arch_atomic_fetch_and_release arch_atomic_fetch_and 681#define arch_atomic_fetch_and_relaxed arch_atomic_fetch_and 682#else /* arch_atomic_fetch_and_relaxed */ 683 684#ifndef arch_atomic_fetch_and_acquire 685static __always_inline int 686arch_atomic_fetch_and_acquire(int i, atomic_t *v) 687{ 688 int ret = arch_atomic_fetch_and_relaxed(i, v); 689 __atomic_acquire_fence(); 690 return ret; 691} 692#define arch_atomic_fetch_and_acquire arch_atomic_fetch_and_acquire 693#endif 694 695#ifndef arch_atomic_fetch_and_release 696static __always_inline int 697arch_atomic_fetch_and_release(int i, atomic_t *v) 698{ 699 __atomic_release_fence(); 700 return arch_atomic_fetch_and_relaxed(i, v); 701} 702#define arch_atomic_fetch_and_release arch_atomic_fetch_and_release 703#endif 704 705#ifndef arch_atomic_fetch_and 706static __always_inline int 707arch_atomic_fetch_and(int i, atomic_t *v) 708{ 709 int ret; 710 __atomic_pre_full_fence(); 711 ret = arch_atomic_fetch_and_relaxed(i, v); 712 __atomic_post_full_fence(); 713 return ret; 714} 715#define arch_atomic_fetch_and arch_atomic_fetch_and 716#endif 717 718#endif /* arch_atomic_fetch_and_relaxed */ 719 720#ifndef arch_atomic_andnot 721static __always_inline void 722arch_atomic_andnot(int i, atomic_t *v) 723{ 724 arch_atomic_and(~i, v); 725} 726#define arch_atomic_andnot arch_atomic_andnot 727#endif 728 729#ifndef arch_atomic_fetch_andnot_relaxed 730#ifdef arch_atomic_fetch_andnot 731#define arch_atomic_fetch_andnot_acquire arch_atomic_fetch_andnot 732#define arch_atomic_fetch_andnot_release arch_atomic_fetch_andnot 733#define arch_atomic_fetch_andnot_relaxed arch_atomic_fetch_andnot 734#endif /* arch_atomic_fetch_andnot */ 735 736#ifndef arch_atomic_fetch_andnot 737static __always_inline int 738arch_atomic_fetch_andnot(int i, atomic_t *v) 739{ 740 return arch_atomic_fetch_and(~i, v); 741} 742#define arch_atomic_fetch_andnot arch_atomic_fetch_andnot 743#endif 744 745#ifndef arch_atomic_fetch_andnot_acquire 746static __always_inline int 747arch_atomic_fetch_andnot_acquire(int i, atomic_t *v) 748{ 749 return arch_atomic_fetch_and_acquire(~i, v); 750} 751#define arch_atomic_fetch_andnot_acquire arch_atomic_fetch_andnot_acquire 752#endif 753 754#ifndef arch_atomic_fetch_andnot_release 755static __always_inline int 756arch_atomic_fetch_andnot_release(int i, atomic_t *v) 757{ 758 return arch_atomic_fetch_and_release(~i, v); 759} 760#define arch_atomic_fetch_andnot_release arch_atomic_fetch_andnot_release 761#endif 762 763#ifndef arch_atomic_fetch_andnot_relaxed 764static __always_inline int 765arch_atomic_fetch_andnot_relaxed(int i, atomic_t *v) 766{ 767 return arch_atomic_fetch_and_relaxed(~i, v); 768} 769#define arch_atomic_fetch_andnot_relaxed arch_atomic_fetch_andnot_relaxed 770#endif 771 772#else /* arch_atomic_fetch_andnot_relaxed */ 773 774#ifndef arch_atomic_fetch_andnot_acquire 775static __always_inline int 776arch_atomic_fetch_andnot_acquire(int i, atomic_t *v) 777{ 778 int ret = arch_atomic_fetch_andnot_relaxed(i, v); 779 __atomic_acquire_fence(); 780 return ret; 781} 782#define arch_atomic_fetch_andnot_acquire arch_atomic_fetch_andnot_acquire 783#endif 784 785#ifndef arch_atomic_fetch_andnot_release 786static __always_inline int 787arch_atomic_fetch_andnot_release(int i, atomic_t *v) 788{ 789 __atomic_release_fence(); 790 return arch_atomic_fetch_andnot_relaxed(i, v); 791} 792#define arch_atomic_fetch_andnot_release arch_atomic_fetch_andnot_release 793#endif 794 795#ifndef arch_atomic_fetch_andnot 796static __always_inline int 797arch_atomic_fetch_andnot(int i, atomic_t *v) 798{ 799 int ret; 800 __atomic_pre_full_fence(); 801 ret = arch_atomic_fetch_andnot_relaxed(i, v); 802 __atomic_post_full_fence(); 803 return ret; 804} 805#define arch_atomic_fetch_andnot arch_atomic_fetch_andnot 806#endif 807 808#endif /* arch_atomic_fetch_andnot_relaxed */ 809 810#ifndef arch_atomic_fetch_or_relaxed 811#define arch_atomic_fetch_or_acquire arch_atomic_fetch_or 812#define arch_atomic_fetch_or_release arch_atomic_fetch_or 813#define arch_atomic_fetch_or_relaxed arch_atomic_fetch_or 814#else /* arch_atomic_fetch_or_relaxed */ 815 816#ifndef arch_atomic_fetch_or_acquire 817static __always_inline int 818arch_atomic_fetch_or_acquire(int i, atomic_t *v) 819{ 820 int ret = arch_atomic_fetch_or_relaxed(i, v); 821 __atomic_acquire_fence(); 822 return ret; 823} 824#define arch_atomic_fetch_or_acquire arch_atomic_fetch_or_acquire 825#endif 826 827#ifndef arch_atomic_fetch_or_release 828static __always_inline int 829arch_atomic_fetch_or_release(int i, atomic_t *v) 830{ 831 __atomic_release_fence(); 832 return arch_atomic_fetch_or_relaxed(i, v); 833} 834#define arch_atomic_fetch_or_release arch_atomic_fetch_or_release 835#endif 836 837#ifndef arch_atomic_fetch_or 838static __always_inline int 839arch_atomic_fetch_or(int i, atomic_t *v) 840{ 841 int ret; 842 __atomic_pre_full_fence(); 843 ret = arch_atomic_fetch_or_relaxed(i, v); 844 __atomic_post_full_fence(); 845 return ret; 846} 847#define arch_atomic_fetch_or arch_atomic_fetch_or 848#endif 849 850#endif /* arch_atomic_fetch_or_relaxed */ 851 852#ifndef arch_atomic_fetch_xor_relaxed 853#define arch_atomic_fetch_xor_acquire arch_atomic_fetch_xor 854#define arch_atomic_fetch_xor_release arch_atomic_fetch_xor 855#define arch_atomic_fetch_xor_relaxed arch_atomic_fetch_xor 856#else /* arch_atomic_fetch_xor_relaxed */ 857 858#ifndef arch_atomic_fetch_xor_acquire 859static __always_inline int 860arch_atomic_fetch_xor_acquire(int i, atomic_t *v) 861{ 862 int ret = arch_atomic_fetch_xor_relaxed(i, v); 863 __atomic_acquire_fence(); 864 return ret; 865} 866#define arch_atomic_fetch_xor_acquire arch_atomic_fetch_xor_acquire 867#endif 868 869#ifndef arch_atomic_fetch_xor_release 870static __always_inline int 871arch_atomic_fetch_xor_release(int i, atomic_t *v) 872{ 873 __atomic_release_fence(); 874 return arch_atomic_fetch_xor_relaxed(i, v); 875} 876#define arch_atomic_fetch_xor_release arch_atomic_fetch_xor_release 877#endif 878 879#ifndef arch_atomic_fetch_xor 880static __always_inline int 881arch_atomic_fetch_xor(int i, atomic_t *v) 882{ 883 int ret; 884 __atomic_pre_full_fence(); 885 ret = arch_atomic_fetch_xor_relaxed(i, v); 886 __atomic_post_full_fence(); 887 return ret; 888} 889#define arch_atomic_fetch_xor arch_atomic_fetch_xor 890#endif 891 892#endif /* arch_atomic_fetch_xor_relaxed */ 893 894#ifndef arch_atomic_xchg_relaxed 895#define arch_atomic_xchg_acquire arch_atomic_xchg 896#define arch_atomic_xchg_release arch_atomic_xchg 897#define arch_atomic_xchg_relaxed arch_atomic_xchg 898#else /* arch_atomic_xchg_relaxed */ 899 900#ifndef arch_atomic_xchg_acquire 901static __always_inline int 902arch_atomic_xchg_acquire(atomic_t *v, int i) 903{ 904 int ret = arch_atomic_xchg_relaxed(v, i); 905 __atomic_acquire_fence(); 906 return ret; 907} 908#define arch_atomic_xchg_acquire arch_atomic_xchg_acquire 909#endif 910 911#ifndef arch_atomic_xchg_release 912static __always_inline int 913arch_atomic_xchg_release(atomic_t *v, int i) 914{ 915 __atomic_release_fence(); 916 return arch_atomic_xchg_relaxed(v, i); 917} 918#define arch_atomic_xchg_release arch_atomic_xchg_release 919#endif 920 921#ifndef arch_atomic_xchg 922static __always_inline int 923arch_atomic_xchg(atomic_t *v, int i) 924{ 925 int ret; 926 __atomic_pre_full_fence(); 927 ret = arch_atomic_xchg_relaxed(v, i); 928 __atomic_post_full_fence(); 929 return ret; 930} 931#define arch_atomic_xchg arch_atomic_xchg 932#endif 933 934#endif /* arch_atomic_xchg_relaxed */ 935 936#ifndef arch_atomic_cmpxchg_relaxed 937#define arch_atomic_cmpxchg_acquire arch_atomic_cmpxchg 938#define arch_atomic_cmpxchg_release arch_atomic_cmpxchg 939#define arch_atomic_cmpxchg_relaxed arch_atomic_cmpxchg 940#else /* arch_atomic_cmpxchg_relaxed */ 941 942#ifndef arch_atomic_cmpxchg_acquire 943static __always_inline int 944arch_atomic_cmpxchg_acquire(atomic_t *v, int old, int new) 945{ 946 int ret = arch_atomic_cmpxchg_relaxed(v, old, new); 947 __atomic_acquire_fence(); 948 return ret; 949} 950#define arch_atomic_cmpxchg_acquire arch_atomic_cmpxchg_acquire 951#endif 952 953#ifndef arch_atomic_cmpxchg_release 954static __always_inline int 955arch_atomic_cmpxchg_release(atomic_t *v, int old, int new) 956{ 957 __atomic_release_fence(); 958 return arch_atomic_cmpxchg_relaxed(v, old, new); 959} 960#define arch_atomic_cmpxchg_release arch_atomic_cmpxchg_release 961#endif 962 963#ifndef arch_atomic_cmpxchg 964static __always_inline int 965arch_atomic_cmpxchg(atomic_t *v, int old, int new) 966{ 967 int ret; 968 __atomic_pre_full_fence(); 969 ret = arch_atomic_cmpxchg_relaxed(v, old, new); 970 __atomic_post_full_fence(); 971 return ret; 972} 973#define arch_atomic_cmpxchg arch_atomic_cmpxchg 974#endif 975 976#endif /* arch_atomic_cmpxchg_relaxed */ 977 978#ifndef arch_atomic_try_cmpxchg_relaxed 979#ifdef arch_atomic_try_cmpxchg 980#define arch_atomic_try_cmpxchg_acquire arch_atomic_try_cmpxchg 981#define arch_atomic_try_cmpxchg_release arch_atomic_try_cmpxchg 982#define arch_atomic_try_cmpxchg_relaxed arch_atomic_try_cmpxchg 983#endif /* arch_atomic_try_cmpxchg */ 984 985#ifndef arch_atomic_try_cmpxchg 986static __always_inline bool 987arch_atomic_try_cmpxchg(atomic_t *v, int *old, int new) 988{ 989 int r, o = *old; 990 r = arch_atomic_cmpxchg(v, o, new); 991 if (unlikely(r != o)) 992 *old = r; 993 return likely(r == o); 994} 995#define arch_atomic_try_cmpxchg arch_atomic_try_cmpxchg 996#endif 997 998#ifndef arch_atomic_try_cmpxchg_acquire 999static __always_inline bool 1000arch_atomic_try_cmpxchg_acquire(atomic_t *v, int *old, int new) 1001{ 1002 int r, o = *old; 1003 r = arch_atomic_cmpxchg_acquire(v, o, new); 1004 if (unlikely(r != o)) 1005 *old = r; 1006 return likely(r == o); 1007} 1008#define arch_atomic_try_cmpxchg_acquire arch_atomic_try_cmpxchg_acquire 1009#endif 1010 1011#ifndef arch_atomic_try_cmpxchg_release 1012static __always_inline bool 1013arch_atomic_try_cmpxchg_release(atomic_t *v, int *old, int new) 1014{ 1015 int r, o = *old; 1016 r = arch_atomic_cmpxchg_release(v, o, new); 1017 if (unlikely(r != o)) 1018 *old = r; 1019 return likely(r == o); 1020} 1021#define arch_atomic_try_cmpxchg_release arch_atomic_try_cmpxchg_release 1022#endif 1023 1024#ifndef arch_atomic_try_cmpxchg_relaxed 1025static __always_inline bool 1026arch_atomic_try_cmpxchg_relaxed(atomic_t *v, int *old, int new) 1027{ 1028 int r, o = *old; 1029 r = arch_atomic_cmpxchg_relaxed(v, o, new); 1030 if (unlikely(r != o)) 1031 *old = r; 1032 return likely(r == o); 1033} 1034#define arch_atomic_try_cmpxchg_relaxed arch_atomic_try_cmpxchg_relaxed 1035#endif 1036 1037#else /* arch_atomic_try_cmpxchg_relaxed */ 1038 1039#ifndef arch_atomic_try_cmpxchg_acquire 1040static __always_inline bool 1041arch_atomic_try_cmpxchg_acquire(atomic_t *v, int *old, int new) 1042{ 1043 bool ret = arch_atomic_try_cmpxchg_relaxed(v, old, new); 1044 __atomic_acquire_fence(); 1045 return ret; 1046} 1047#define arch_atomic_try_cmpxchg_acquire arch_atomic_try_cmpxchg_acquire 1048#endif 1049 1050#ifndef arch_atomic_try_cmpxchg_release 1051static __always_inline bool 1052arch_atomic_try_cmpxchg_release(atomic_t *v, int *old, int new) 1053{ 1054 __atomic_release_fence(); 1055 return arch_atomic_try_cmpxchg_relaxed(v, old, new); 1056} 1057#define arch_atomic_try_cmpxchg_release arch_atomic_try_cmpxchg_release 1058#endif 1059 1060#ifndef arch_atomic_try_cmpxchg 1061static __always_inline bool 1062arch_atomic_try_cmpxchg(atomic_t *v, int *old, int new) 1063{ 1064 bool ret; 1065 __atomic_pre_full_fence(); 1066 ret = arch_atomic_try_cmpxchg_relaxed(v, old, new); 1067 __atomic_post_full_fence(); 1068 return ret; 1069} 1070#define arch_atomic_try_cmpxchg arch_atomic_try_cmpxchg 1071#endif 1072 1073#endif /* arch_atomic_try_cmpxchg_relaxed */ 1074 1075#ifndef arch_atomic_sub_and_test 1076/** 1077 * arch_atomic_sub_and_test - subtract value from variable and test result 1078 * @i: integer value to subtract 1079 * @v: pointer of type atomic_t 1080 * 1081 * Atomically subtracts @i from @v and returns 1082 * true if the result is zero, or false for all 1083 * other cases. 1084 */ 1085static __always_inline bool 1086arch_atomic_sub_and_test(int i, atomic_t *v) 1087{ 1088 return arch_atomic_sub_return(i, v) == 0; 1089} 1090#define arch_atomic_sub_and_test arch_atomic_sub_and_test 1091#endif 1092 1093#ifndef arch_atomic_dec_and_test 1094/** 1095 * arch_atomic_dec_and_test - decrement and test 1096 * @v: pointer of type atomic_t 1097 * 1098 * Atomically decrements @v by 1 and 1099 * returns true if the result is 0, or false for all other 1100 * cases. 1101 */ 1102static __always_inline bool 1103arch_atomic_dec_and_test(atomic_t *v) 1104{ 1105 return arch_atomic_dec_return(v) == 0; 1106} 1107#define arch_atomic_dec_and_test arch_atomic_dec_and_test 1108#endif 1109 1110#ifndef arch_atomic_inc_and_test 1111/** 1112 * arch_atomic_inc_and_test - increment and test 1113 * @v: pointer of type atomic_t 1114 * 1115 * Atomically increments @v by 1 1116 * and returns true if the result is zero, or false for all 1117 * other cases. 1118 */ 1119static __always_inline bool 1120arch_atomic_inc_and_test(atomic_t *v) 1121{ 1122 return arch_atomic_inc_return(v) == 0; 1123} 1124#define arch_atomic_inc_and_test arch_atomic_inc_and_test 1125#endif 1126 1127#ifndef arch_atomic_add_negative 1128/** 1129 * arch_atomic_add_negative - add and test if negative 1130 * @i: integer value to add 1131 * @v: pointer of type atomic_t 1132 * 1133 * Atomically adds @i to @v and returns true 1134 * if the result is negative, or false when 1135 * result is greater than or equal to zero. 1136 */ 1137static __always_inline bool 1138arch_atomic_add_negative(int i, atomic_t *v) 1139{ 1140 return arch_atomic_add_return(i, v) < 0; 1141} 1142#define arch_atomic_add_negative arch_atomic_add_negative 1143#endif 1144 1145#ifndef arch_atomic_fetch_add_unless 1146/** 1147 * arch_atomic_fetch_add_unless - add unless the number is already a given value 1148 * @v: pointer of type atomic_t 1149 * @a: the amount to add to v... 1150 * @u: ...unless v is equal to u. 1151 * 1152 * Atomically adds @a to @v, so long as @v was not already @u. 1153 * Returns original value of @v 1154 */ 1155static __always_inline int 1156arch_atomic_fetch_add_unless(atomic_t *v, int a, int u) 1157{ 1158 int c = arch_atomic_read(v); 1159 1160 do { 1161 if (unlikely(c == u)) 1162 break; 1163 } while (!arch_atomic_try_cmpxchg(v, &c, c + a)); 1164 1165 return c; 1166} 1167#define arch_atomic_fetch_add_unless arch_atomic_fetch_add_unless 1168#endif 1169 1170#ifndef arch_atomic_add_unless 1171/** 1172 * arch_atomic_add_unless - add unless the number is already a given value 1173 * @v: pointer of type atomic_t 1174 * @a: the amount to add to v... 1175 * @u: ...unless v is equal to u. 1176 * 1177 * Atomically adds @a to @v, if @v was not already @u. 1178 * Returns true if the addition was done. 1179 */ 1180static __always_inline bool 1181arch_atomic_add_unless(atomic_t *v, int a, int u) 1182{ 1183 return arch_atomic_fetch_add_unless(v, a, u) != u; 1184} 1185#define arch_atomic_add_unless arch_atomic_add_unless 1186#endif 1187 1188#ifndef arch_atomic_inc_not_zero 1189/** 1190 * arch_atomic_inc_not_zero - increment unless the number is zero 1191 * @v: pointer of type atomic_t 1192 * 1193 * Atomically increments @v by 1, if @v is non-zero. 1194 * Returns true if the increment was done. 1195 */ 1196static __always_inline bool 1197arch_atomic_inc_not_zero(atomic_t *v) 1198{ 1199 return arch_atomic_add_unless(v, 1, 0); 1200} 1201#define arch_atomic_inc_not_zero arch_atomic_inc_not_zero 1202#endif 1203 1204#ifndef arch_atomic_inc_unless_negative 1205static __always_inline bool 1206arch_atomic_inc_unless_negative(atomic_t *v) 1207{ 1208 int c = arch_atomic_read(v); 1209 1210 do { 1211 if (unlikely(c < 0)) 1212 return false; 1213 } while (!arch_atomic_try_cmpxchg(v, &c, c + 1)); 1214 1215 return true; 1216} 1217#define arch_atomic_inc_unless_negative arch_atomic_inc_unless_negative 1218#endif 1219 1220#ifndef arch_atomic_dec_unless_positive 1221static __always_inline bool 1222arch_atomic_dec_unless_positive(atomic_t *v) 1223{ 1224 int c = arch_atomic_read(v); 1225 1226 do { 1227 if (unlikely(c > 0)) 1228 return false; 1229 } while (!arch_atomic_try_cmpxchg(v, &c, c - 1)); 1230 1231 return true; 1232} 1233#define arch_atomic_dec_unless_positive arch_atomic_dec_unless_positive 1234#endif 1235 1236#ifndef arch_atomic_dec_if_positive 1237static __always_inline int 1238arch_atomic_dec_if_positive(atomic_t *v) 1239{ 1240 int dec, c = arch_atomic_read(v); 1241 1242 do { 1243 dec = c - 1; 1244 if (unlikely(dec < 0)) 1245 break; 1246 } while (!arch_atomic_try_cmpxchg(v, &c, dec)); 1247 1248 return dec; 1249} 1250#define arch_atomic_dec_if_positive arch_atomic_dec_if_positive 1251#endif 1252 1253#ifdef CONFIG_GENERIC_ATOMIC64 1254#include <asm-generic/atomic64.h> 1255#endif 1256 1257#ifndef arch_atomic64_read_acquire 1258static __always_inline s64 1259arch_atomic64_read_acquire(const atomic64_t *v) 1260{ 1261 return smp_load_acquire(&(v)->counter); 1262} 1263#define arch_atomic64_read_acquire arch_atomic64_read_acquire 1264#endif 1265 1266#ifndef arch_atomic64_set_release 1267static __always_inline void 1268arch_atomic64_set_release(atomic64_t *v, s64 i) 1269{ 1270 smp_store_release(&(v)->counter, i); 1271} 1272#define arch_atomic64_set_release arch_atomic64_set_release 1273#endif 1274 1275#ifndef arch_atomic64_add_return_relaxed 1276#define arch_atomic64_add_return_acquire arch_atomic64_add_return 1277#define arch_atomic64_add_return_release arch_atomic64_add_return 1278#define arch_atomic64_add_return_relaxed arch_atomic64_add_return 1279#else /* arch_atomic64_add_return_relaxed */ 1280 1281#ifndef arch_atomic64_add_return_acquire 1282static __always_inline s64 1283arch_atomic64_add_return_acquire(s64 i, atomic64_t *v) 1284{ 1285 s64 ret = arch_atomic64_add_return_relaxed(i, v); 1286 __atomic_acquire_fence(); 1287 return ret; 1288} 1289#define arch_atomic64_add_return_acquire arch_atomic64_add_return_acquire 1290#endif 1291 1292#ifndef arch_atomic64_add_return_release 1293static __always_inline s64 1294arch_atomic64_add_return_release(s64 i, atomic64_t *v) 1295{ 1296 __atomic_release_fence(); 1297 return arch_atomic64_add_return_relaxed(i, v); 1298} 1299#define arch_atomic64_add_return_release arch_atomic64_add_return_release 1300#endif 1301 1302#ifndef arch_atomic64_add_return 1303static __always_inline s64 1304arch_atomic64_add_return(s64 i, atomic64_t *v) 1305{ 1306 s64 ret; 1307 __atomic_pre_full_fence(); 1308 ret = arch_atomic64_add_return_relaxed(i, v); 1309 __atomic_post_full_fence(); 1310 return ret; 1311} 1312#define arch_atomic64_add_return arch_atomic64_add_return 1313#endif 1314 1315#endif /* arch_atomic64_add_return_relaxed */ 1316 1317#ifndef arch_atomic64_fetch_add_relaxed 1318#define arch_atomic64_fetch_add_acquire arch_atomic64_fetch_add 1319#define arch_atomic64_fetch_add_release arch_atomic64_fetch_add 1320#define arch_atomic64_fetch_add_relaxed arch_atomic64_fetch_add 1321#else /* arch_atomic64_fetch_add_relaxed */ 1322 1323#ifndef arch_atomic64_fetch_add_acquire 1324static __always_inline s64 1325arch_atomic64_fetch_add_acquire(s64 i, atomic64_t *v) 1326{ 1327 s64 ret = arch_atomic64_fetch_add_relaxed(i, v); 1328 __atomic_acquire_fence(); 1329 return ret; 1330} 1331#define arch_atomic64_fetch_add_acquire arch_atomic64_fetch_add_acquire 1332#endif 1333 1334#ifndef arch_atomic64_fetch_add_release 1335static __always_inline s64 1336arch_atomic64_fetch_add_release(s64 i, atomic64_t *v) 1337{ 1338 __atomic_release_fence(); 1339 return arch_atomic64_fetch_add_relaxed(i, v); 1340} 1341#define arch_atomic64_fetch_add_release arch_atomic64_fetch_add_release 1342#endif 1343 1344#ifndef arch_atomic64_fetch_add 1345static __always_inline s64 1346arch_atomic64_fetch_add(s64 i, atomic64_t *v) 1347{ 1348 s64 ret; 1349 __atomic_pre_full_fence(); 1350 ret = arch_atomic64_fetch_add_relaxed(i, v); 1351 __atomic_post_full_fence(); 1352 return ret; 1353} 1354#define arch_atomic64_fetch_add arch_atomic64_fetch_add 1355#endif 1356 1357#endif /* arch_atomic64_fetch_add_relaxed */ 1358 1359#ifndef arch_atomic64_sub_return_relaxed 1360#define arch_atomic64_sub_return_acquire arch_atomic64_sub_return 1361#define arch_atomic64_sub_return_release arch_atomic64_sub_return 1362#define arch_atomic64_sub_return_relaxed arch_atomic64_sub_return 1363#else /* arch_atomic64_sub_return_relaxed */ 1364 1365#ifndef arch_atomic64_sub_return_acquire 1366static __always_inline s64 1367arch_atomic64_sub_return_acquire(s64 i, atomic64_t *v) 1368{ 1369 s64 ret = arch_atomic64_sub_return_relaxed(i, v); 1370 __atomic_acquire_fence(); 1371 return ret; 1372} 1373#define arch_atomic64_sub_return_acquire arch_atomic64_sub_return_acquire 1374#endif 1375 1376#ifndef arch_atomic64_sub_return_release 1377static __always_inline s64 1378arch_atomic64_sub_return_release(s64 i, atomic64_t *v) 1379{ 1380 __atomic_release_fence(); 1381 return arch_atomic64_sub_return_relaxed(i, v); 1382} 1383#define arch_atomic64_sub_return_release arch_atomic64_sub_return_release 1384#endif 1385 1386#ifndef arch_atomic64_sub_return 1387static __always_inline s64 1388arch_atomic64_sub_return(s64 i, atomic64_t *v) 1389{ 1390 s64 ret; 1391 __atomic_pre_full_fence(); 1392 ret = arch_atomic64_sub_return_relaxed(i, v); 1393 __atomic_post_full_fence(); 1394 return ret; 1395} 1396#define arch_atomic64_sub_return arch_atomic64_sub_return 1397#endif 1398 1399#endif /* arch_atomic64_sub_return_relaxed */ 1400 1401#ifndef arch_atomic64_fetch_sub_relaxed 1402#define arch_atomic64_fetch_sub_acquire arch_atomic64_fetch_sub 1403#define arch_atomic64_fetch_sub_release arch_atomic64_fetch_sub 1404#define arch_atomic64_fetch_sub_relaxed arch_atomic64_fetch_sub 1405#else /* arch_atomic64_fetch_sub_relaxed */ 1406 1407#ifndef arch_atomic64_fetch_sub_acquire 1408static __always_inline s64 1409arch_atomic64_fetch_sub_acquire(s64 i, atomic64_t *v) 1410{ 1411 s64 ret = arch_atomic64_fetch_sub_relaxed(i, v); 1412 __atomic_acquire_fence(); 1413 return ret; 1414} 1415#define arch_atomic64_fetch_sub_acquire arch_atomic64_fetch_sub_acquire 1416#endif 1417 1418#ifndef arch_atomic64_fetch_sub_release 1419static __always_inline s64 1420arch_atomic64_fetch_sub_release(s64 i, atomic64_t *v) 1421{ 1422 __atomic_release_fence(); 1423 return arch_atomic64_fetch_sub_relaxed(i, v); 1424} 1425#define arch_atomic64_fetch_sub_release arch_atomic64_fetch_sub_release 1426#endif 1427 1428#ifndef arch_atomic64_fetch_sub 1429static __always_inline s64 1430arch_atomic64_fetch_sub(s64 i, atomic64_t *v) 1431{ 1432 s64 ret; 1433 __atomic_pre_full_fence(); 1434 ret = arch_atomic64_fetch_sub_relaxed(i, v); 1435 __atomic_post_full_fence(); 1436 return ret; 1437} 1438#define arch_atomic64_fetch_sub arch_atomic64_fetch_sub 1439#endif 1440 1441#endif /* arch_atomic64_fetch_sub_relaxed */ 1442 1443#ifndef arch_atomic64_inc 1444static __always_inline void 1445arch_atomic64_inc(atomic64_t *v) 1446{ 1447 arch_atomic64_add(1, v); 1448} 1449#define arch_atomic64_inc arch_atomic64_inc 1450#endif 1451 1452#ifndef arch_atomic64_inc_return_relaxed 1453#ifdef arch_atomic64_inc_return 1454#define arch_atomic64_inc_return_acquire arch_atomic64_inc_return 1455#define arch_atomic64_inc_return_release arch_atomic64_inc_return 1456#define arch_atomic64_inc_return_relaxed arch_atomic64_inc_return 1457#endif /* arch_atomic64_inc_return */ 1458 1459#ifndef arch_atomic64_inc_return 1460static __always_inline s64 1461arch_atomic64_inc_return(atomic64_t *v) 1462{ 1463 return arch_atomic64_add_return(1, v); 1464} 1465#define arch_atomic64_inc_return arch_atomic64_inc_return 1466#endif 1467 1468#ifndef arch_atomic64_inc_return_acquire 1469static __always_inline s64 1470arch_atomic64_inc_return_acquire(atomic64_t *v) 1471{ 1472 return arch_atomic64_add_return_acquire(1, v); 1473} 1474#define arch_atomic64_inc_return_acquire arch_atomic64_inc_return_acquire 1475#endif 1476 1477#ifndef arch_atomic64_inc_return_release 1478static __always_inline s64 1479arch_atomic64_inc_return_release(atomic64_t *v) 1480{ 1481 return arch_atomic64_add_return_release(1, v); 1482} 1483#define arch_atomic64_inc_return_release arch_atomic64_inc_return_release 1484#endif 1485 1486#ifndef arch_atomic64_inc_return_relaxed 1487static __always_inline s64 1488arch_atomic64_inc_return_relaxed(atomic64_t *v) 1489{ 1490 return arch_atomic64_add_return_relaxed(1, v); 1491} 1492#define arch_atomic64_inc_return_relaxed arch_atomic64_inc_return_relaxed 1493#endif 1494 1495#else /* arch_atomic64_inc_return_relaxed */ 1496 1497#ifndef arch_atomic64_inc_return_acquire 1498static __always_inline s64 1499arch_atomic64_inc_return_acquire(atomic64_t *v) 1500{ 1501 s64 ret = arch_atomic64_inc_return_relaxed(v); 1502 __atomic_acquire_fence(); 1503 return ret; 1504} 1505#define arch_atomic64_inc_return_acquire arch_atomic64_inc_return_acquire 1506#endif 1507 1508#ifndef arch_atomic64_inc_return_release 1509static __always_inline s64 1510arch_atomic64_inc_return_release(atomic64_t *v) 1511{ 1512 __atomic_release_fence(); 1513 return arch_atomic64_inc_return_relaxed(v); 1514} 1515#define arch_atomic64_inc_return_release arch_atomic64_inc_return_release 1516#endif 1517 1518#ifndef arch_atomic64_inc_return 1519static __always_inline s64 1520arch_atomic64_inc_return(atomic64_t *v) 1521{ 1522 s64 ret; 1523 __atomic_pre_full_fence(); 1524 ret = arch_atomic64_inc_return_relaxed(v); 1525 __atomic_post_full_fence(); 1526 return ret; 1527} 1528#define arch_atomic64_inc_return arch_atomic64_inc_return 1529#endif 1530 1531#endif /* arch_atomic64_inc_return_relaxed */ 1532 1533#ifndef arch_atomic64_fetch_inc_relaxed 1534#ifdef arch_atomic64_fetch_inc 1535#define arch_atomic64_fetch_inc_acquire arch_atomic64_fetch_inc 1536#define arch_atomic64_fetch_inc_release arch_atomic64_fetch_inc 1537#define arch_atomic64_fetch_inc_relaxed arch_atomic64_fetch_inc 1538#endif /* arch_atomic64_fetch_inc */ 1539 1540#ifndef arch_atomic64_fetch_inc 1541static __always_inline s64 1542arch_atomic64_fetch_inc(atomic64_t *v) 1543{ 1544 return arch_atomic64_fetch_add(1, v); 1545} 1546#define arch_atomic64_fetch_inc arch_atomic64_fetch_inc 1547#endif 1548 1549#ifndef arch_atomic64_fetch_inc_acquire 1550static __always_inline s64 1551arch_atomic64_fetch_inc_acquire(atomic64_t *v) 1552{ 1553 return arch_atomic64_fetch_add_acquire(1, v); 1554} 1555#define arch_atomic64_fetch_inc_acquire arch_atomic64_fetch_inc_acquire 1556#endif 1557 1558#ifndef arch_atomic64_fetch_inc_release 1559static __always_inline s64 1560arch_atomic64_fetch_inc_release(atomic64_t *v) 1561{ 1562 return arch_atomic64_fetch_add_release(1, v); 1563} 1564#define arch_atomic64_fetch_inc_release arch_atomic64_fetch_inc_release 1565#endif 1566 1567#ifndef arch_atomic64_fetch_inc_relaxed 1568static __always_inline s64 1569arch_atomic64_fetch_inc_relaxed(atomic64_t *v) 1570{ 1571 return arch_atomic64_fetch_add_relaxed(1, v); 1572} 1573#define arch_atomic64_fetch_inc_relaxed arch_atomic64_fetch_inc_relaxed 1574#endif 1575 1576#else /* arch_atomic64_fetch_inc_relaxed */ 1577 1578#ifndef arch_atomic64_fetch_inc_acquire 1579static __always_inline s64 1580arch_atomic64_fetch_inc_acquire(atomic64_t *v) 1581{ 1582 s64 ret = arch_atomic64_fetch_inc_relaxed(v); 1583 __atomic_acquire_fence(); 1584 return ret; 1585} 1586#define arch_atomic64_fetch_inc_acquire arch_atomic64_fetch_inc_acquire 1587#endif 1588 1589#ifndef arch_atomic64_fetch_inc_release 1590static __always_inline s64 1591arch_atomic64_fetch_inc_release(atomic64_t *v) 1592{ 1593 __atomic_release_fence(); 1594 return arch_atomic64_fetch_inc_relaxed(v); 1595} 1596#define arch_atomic64_fetch_inc_release arch_atomic64_fetch_inc_release 1597#endif 1598 1599#ifndef arch_atomic64_fetch_inc 1600static __always_inline s64 1601arch_atomic64_fetch_inc(atomic64_t *v) 1602{ 1603 s64 ret; 1604 __atomic_pre_full_fence(); 1605 ret = arch_atomic64_fetch_inc_relaxed(v); 1606 __atomic_post_full_fence(); 1607 return ret; 1608} 1609#define arch_atomic64_fetch_inc arch_atomic64_fetch_inc 1610#endif 1611 1612#endif /* arch_atomic64_fetch_inc_relaxed */ 1613 1614#ifndef arch_atomic64_dec 1615static __always_inline void 1616arch_atomic64_dec(atomic64_t *v) 1617{ 1618 arch_atomic64_sub(1, v); 1619} 1620#define arch_atomic64_dec arch_atomic64_dec 1621#endif 1622 1623#ifndef arch_atomic64_dec_return_relaxed 1624#ifdef arch_atomic64_dec_return 1625#define arch_atomic64_dec_return_acquire arch_atomic64_dec_return 1626#define arch_atomic64_dec_return_release arch_atomic64_dec_return 1627#define arch_atomic64_dec_return_relaxed arch_atomic64_dec_return 1628#endif /* arch_atomic64_dec_return */ 1629 1630#ifndef arch_atomic64_dec_return 1631static __always_inline s64 1632arch_atomic64_dec_return(atomic64_t *v) 1633{ 1634 return arch_atomic64_sub_return(1, v); 1635} 1636#define arch_atomic64_dec_return arch_atomic64_dec_return 1637#endif 1638 1639#ifndef arch_atomic64_dec_return_acquire 1640static __always_inline s64 1641arch_atomic64_dec_return_acquire(atomic64_t *v) 1642{ 1643 return arch_atomic64_sub_return_acquire(1, v); 1644} 1645#define arch_atomic64_dec_return_acquire arch_atomic64_dec_return_acquire 1646#endif 1647 1648#ifndef arch_atomic64_dec_return_release 1649static __always_inline s64 1650arch_atomic64_dec_return_release(atomic64_t *v) 1651{ 1652 return arch_atomic64_sub_return_release(1, v); 1653} 1654#define arch_atomic64_dec_return_release arch_atomic64_dec_return_release 1655#endif 1656 1657#ifndef arch_atomic64_dec_return_relaxed 1658static __always_inline s64 1659arch_atomic64_dec_return_relaxed(atomic64_t *v) 1660{ 1661 return arch_atomic64_sub_return_relaxed(1, v); 1662} 1663#define arch_atomic64_dec_return_relaxed arch_atomic64_dec_return_relaxed 1664#endif 1665 1666#else /* arch_atomic64_dec_return_relaxed */ 1667 1668#ifndef arch_atomic64_dec_return_acquire 1669static __always_inline s64 1670arch_atomic64_dec_return_acquire(atomic64_t *v) 1671{ 1672 s64 ret = arch_atomic64_dec_return_relaxed(v); 1673 __atomic_acquire_fence(); 1674 return ret; 1675} 1676#define arch_atomic64_dec_return_acquire arch_atomic64_dec_return_acquire 1677#endif 1678 1679#ifndef arch_atomic64_dec_return_release 1680static __always_inline s64 1681arch_atomic64_dec_return_release(atomic64_t *v) 1682{ 1683 __atomic_release_fence(); 1684 return arch_atomic64_dec_return_relaxed(v); 1685} 1686#define arch_atomic64_dec_return_release arch_atomic64_dec_return_release 1687#endif 1688 1689#ifndef arch_atomic64_dec_return 1690static __always_inline s64 1691arch_atomic64_dec_return(atomic64_t *v) 1692{ 1693 s64 ret; 1694 __atomic_pre_full_fence(); 1695 ret = arch_atomic64_dec_return_relaxed(v); 1696 __atomic_post_full_fence(); 1697 return ret; 1698} 1699#define arch_atomic64_dec_return arch_atomic64_dec_return 1700#endif 1701 1702#endif /* arch_atomic64_dec_return_relaxed */ 1703 1704#ifndef arch_atomic64_fetch_dec_relaxed 1705#ifdef arch_atomic64_fetch_dec 1706#define arch_atomic64_fetch_dec_acquire arch_atomic64_fetch_dec 1707#define arch_atomic64_fetch_dec_release arch_atomic64_fetch_dec 1708#define arch_atomic64_fetch_dec_relaxed arch_atomic64_fetch_dec 1709#endif /* arch_atomic64_fetch_dec */ 1710 1711#ifndef arch_atomic64_fetch_dec 1712static __always_inline s64 1713arch_atomic64_fetch_dec(atomic64_t *v) 1714{ 1715 return arch_atomic64_fetch_sub(1, v); 1716} 1717#define arch_atomic64_fetch_dec arch_atomic64_fetch_dec 1718#endif 1719 1720#ifndef arch_atomic64_fetch_dec_acquire 1721static __always_inline s64 1722arch_atomic64_fetch_dec_acquire(atomic64_t *v) 1723{ 1724 return arch_atomic64_fetch_sub_acquire(1, v); 1725} 1726#define arch_atomic64_fetch_dec_acquire arch_atomic64_fetch_dec_acquire 1727#endif 1728 1729#ifndef arch_atomic64_fetch_dec_release 1730static __always_inline s64 1731arch_atomic64_fetch_dec_release(atomic64_t *v) 1732{ 1733 return arch_atomic64_fetch_sub_release(1, v); 1734} 1735#define arch_atomic64_fetch_dec_release arch_atomic64_fetch_dec_release 1736#endif 1737 1738#ifndef arch_atomic64_fetch_dec_relaxed 1739static __always_inline s64 1740arch_atomic64_fetch_dec_relaxed(atomic64_t *v) 1741{ 1742 return arch_atomic64_fetch_sub_relaxed(1, v); 1743} 1744#define arch_atomic64_fetch_dec_relaxed arch_atomic64_fetch_dec_relaxed 1745#endif 1746 1747#else /* arch_atomic64_fetch_dec_relaxed */ 1748 1749#ifndef arch_atomic64_fetch_dec_acquire 1750static __always_inline s64 1751arch_atomic64_fetch_dec_acquire(atomic64_t *v) 1752{ 1753 s64 ret = arch_atomic64_fetch_dec_relaxed(v); 1754 __atomic_acquire_fence(); 1755 return ret; 1756} 1757#define arch_atomic64_fetch_dec_acquire arch_atomic64_fetch_dec_acquire 1758#endif 1759 1760#ifndef arch_atomic64_fetch_dec_release 1761static __always_inline s64 1762arch_atomic64_fetch_dec_release(atomic64_t *v) 1763{ 1764 __atomic_release_fence(); 1765 return arch_atomic64_fetch_dec_relaxed(v); 1766} 1767#define arch_atomic64_fetch_dec_release arch_atomic64_fetch_dec_release 1768#endif 1769 1770#ifndef arch_atomic64_fetch_dec 1771static __always_inline s64 1772arch_atomic64_fetch_dec(atomic64_t *v) 1773{ 1774 s64 ret; 1775 __atomic_pre_full_fence(); 1776 ret = arch_atomic64_fetch_dec_relaxed(v); 1777 __atomic_post_full_fence(); 1778 return ret; 1779} 1780#define arch_atomic64_fetch_dec arch_atomic64_fetch_dec 1781#endif 1782 1783#endif /* arch_atomic64_fetch_dec_relaxed */ 1784 1785#ifndef arch_atomic64_fetch_and_relaxed 1786#define arch_atomic64_fetch_and_acquire arch_atomic64_fetch_and 1787#define arch_atomic64_fetch_and_release arch_atomic64_fetch_and 1788#define arch_atomic64_fetch_and_relaxed arch_atomic64_fetch_and 1789#else /* arch_atomic64_fetch_and_relaxed */ 1790 1791#ifndef arch_atomic64_fetch_and_acquire 1792static __always_inline s64 1793arch_atomic64_fetch_and_acquire(s64 i, atomic64_t *v) 1794{ 1795 s64 ret = arch_atomic64_fetch_and_relaxed(i, v); 1796 __atomic_acquire_fence(); 1797 return ret; 1798} 1799#define arch_atomic64_fetch_and_acquire arch_atomic64_fetch_and_acquire 1800#endif 1801 1802#ifndef arch_atomic64_fetch_and_release 1803static __always_inline s64 1804arch_atomic64_fetch_and_release(s64 i, atomic64_t *v) 1805{ 1806 __atomic_release_fence(); 1807 return arch_atomic64_fetch_and_relaxed(i, v); 1808} 1809#define arch_atomic64_fetch_and_release arch_atomic64_fetch_and_release 1810#endif 1811 1812#ifndef arch_atomic64_fetch_and 1813static __always_inline s64 1814arch_atomic64_fetch_and(s64 i, atomic64_t *v) 1815{ 1816 s64 ret; 1817 __atomic_pre_full_fence(); 1818 ret = arch_atomic64_fetch_and_relaxed(i, v); 1819 __atomic_post_full_fence(); 1820 return ret; 1821} 1822#define arch_atomic64_fetch_and arch_atomic64_fetch_and 1823#endif 1824 1825#endif /* arch_atomic64_fetch_and_relaxed */ 1826 1827#ifndef arch_atomic64_andnot 1828static __always_inline void 1829arch_atomic64_andnot(s64 i, atomic64_t *v) 1830{ 1831 arch_atomic64_and(~i, v); 1832} 1833#define arch_atomic64_andnot arch_atomic64_andnot 1834#endif 1835 1836#ifndef arch_atomic64_fetch_andnot_relaxed 1837#ifdef arch_atomic64_fetch_andnot 1838#define arch_atomic64_fetch_andnot_acquire arch_atomic64_fetch_andnot 1839#define arch_atomic64_fetch_andnot_release arch_atomic64_fetch_andnot 1840#define arch_atomic64_fetch_andnot_relaxed arch_atomic64_fetch_andnot 1841#endif /* arch_atomic64_fetch_andnot */ 1842 1843#ifndef arch_atomic64_fetch_andnot 1844static __always_inline s64 1845arch_atomic64_fetch_andnot(s64 i, atomic64_t *v) 1846{ 1847 return arch_atomic64_fetch_and(~i, v); 1848} 1849#define arch_atomic64_fetch_andnot arch_atomic64_fetch_andnot 1850#endif 1851 1852#ifndef arch_atomic64_fetch_andnot_acquire 1853static __always_inline s64 1854arch_atomic64_fetch_andnot_acquire(s64 i, atomic64_t *v) 1855{ 1856 return arch_atomic64_fetch_and_acquire(~i, v); 1857} 1858#define arch_atomic64_fetch_andnot_acquire arch_atomic64_fetch_andnot_acquire 1859#endif 1860 1861#ifndef arch_atomic64_fetch_andnot_release 1862static __always_inline s64 1863arch_atomic64_fetch_andnot_release(s64 i, atomic64_t *v) 1864{ 1865 return arch_atomic64_fetch_and_release(~i, v); 1866} 1867#define arch_atomic64_fetch_andnot_release arch_atomic64_fetch_andnot_release 1868#endif 1869 1870#ifndef arch_atomic64_fetch_andnot_relaxed 1871static __always_inline s64 1872arch_atomic64_fetch_andnot_relaxed(s64 i, atomic64_t *v) 1873{ 1874 return arch_atomic64_fetch_and_relaxed(~i, v); 1875} 1876#define arch_atomic64_fetch_andnot_relaxed arch_atomic64_fetch_andnot_relaxed 1877#endif 1878 1879#else /* arch_atomic64_fetch_andnot_relaxed */ 1880 1881#ifndef arch_atomic64_fetch_andnot_acquire 1882static __always_inline s64 1883arch_atomic64_fetch_andnot_acquire(s64 i, atomic64_t *v) 1884{ 1885 s64 ret = arch_atomic64_fetch_andnot_relaxed(i, v); 1886 __atomic_acquire_fence(); 1887 return ret; 1888} 1889#define arch_atomic64_fetch_andnot_acquire arch_atomic64_fetch_andnot_acquire 1890#endif 1891 1892#ifndef arch_atomic64_fetch_andnot_release 1893static __always_inline s64 1894arch_atomic64_fetch_andnot_release(s64 i, atomic64_t *v) 1895{ 1896 __atomic_release_fence(); 1897 return arch_atomic64_fetch_andnot_relaxed(i, v); 1898} 1899#define arch_atomic64_fetch_andnot_release arch_atomic64_fetch_andnot_release 1900#endif 1901 1902#ifndef arch_atomic64_fetch_andnot 1903static __always_inline s64 1904arch_atomic64_fetch_andnot(s64 i, atomic64_t *v) 1905{ 1906 s64 ret; 1907 __atomic_pre_full_fence(); 1908 ret = arch_atomic64_fetch_andnot_relaxed(i, v); 1909 __atomic_post_full_fence(); 1910 return ret; 1911} 1912#define arch_atomic64_fetch_andnot arch_atomic64_fetch_andnot 1913#endif 1914 1915#endif /* arch_atomic64_fetch_andnot_relaxed */ 1916 1917#ifndef arch_atomic64_fetch_or_relaxed 1918#define arch_atomic64_fetch_or_acquire arch_atomic64_fetch_or 1919#define arch_atomic64_fetch_or_release arch_atomic64_fetch_or 1920#define arch_atomic64_fetch_or_relaxed arch_atomic64_fetch_or 1921#else /* arch_atomic64_fetch_or_relaxed */ 1922 1923#ifndef arch_atomic64_fetch_or_acquire 1924static __always_inline s64 1925arch_atomic64_fetch_or_acquire(s64 i, atomic64_t *v) 1926{ 1927 s64 ret = arch_atomic64_fetch_or_relaxed(i, v); 1928 __atomic_acquire_fence(); 1929 return ret; 1930} 1931#define arch_atomic64_fetch_or_acquire arch_atomic64_fetch_or_acquire 1932#endif 1933 1934#ifndef arch_atomic64_fetch_or_release 1935static __always_inline s64 1936arch_atomic64_fetch_or_release(s64 i, atomic64_t *v) 1937{ 1938 __atomic_release_fence(); 1939 return arch_atomic64_fetch_or_relaxed(i, v); 1940} 1941#define arch_atomic64_fetch_or_release arch_atomic64_fetch_or_release 1942#endif 1943 1944#ifndef arch_atomic64_fetch_or 1945static __always_inline s64 1946arch_atomic64_fetch_or(s64 i, atomic64_t *v) 1947{ 1948 s64 ret; 1949 __atomic_pre_full_fence(); 1950 ret = arch_atomic64_fetch_or_relaxed(i, v); 1951 __atomic_post_full_fence(); 1952 return ret; 1953} 1954#define arch_atomic64_fetch_or arch_atomic64_fetch_or 1955#endif 1956 1957#endif /* arch_atomic64_fetch_or_relaxed */ 1958 1959#ifndef arch_atomic64_fetch_xor_relaxed 1960#define arch_atomic64_fetch_xor_acquire arch_atomic64_fetch_xor 1961#define arch_atomic64_fetch_xor_release arch_atomic64_fetch_xor 1962#define arch_atomic64_fetch_xor_relaxed arch_atomic64_fetch_xor 1963#else /* arch_atomic64_fetch_xor_relaxed */ 1964 1965#ifndef arch_atomic64_fetch_xor_acquire 1966static __always_inline s64 1967arch_atomic64_fetch_xor_acquire(s64 i, atomic64_t *v) 1968{ 1969 s64 ret = arch_atomic64_fetch_xor_relaxed(i, v); 1970 __atomic_acquire_fence(); 1971 return ret; 1972} 1973#define arch_atomic64_fetch_xor_acquire arch_atomic64_fetch_xor_acquire 1974#endif 1975 1976#ifndef arch_atomic64_fetch_xor_release 1977static __always_inline s64 1978arch_atomic64_fetch_xor_release(s64 i, atomic64_t *v) 1979{ 1980 __atomic_release_fence(); 1981 return arch_atomic64_fetch_xor_relaxed(i, v); 1982} 1983#define arch_atomic64_fetch_xor_release arch_atomic64_fetch_xor_release 1984#endif 1985 1986#ifndef arch_atomic64_fetch_xor 1987static __always_inline s64 1988arch_atomic64_fetch_xor(s64 i, atomic64_t *v) 1989{ 1990 s64 ret; 1991 __atomic_pre_full_fence(); 1992 ret = arch_atomic64_fetch_xor_relaxed(i, v); 1993 __atomic_post_full_fence(); 1994 return ret; 1995} 1996#define arch_atomic64_fetch_xor arch_atomic64_fetch_xor 1997#endif 1998 1999#endif /* arch_atomic64_fetch_xor_relaxed */ 2000 2001#ifndef arch_atomic64_xchg_relaxed 2002#define arch_atomic64_xchg_acquire arch_atomic64_xchg 2003#define arch_atomic64_xchg_release arch_atomic64_xchg 2004#define arch_atomic64_xchg_relaxed arch_atomic64_xchg 2005#else /* arch_atomic64_xchg_relaxed */ 2006 2007#ifndef arch_atomic64_xchg_acquire 2008static __always_inline s64 2009arch_atomic64_xchg_acquire(atomic64_t *v, s64 i) 2010{ 2011 s64 ret = arch_atomic64_xchg_relaxed(v, i); 2012 __atomic_acquire_fence(); 2013 return ret; 2014} 2015#define arch_atomic64_xchg_acquire arch_atomic64_xchg_acquire 2016#endif 2017 2018#ifndef arch_atomic64_xchg_release 2019static __always_inline s64 2020arch_atomic64_xchg_release(atomic64_t *v, s64 i) 2021{ 2022 __atomic_release_fence(); 2023 return arch_atomic64_xchg_relaxed(v, i); 2024} 2025#define arch_atomic64_xchg_release arch_atomic64_xchg_release 2026#endif 2027 2028#ifndef arch_atomic64_xchg 2029static __always_inline s64 2030arch_atomic64_xchg(atomic64_t *v, s64 i) 2031{ 2032 s64 ret; 2033 __atomic_pre_full_fence(); 2034 ret = arch_atomic64_xchg_relaxed(v, i); 2035 __atomic_post_full_fence(); 2036 return ret; 2037} 2038#define arch_atomic64_xchg arch_atomic64_xchg 2039#endif 2040 2041#endif /* arch_atomic64_xchg_relaxed */ 2042 2043#ifndef arch_atomic64_cmpxchg_relaxed 2044#define arch_atomic64_cmpxchg_acquire arch_atomic64_cmpxchg 2045#define arch_atomic64_cmpxchg_release arch_atomic64_cmpxchg 2046#define arch_atomic64_cmpxchg_relaxed arch_atomic64_cmpxchg 2047#else /* arch_atomic64_cmpxchg_relaxed */ 2048 2049#ifndef arch_atomic64_cmpxchg_acquire 2050static __always_inline s64 2051arch_atomic64_cmpxchg_acquire(atomic64_t *v, s64 old, s64 new) 2052{ 2053 s64 ret = arch_atomic64_cmpxchg_relaxed(v, old, new); 2054 __atomic_acquire_fence(); 2055 return ret; 2056} 2057#define arch_atomic64_cmpxchg_acquire arch_atomic64_cmpxchg_acquire 2058#endif 2059 2060#ifndef arch_atomic64_cmpxchg_release 2061static __always_inline s64 2062arch_atomic64_cmpxchg_release(atomic64_t *v, s64 old, s64 new) 2063{ 2064 __atomic_release_fence(); 2065 return arch_atomic64_cmpxchg_relaxed(v, old, new); 2066} 2067#define arch_atomic64_cmpxchg_release arch_atomic64_cmpxchg_release 2068#endif 2069 2070#ifndef arch_atomic64_cmpxchg 2071static __always_inline s64 2072arch_atomic64_cmpxchg(atomic64_t *v, s64 old, s64 new) 2073{ 2074 s64 ret; 2075 __atomic_pre_full_fence(); 2076 ret = arch_atomic64_cmpxchg_relaxed(v, old, new); 2077 __atomic_post_full_fence(); 2078 return ret; 2079} 2080#define arch_atomic64_cmpxchg arch_atomic64_cmpxchg 2081#endif 2082 2083#endif /* arch_atomic64_cmpxchg_relaxed */ 2084 2085#ifndef arch_atomic64_try_cmpxchg_relaxed 2086#ifdef arch_atomic64_try_cmpxchg 2087#define arch_atomic64_try_cmpxchg_acquire arch_atomic64_try_cmpxchg 2088#define arch_atomic64_try_cmpxchg_release arch_atomic64_try_cmpxchg 2089#define arch_atomic64_try_cmpxchg_relaxed arch_atomic64_try_cmpxchg 2090#endif /* arch_atomic64_try_cmpxchg */ 2091 2092#ifndef arch_atomic64_try_cmpxchg 2093static __always_inline bool 2094arch_atomic64_try_cmpxchg(atomic64_t *v, s64 *old, s64 new) 2095{ 2096 s64 r, o = *old; 2097 r = arch_atomic64_cmpxchg(v, o, new); 2098 if (unlikely(r != o)) 2099 *old = r; 2100 return likely(r == o); 2101} 2102#define arch_atomic64_try_cmpxchg arch_atomic64_try_cmpxchg 2103#endif 2104 2105#ifndef arch_atomic64_try_cmpxchg_acquire 2106static __always_inline bool 2107arch_atomic64_try_cmpxchg_acquire(atomic64_t *v, s64 *old, s64 new) 2108{ 2109 s64 r, o = *old; 2110 r = arch_atomic64_cmpxchg_acquire(v, o, new); 2111 if (unlikely(r != o)) 2112 *old = r; 2113 return likely(r == o); 2114} 2115#define arch_atomic64_try_cmpxchg_acquire arch_atomic64_try_cmpxchg_acquire 2116#endif 2117 2118#ifndef arch_atomic64_try_cmpxchg_release 2119static __always_inline bool 2120arch_atomic64_try_cmpxchg_release(atomic64_t *v, s64 *old, s64 new) 2121{ 2122 s64 r, o = *old; 2123 r = arch_atomic64_cmpxchg_release(v, o, new); 2124 if (unlikely(r != o)) 2125 *old = r; 2126 return likely(r == o); 2127} 2128#define arch_atomic64_try_cmpxchg_release arch_atomic64_try_cmpxchg_release 2129#endif 2130 2131#ifndef arch_atomic64_try_cmpxchg_relaxed 2132static __always_inline bool 2133arch_atomic64_try_cmpxchg_relaxed(atomic64_t *v, s64 *old, s64 new) 2134{ 2135 s64 r, o = *old; 2136 r = arch_atomic64_cmpxchg_relaxed(v, o, new); 2137 if (unlikely(r != o)) 2138 *old = r; 2139 return likely(r == o); 2140} 2141#define arch_atomic64_try_cmpxchg_relaxed arch_atomic64_try_cmpxchg_relaxed 2142#endif 2143 2144#else /* arch_atomic64_try_cmpxchg_relaxed */ 2145 2146#ifndef arch_atomic64_try_cmpxchg_acquire 2147static __always_inline bool 2148arch_atomic64_try_cmpxchg_acquire(atomic64_t *v, s64 *old, s64 new) 2149{ 2150 bool ret = arch_atomic64_try_cmpxchg_relaxed(v, old, new); 2151 __atomic_acquire_fence(); 2152 return ret; 2153} 2154#define arch_atomic64_try_cmpxchg_acquire arch_atomic64_try_cmpxchg_acquire 2155#endif 2156 2157#ifndef arch_atomic64_try_cmpxchg_release 2158static __always_inline bool 2159arch_atomic64_try_cmpxchg_release(atomic64_t *v, s64 *old, s64 new) 2160{ 2161 __atomic_release_fence(); 2162 return arch_atomic64_try_cmpxchg_relaxed(v, old, new); 2163} 2164#define arch_atomic64_try_cmpxchg_release arch_atomic64_try_cmpxchg_release 2165#endif 2166 2167#ifndef arch_atomic64_try_cmpxchg 2168static __always_inline bool 2169arch_atomic64_try_cmpxchg(atomic64_t *v, s64 *old, s64 new) 2170{ 2171 bool ret; 2172 __atomic_pre_full_fence(); 2173 ret = arch_atomic64_try_cmpxchg_relaxed(v, old, new); 2174 __atomic_post_full_fence(); 2175 return ret; 2176} 2177#define arch_atomic64_try_cmpxchg arch_atomic64_try_cmpxchg 2178#endif 2179 2180#endif /* arch_atomic64_try_cmpxchg_relaxed */ 2181 2182#ifndef arch_atomic64_sub_and_test 2183/** 2184 * arch_atomic64_sub_and_test - subtract value from variable and test result 2185 * @i: integer value to subtract 2186 * @v: pointer of type atomic64_t 2187 * 2188 * Atomically subtracts @i from @v and returns 2189 * true if the result is zero, or false for all 2190 * other cases. 2191 */ 2192static __always_inline bool 2193arch_atomic64_sub_and_test(s64 i, atomic64_t *v) 2194{ 2195 return arch_atomic64_sub_return(i, v) == 0; 2196} 2197#define arch_atomic64_sub_and_test arch_atomic64_sub_and_test 2198#endif 2199 2200#ifndef arch_atomic64_dec_and_test 2201/** 2202 * arch_atomic64_dec_and_test - decrement and test 2203 * @v: pointer of type atomic64_t 2204 * 2205 * Atomically decrements @v by 1 and 2206 * returns true if the result is 0, or false for all other 2207 * cases. 2208 */ 2209static __always_inline bool 2210arch_atomic64_dec_and_test(atomic64_t *v) 2211{ 2212 return arch_atomic64_dec_return(v) == 0; 2213} 2214#define arch_atomic64_dec_and_test arch_atomic64_dec_and_test 2215#endif 2216 2217#ifndef arch_atomic64_inc_and_test 2218/** 2219 * arch_atomic64_inc_and_test - increment and test 2220 * @v: pointer of type atomic64_t 2221 * 2222 * Atomically increments @v by 1 2223 * and returns true if the result is zero, or false for all 2224 * other cases. 2225 */ 2226static __always_inline bool 2227arch_atomic64_inc_and_test(atomic64_t *v) 2228{ 2229 return arch_atomic64_inc_return(v) == 0; 2230} 2231#define arch_atomic64_inc_and_test arch_atomic64_inc_and_test 2232#endif 2233 2234#ifndef arch_atomic64_add_negative 2235/** 2236 * arch_atomic64_add_negative - add and test if negative 2237 * @i: integer value to add 2238 * @v: pointer of type atomic64_t 2239 * 2240 * Atomically adds @i to @v and returns true 2241 * if the result is negative, or false when 2242 * result is greater than or equal to zero. 2243 */ 2244static __always_inline bool 2245arch_atomic64_add_negative(s64 i, atomic64_t *v) 2246{ 2247 return arch_atomic64_add_return(i, v) < 0; 2248} 2249#define arch_atomic64_add_negative arch_atomic64_add_negative 2250#endif 2251 2252#ifndef arch_atomic64_fetch_add_unless 2253/** 2254 * arch_atomic64_fetch_add_unless - add unless the number is already a given value 2255 * @v: pointer of type atomic64_t 2256 * @a: the amount to add to v... 2257 * @u: ...unless v is equal to u. 2258 * 2259 * Atomically adds @a to @v, so long as @v was not already @u. 2260 * Returns original value of @v 2261 */ 2262static __always_inline s64 2263arch_atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u) 2264{ 2265 s64 c = arch_atomic64_read(v); 2266 2267 do { 2268 if (unlikely(c == u)) 2269 break; 2270 } while (!arch_atomic64_try_cmpxchg(v, &c, c + a)); 2271 2272 return c; 2273} 2274#define arch_atomic64_fetch_add_unless arch_atomic64_fetch_add_unless 2275#endif 2276 2277#ifndef arch_atomic64_add_unless 2278/** 2279 * arch_atomic64_add_unless - add unless the number is already a given value 2280 * @v: pointer of type atomic64_t 2281 * @a: the amount to add to v... 2282 * @u: ...unless v is equal to u. 2283 * 2284 * Atomically adds @a to @v, if @v was not already @u. 2285 * Returns true if the addition was done. 2286 */ 2287static __always_inline bool 2288arch_atomic64_add_unless(atomic64_t *v, s64 a, s64 u) 2289{ 2290 return arch_atomic64_fetch_add_unless(v, a, u) != u; 2291} 2292#define arch_atomic64_add_unless arch_atomic64_add_unless 2293#endif 2294 2295#ifndef arch_atomic64_inc_not_zero 2296/** 2297 * arch_atomic64_inc_not_zero - increment unless the number is zero 2298 * @v: pointer of type atomic64_t 2299 * 2300 * Atomically increments @v by 1, if @v is non-zero. 2301 * Returns true if the increment was done. 2302 */ 2303static __always_inline bool 2304arch_atomic64_inc_not_zero(atomic64_t *v) 2305{ 2306 return arch_atomic64_add_unless(v, 1, 0); 2307} 2308#define arch_atomic64_inc_not_zero arch_atomic64_inc_not_zero 2309#endif 2310 2311#ifndef arch_atomic64_inc_unless_negative 2312static __always_inline bool 2313arch_atomic64_inc_unless_negative(atomic64_t *v) 2314{ 2315 s64 c = arch_atomic64_read(v); 2316 2317 do { 2318 if (unlikely(c < 0)) 2319 return false; 2320 } while (!arch_atomic64_try_cmpxchg(v, &c, c + 1)); 2321 2322 return true; 2323} 2324#define arch_atomic64_inc_unless_negative arch_atomic64_inc_unless_negative 2325#endif 2326 2327#ifndef arch_atomic64_dec_unless_positive 2328static __always_inline bool 2329arch_atomic64_dec_unless_positive(atomic64_t *v) 2330{ 2331 s64 c = arch_atomic64_read(v); 2332 2333 do { 2334 if (unlikely(c > 0)) 2335 return false; 2336 } while (!arch_atomic64_try_cmpxchg(v, &c, c - 1)); 2337 2338 return true; 2339} 2340#define arch_atomic64_dec_unless_positive arch_atomic64_dec_unless_positive 2341#endif 2342 2343#ifndef arch_atomic64_dec_if_positive 2344static __always_inline s64 2345arch_atomic64_dec_if_positive(atomic64_t *v) 2346{ 2347 s64 dec, c = arch_atomic64_read(v); 2348 2349 do { 2350 dec = c - 1; 2351 if (unlikely(dec < 0)) 2352 break; 2353 } while (!arch_atomic64_try_cmpxchg(v, &c, dec)); 2354 2355 return dec; 2356} 2357#define arch_atomic64_dec_if_positive arch_atomic64_dec_if_positive 2358#endif 2359 2360#endif /* _LINUX_ATOMIC_FALLBACK_H */ 2361// cca554917d7ea73d5e3e7397dd70c484cad9b2c4