The following commit has been merged into the locking/core branch of tip: Commit-ID: bd1e2670ebd10ad727b92ddd424cca270314f5ee Gitweb: https://git.kernel.org/tip/bd1e2670ebd10ad727b92ddd424cca270314f5ee Author: Andrzej Hajda <andrzej.hajda@xxxxxxxxx> AuthorDate: Wed, 18 Jan 2023 16:44:48 +01:00 Committer: Peter Zijlstra <peterz@xxxxxxxxxxxxx> CommitterDate: Sat, 11 Mar 2023 14:03:59 +01:00 io_uring: use __xchg if possible Recently introduced helper simplifies the code. Signed-off-by: Andrzej Hajda <andrzej.hajda@xxxxxxxxx> Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx> Reviewed-by: Andi Shyti <andi.shyti@xxxxxxxxxxxxxxx> Link: https://lore.kernel.org/r/20230118154450.73842-5-andrzej.hajda@xxxxxxxxx --- io_uring/io_uring.c | 7 ++----- io_uring/slist.h | 6 ++---- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c index fd1cc35..0cd89a3 100644 --- a/io_uring/io_uring.c +++ b/io_uring/io_uring.c @@ -54,6 +54,7 @@ #include <linux/fdtable.h> #include <linux/mm.h> #include <linux/mman.h> +#include <linux/non-atomic/xchg.h> #include <linux/percpu.h> #include <linux/slab.h> #include <linux/bvec.h> @@ -1131,8 +1132,6 @@ static void __io_req_find_next_prep(struct io_kiocb *req) static inline struct io_kiocb *io_req_find_next(struct io_kiocb *req) { - struct io_kiocb *nxt; - /* * If LINK is set, we have dependent requests in this chain. If we * didn't fail this request, queue the first one up, moving any other @@ -1141,9 +1140,7 @@ static inline struct io_kiocb *io_req_find_next(struct io_kiocb *req) */ if (unlikely(req->flags & IO_DISARM_MASK)) __io_req_find_next_prep(req); - nxt = req->link; - req->link = NULL; - return nxt; + return __xchg(&req->link, NULL); } static void ctx_flush_and_put(struct io_ring_ctx *ctx, bool *locked) diff --git a/io_uring/slist.h b/io_uring/slist.h index 7c198a4..051e577 100644 --- a/io_uring/slist.h +++ b/io_uring/slist.h @@ -2,6 +2,7 @@ #define INTERNAL_IO_SLIST_H #include <linux/io_uring_types.h> +#include <linux/non-atomic/xchg.h> #define wq_list_for_each(pos, prv, head) \ for (pos = (head)->first, prv = NULL; pos; prv = pos, pos = (pos)->next) @@ -99,10 +100,7 @@ static inline void wq_list_del(struct io_wq_work_list *list, static inline struct io_wq_work_node *wq_stack_extract(struct io_wq_work_node *stack) { - struct io_wq_work_node *node = stack->next; - - stack->next = node->next; - return node; + return __xchg(&stack->next, stack->next->next); } static inline struct io_wq_work *wq_next_work(struct io_wq_work *work)