Skip to content

Commit 83e0415

Browse files
isilenceaxboe
authored andcommitted
io_uring: temporarily disable registered waits
Disable wait argument registration as it'll be replaced with a more generic feature. We'll still need IORING_ENTER_EXT_ARG_REG parsing in a few commits so leave it be. Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Link: https://lore.kernel.org/r/70b1d1d218c41ba77a76d1789c8641dab0b0563e.1731689588.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 3730aeb commit 83e0415

File tree

5 files changed

+0
-106
lines changed

5 files changed

+0
-106
lines changed

include/linux/io_uring_types.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -330,14 +330,6 @@ struct io_ring_ctx {
330330
atomic_t cq_wait_nr;
331331
atomic_t cq_timeouts;
332332
struct wait_queue_head cq_wait;
333-
334-
/*
335-
* If registered with IORING_REGISTER_CQWAIT_REG, a single
336-
* page holds N entries, mapped in cq_wait_arg. cq_wait_index
337-
* is the maximum allowable index.
338-
*/
339-
struct io_uring_reg_wait *cq_wait_arg;
340-
unsigned char cq_wait_index;
341333
} ____cacheline_aligned_in_smp;
342334

343335
/* timeouts */
@@ -431,8 +423,6 @@ struct io_ring_ctx {
431423
unsigned short n_sqe_pages;
432424
struct page **ring_pages;
433425
struct page **sqe_pages;
434-
435-
struct page **cq_wait_page;
436426
};
437427

