summaryrefslogtreecommitdiffstats
path: root/io_uring/io_uring.c
diff options
context:
space:
mode:
authorPavel Begunkov <asml.silence@gmail.com>2022-06-25 11:53:02 +0100
committerJens Axboe <axboe@kernel.dk>2022-07-24 18:39:16 -0600
commitfbb8bb02911790147ea936f3b1c5ceb1be54bf34 (patch)
treec183e2460bc828f7fa3db1966f25f19443204ed0 /io_uring/io_uring.c
parent3273c4407acd4348b1531e1f860fbf1da942893b (diff)
downloadlinux-stable-fbb8bb02911790147ea936f3b1c5ceb1be54bf34.tar.gz
linux-stable-fbb8bb02911790147ea936f3b1c5ceb1be54bf34.tar.bz2
linux-stable-fbb8bb02911790147ea936f3b1c5ceb1be54bf34.zip
io_uring: remove ctx->refs pinning on enter
io_uring_enter() takes ctx->refs, which was previously preventing racing with register quiesce. However, as register now doesn't touch the refs, we can freely kill extra ctx pinning and rely on the fact that we're holding a file reference preventing the ring from being destroyed. Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Link: https://lore.kernel.org/r/a11c57ad33a1be53541fce90669c1b79cf4d8940.1656153286.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'io_uring/io_uring.c')
-rw-r--r--io_uring/io_uring.c16
1 files changed, 4 insertions, 12 deletions
diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c
index e1e8dcd17df3..070ee9ec9ee7 100644
--- a/io_uring/io_uring.c
+++ b/io_uring/io_uring.c
@@ -3049,14 +3049,10 @@ SYSCALL_DEFINE6(io_uring_enter, unsigned int, fd, u32, to_submit,
return -EBADF;
ret = -EOPNOTSUPP;
if (unlikely(!io_is_uring_fops(f.file)))
- goto out_fput;
+ goto out;
}
- ret = -ENXIO;
ctx = f.file->private_data;
- if (unlikely(!percpu_ref_tryget(&ctx->refs)))
- goto out_fput;
-
ret = -EBADFD;
if (unlikely(ctx->flags & IORING_SETUP_R_DISABLED))
goto out;
@@ -3141,10 +3137,7 @@ iopoll_locked:
&ctx->check_cq);
}
}
-
out:
- percpu_ref_put(&ctx->refs);
-out_fput:
fdput(f);
return ret;
}
@@ -3730,11 +3723,10 @@ static int __io_uring_register(struct io_ring_ctx *ctx, unsigned opcode,
int ret;
/*
- * We're inside the ring mutex, if the ref is already dying, then
- * someone else killed the ctx or is already going through
- * io_uring_register().
+ * We don't quiesce the refs for register anymore and so it can't be
+ * dying as we're holding a file ref here.
*/
- if (percpu_ref_is_dying(&ctx->refs))
+ if (WARN_ON_ONCE(percpu_ref_is_dying(&ctx->refs)))
return -ENXIO;
if (ctx->restricted) {