LCOV - code coverage report
Current view: top level - include/linux/atomic - atomic-arch-fallback.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 4 33 12.1 %
Date: 2022-12-09 01:23:36 Functions: 0 0 -

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

Generated by: LCOV version 1.14