io_uring: Move old async data allocation helper to header

There are two remaining uses of the old async data allocator that do not
rely on the alloc cache.  I don't want to make them use the new
allocator helper because that would require a if(cache) check, which
will result in dead code for the cached case (for callers passing a
cache, gcc can't prove the cache isn't NULL, and will therefore preserve
the check.  Since this is an inline function and just a few lines long,
keep a second helper to deal with cases where we don't have an async
data cache.

No functional change intended here.  This is just moving the helper
around and making it inline.

Signed-off-by: Gabriel Krisman Bertazi <krisman@suse.de>
Link: https://lore.kernel.org/r/20241216204615.759089-9-krisman@suse.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Gabriel Krisman Bertazi 2024-12-16 15:46:14 -05:00 committed by Jens Axboe
parent 8cf0c45999
commit 6cd2993dcd
4 changed files with 16 additions and 18 deletions

View File

@ -1639,19 +1639,6 @@ io_req_flags_t io_file_get_flags(struct file *file)
return res; return res;
} }
bool io_alloc_async_data(struct io_kiocb *req)
{
const struct io_issue_def *def = &io_issue_defs[req->opcode];
WARN_ON_ONCE(!def->async_size);
req->async_data = kmalloc(def->async_size, GFP_KERNEL);
if (req->async_data) {
req->flags |= REQ_F_ASYNC_DATA;
return false;
}
return true;
}
static u32 io_get_sequence(struct io_kiocb *req) static u32 io_get_sequence(struct io_kiocb *req)
{ {
u32 seq = req->ctx->cached_sq_head; u32 seq = req->ctx->cached_sq_head;

View File

@ -12,6 +12,7 @@
#include "io-wq.h" #include "io-wq.h"
#include "slist.h" #include "slist.h"
#include "filetable.h" #include "filetable.h"
#include "opdef.h"
#ifndef CREATE_TRACE_POINTS #ifndef CREATE_TRACE_POINTS
#include <trace/events/io_uring.h> #include <trace/events/io_uring.h>
@ -233,6 +234,17 @@ static inline void *io_uring_alloc_async_data(struct io_alloc_cache *cache,
return req->async_data; return req->async_data;
} }
static inline void *io_uring_alloc_async_data_nocache(struct io_kiocb *req)
{
const struct io_issue_def *def = &io_issue_defs[req->opcode];
WARN_ON_ONCE(!def->async_size);
req->async_data = kmalloc(def->async_size, GFP_KERNEL);
if (req->async_data)
req->flags |= REQ_F_ASYNC_DATA;
return req->async_data;
}
static inline bool req_has_async_data(struct io_kiocb *req) static inline bool req_has_async_data(struct io_kiocb *req)
{ {
return req->flags & REQ_F_ASYNC_DATA; return req->flags & REQ_F_ASYNC_DATA;

View File

@ -525,10 +525,9 @@ static int __io_timeout_prep(struct io_kiocb *req,
if (WARN_ON_ONCE(req_has_async_data(req))) if (WARN_ON_ONCE(req_has_async_data(req)))
return -EFAULT; return -EFAULT;
if (io_alloc_async_data(req)) data = io_uring_alloc_async_data_nocache(req);
if (!data)
return -ENOMEM; return -ENOMEM;
data = req->async_data;
data->req = req; data->req = req;
data->flags = flags; data->flags = flags;

View File

@ -303,10 +303,10 @@ int io_waitid(struct io_kiocb *req, unsigned int issue_flags)
struct io_waitid_async *iwa; struct io_waitid_async *iwa;
int ret; int ret;
if (io_alloc_async_data(req)) iwa = io_uring_alloc_async_data_nocache(req);
if (!iwa)
return -ENOMEM; return -ENOMEM;
iwa = req->async_data;
iwa->req = req; iwa->req = req;
ret = kernel_waitid_prepare(&iwa->wo, iw->which, iw->upid, &iw->info, ret = kernel_waitid_prepare(&iwa->wo, iw->which, iw->upid, &iw->info,