diff options
| -rw-r--r-- | io_uring/zcrx.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c index 28150c6578e3..97984a73a95d 100644 --- a/io_uring/zcrx.c +++ b/io_uring/zcrx.c @@ -349,10 +349,14 @@ static inline atomic_t *io_get_user_counter(struct net_iov *niov) static bool io_zcrx_put_niov_uref(struct net_iov *niov) { atomic_t *uref = io_get_user_counter(niov); + int old; + + old = atomic_read(uref); + do { + if (unlikely(old == 0)) + return false; + } while (!atomic_try_cmpxchg(uref, &old, old - 1)); - if (unlikely(!atomic_read(uref))) - return false; - atomic_dec(uref); return true; } |
