summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--io_uring/zcrx.c10
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;
}