diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2025-12-13 12:18:20 +0300 |
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2025-12-13 12:18:20 +0300 |
| commit | a4a508df2aa34f8650afde54ea804321c618f45f (patch) | |
| tree | f75f10e7c54f991d7d859f8cbdcc8bcaed5bbd6f /tools/include/linux/atomic.h | |
| parent | c4b3133c6a2fc283cb3d34c64d40ed2fa254b608 (diff) | |
| parent | 7d0a66e4bb9081d75c82ec4957c50034cb0ea449 (diff) | |
| download | linux-a4a508df2aa34f8650afde54ea804321c618f45f.tar.xz | |
Merge tag 'v6.18' into next
Sync up with the mainline to bring in the latest APIs.
Diffstat (limited to 'tools/include/linux/atomic.h')
| -rw-r--r-- | tools/include/linux/atomic.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/tools/include/linux/atomic.h b/tools/include/linux/atomic.h index 01907b33537e..50c66ba9ada5 100644 --- a/tools/include/linux/atomic.h +++ b/tools/include/linux/atomic.h @@ -12,4 +12,26 @@ void atomic_long_set(atomic_long_t *v, long i); #define atomic_cmpxchg_release atomic_cmpxchg #endif /* atomic_cmpxchg_relaxed */ +static inline bool atomic_try_cmpxchg(atomic_t *ptr, int *oldp, int new) +{ + int ret, old = *oldp; + + ret = atomic_cmpxchg(ptr, old, new); + if (ret != old) + *oldp = ret; + return ret == old; +} + +static inline bool atomic_inc_unless_negative(atomic_t *v) +{ + int c = atomic_read(v); + + do { + if (unlikely(c < 0)) + return false; + } while (!atomic_try_cmpxchg(v, &c, c + 1)); + + return true; +} + #endif /* __TOOLS_LINUX_ATOMIC_H */ |
