io_uring/net: Allocate msghdr async data through helper
authorGabriel Krisman Bertazi <krisman@suse.de>
Mon, 16 Dec 2024 20:46:12 +0000 (15:46 -0500)
committerJens Axboe <axboe@kernel.dk>
Fri, 27 Dec 2024 17:07:48 +0000 (10:07 -0700)
This abstracts away the cache details.

Signed-off-by: Gabriel Krisman Bertazi <krisman@suse.de>
Link: https://lore.kernel.org/r/20241216204615.759089-7-krisman@suse.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/net.c

index df1f7dc6f1c8f3059ae0737f743e9cdc93442e30..8457408194e768e7bf60db9d7d312afba2880d8c 100644 (file)
@@ -155,30 +155,31 @@ static void io_netmsg_recycle(struct io_kiocb *req, unsigned int issue_flags)
        }
 }
 
+static void io_msg_async_data_init(void *obj)
+{
+       struct io_async_msghdr *hdr = (struct io_async_msghdr *)obj;
+
+       hdr->free_iov = NULL;
+       hdr->free_iov_nr = 0;
+}
+
 static struct io_async_msghdr *io_msg_alloc_async(struct io_kiocb *req)
 {
        struct io_ring_ctx *ctx = req->ctx;
        struct io_async_msghdr *hdr;
 
-       hdr = io_alloc_cache_get(&ctx->netmsg_cache);
-       if (hdr) {
-               if (hdr->free_iov) {
-                       kasan_mempool_unpoison_object(hdr->free_iov,
-                               hdr->free_iov_nr * sizeof(struct iovec));
-                       req->flags |= REQ_F_NEED_CLEANUP;
-               }
-               req->flags |= REQ_F_ASYNC_DATA;
-               req->async_data = hdr;
-               return hdr;
-       }
+       hdr = io_uring_alloc_async_data(&ctx->netmsg_cache, req,
+                                       io_msg_async_data_init);
+       if (!hdr)
+               return NULL;
 
-       if (!io_alloc_async_data(req)) {
-               hdr = req->async_data;
-               hdr->free_iov_nr = 0;
-               hdr->free_iov = NULL;
-               return hdr;
+       /* If the async data was cached, we might have an iov cached inside. */
+       if (hdr->free_iov) {
+               kasan_mempool_unpoison_object(hdr->free_iov,
+                                             hdr->free_iov_nr * sizeof(struct iovec));
+               req->flags |= REQ_F_NEED_CLEANUP;
        }
-       return NULL;
+       return hdr;
 }
 
 /* assign new iovec to kmsg, if we need to */