summaryrefslogtreecommitdiff
path: root/io_uring
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2026-04-08 11:50:08 -0600
committerJens Axboe <axboe@kernel.dk>2026-04-08 13:21:35 -0600
commitb4d893d636f435701f025e43146d0a4b9a065102 (patch)
tree325bb019b688e22bb32889665edb93f9cab3adcc /io_uring
parent7880174e1e5e88944ea75cf871efd77ec5e3ef51 (diff)
io_uring/register: don't get a reference to the registered ring fd
This isn't necessary and was only done because the register path isn't a hot path and hence the extra ref/put doesn't matter, and to have the exit path be able to unconditionally put whatever file was gotten regardless of the type. In preparation for sharing this code with the main io_uring_enter(2) syscall, drop the reference and have the caller conditionally put the file if it was a normal file descriptor. Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'io_uring')
-rw-r--r--io_uring/register.c8
-rw-r--r--io_uring/rsrc.c3
2 files changed, 6 insertions, 5 deletions
diff --git a/io_uring/register.c b/io_uring/register.c
index 35432471a550..95cfa88dc621 100644
--- a/io_uring/register.c
+++ b/io_uring/register.c
@@ -941,7 +941,8 @@ static int __io_uring_register(struct io_ring_ctx *ctx, unsigned opcode,
/*
* Given an 'fd' value, return the ctx associated with if. If 'registered' is
* true, then the registered index is used. Otherwise, the normal fd table.
- * Caller must call fput() on the returned file, unless it's an ERR_PTR.
+ * Caller must call fput() on the returned file if it isn't a registered file,
+ * unless it's an ERR_PTR.
*/
struct file *io_uring_register_get_file(unsigned int fd, bool registered)
{
@@ -958,8 +959,6 @@ struct file *io_uring_register_get_file(unsigned int fd, bool registered)
return ERR_PTR(-EINVAL);
fd = array_index_nospec(fd, IO_RINGFD_REG_MAX);
file = tctx->registered_rings[fd];
- if (file)
- get_file(file);
} else {
file = fget(fd);
}
@@ -1038,6 +1037,7 @@ SYSCALL_DEFINE4(io_uring_register, unsigned int, fd, unsigned int, opcode,
ctx->buf_table.nr, ret);
mutex_unlock(&ctx->uring_lock);
- fput(file);
+ if (!use_registered_ring)
+ fput(file);
return ret;
}
diff --git a/io_uring/rsrc.c b/io_uring/rsrc.c
index 2d8be5edbbf6..cb12194b35e8 100644
--- a/io_uring/rsrc.c
+++ b/io_uring/rsrc.c
@@ -1291,7 +1291,8 @@ out:
if (src_ctx != ctx)
mutex_unlock(&src_ctx->uring_lock);
- fput(file);
+ if (!registered_src)
+ fput(file);
return ret;
}