438428
struct io_tw_state {

include/uapi/linux/io_uring.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -627,9 +627,6 @@ enum io_uring_register_op {
627627
/* resize CQ ring */
628628
IORING_REGISTER_RESIZE_RINGS = 33,
629629

630-
/* register fixed io_uring_reg_wait arguments */
631-
IORING_REGISTER_CQWAIT_REG = 34,
632-
633630
/* this goes last */
634631
IORING_REGISTER_LAST,
635632

io_uring/io_uring.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2709,7 +2709,6 @@ static __cold void io_ring_ctx_free(struct io_ring_ctx *ctx)
27092709
io_alloc_cache_free(&ctx->msg_cache, io_msg_cache_free);
27102710
io_futex_cache_free(ctx);
27112711
io_destroy_buffers(ctx);
2712-
io_unregister_cqwait_reg(ctx);
27132712
mutex_unlock(&ctx->uring_lock);
27142713
if (ctx->sq_creds)
27152714
put_cred(ctx->sq_creds);
@@ -3195,15 +3194,6 @@ void __io_uring_cancel(bool cancel_all)
31953194
static struct io_uring_reg_wait *io_get_ext_arg_reg(struct io_ring_ctx *ctx,
31963195
const struct io_uring_getevents_arg __user *uarg)
31973196
{
3198-
struct io_uring_reg_wait *arg = READ_ONCE(ctx->cq_wait_arg);
3199-
3200-
if (arg) {
3201-
unsigned int index = (unsigned int) (uintptr_t) uarg;
3202-
3203-
if (index <= ctx->cq_wait_index)
3204-
return arg + index;
3205-
}
3206-
32073197
return ERR_PTR(-EFAULT);
32083198
}
32093199

io_uring/register.c

Lines changed: 0 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -570,82 +570,6 @@ static int io_register_resize_rings(struct io_ring_ctx *ctx, void __user *arg)
570570
return ret;
571571
}
572572

573-
void io_unregister_cqwait_reg(struct io_ring_ctx *ctx)
574-
{
575-
unsigned short npages = 1;
576-
577-
if (!ctx->cq_wait_page)
578-
return;
579-
580-
io_pages_unmap(ctx->cq_wait_arg, &ctx->cq_wait_page, &npages, true);
581-
ctx->cq_wait_arg = NULL;
582-
if (ctx->user)
583-
__io_unaccount_mem(ctx->user, 1);
584-
}
585-
586-
/*
587-
* Register a page holding N entries of struct io_uring_reg_wait, which can
588-
* be used via io_uring_enter(2) if IORING_GETEVENTS_EXT_ARG_REG is set.
589-
* If that is set with IORING_GETEVENTS_EXT_ARG, then instead of passing
590-
* in a pointer for a struct io_uring_getevents_arg, an index into this
591-
* registered array is passed, avoiding two (arg + timeout) copies per
592-
* invocation.
593-
*/
594-
static int io_register_cqwait_reg(struct io_ring_ctx *ctx, void __user *uarg)
595-
{
596-
struct io_uring_cqwait_reg_arg arg;
597-
struct io_uring_reg_wait *reg;
598-
struct page **pages;
599-
unsigned long len;
600-
int nr_pages, poff;
601-
int ret;
602-
603-
if (ctx->cq_wait_page || ctx->cq_wait_arg)
604-
return -EBUSY;
605-
if (copy_from_user(&arg, uarg, sizeof(arg)))
606-
return -EFAULT;
607-
if (!arg.nr_entries || arg.flags)
608-
return -EINVAL;
609-
if (arg.struct_size != sizeof(*reg))
610-
return -EINVAL;
611-
if (check_mul_overflow(arg.struct_size, arg.nr_entries, &len))
612-
return -EOVERFLOW;
613-
if (len > PAGE_SIZE)
614-
return -EINVAL;
615-
/* offset + len must fit within a page, and must be reg_wait aligned */
616-
poff = arg.user_addr & ~PAGE_MASK;
617-
if (len + poff > PAGE_SIZE)
618-
return -EINVAL;
619-
if (poff % arg.struct_size)
620-
return -EINVAL;
621-
622-
pages = io_pin_pages(arg.user_addr, len, &nr_pages);
623-
if (IS_ERR(pages))
624-
return PTR_ERR(pages);
625-
ret = -EINVAL;
626-
if (nr_pages != 1)
627-
goto out_free;
628-
if (ctx->user) {
629-
ret = __io_account_mem(ctx->user, 1);
630-
if (ret)
631-
goto out_free;
632-
}
633-
634-
reg = vmap(pages, 1, VM_MAP, PAGE_KERNEL);
635-
if (reg) {
636-
ctx->cq_wait_index = arg.nr_entries - 1;
637-
WRITE_ONCE(ctx->cq_wait_page, pages);
638-
WRITE_ONCE(ctx->cq_wait_arg, (void *) reg + poff);
639-
return 0;
640-
}
641-
ret = -ENOMEM;
642-
if (ctx->user)
643-
__io_unaccount_mem(ctx->user, 1);
644-
out_free:
645-
io_pages_free(&pages, nr_pages);
646-
return ret;
647-
}
648-
649573
static int __io_uring_register(struct io_ring_ctx *ctx, unsigned opcode,
650574
void __user *arg, unsigned nr_args)
651575
__releases(ctx->uring_lock)
@@ -840,12 +764,6 @@ static int __io_uring_register(struct io_ring_ctx *ctx, unsigned opcode,
840764
break;
841765
ret = io_register_resize_rings(ctx, arg);
842766
break;
843-
case IORING_REGISTER_CQWAIT_REG:
844-
ret = -EINVAL;
845-
if (!arg || nr_args != 1)
846-
break;
847-
ret = io_register_cqwait_reg(ctx, arg);
848-
break;
849767
default:
850768
ret = -EINVAL;
851769
break;

io_uring/register.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,5 @@
55
int io_eventfd_unregister(struct io_ring_ctx *ctx);
66
int io_unregister_personality(struct io_ring_ctx *ctx, unsigned id);
77
struct file *io_uring_register_get_file(unsigned int fd, bool registered);
8-
void io_unregister_cqwait_reg(struct io_ring_ctx *ctx);
98

109
#endif

0 commit comments

Comments
 (0)