Skip to content

Commit

Permalink
io_uring: change registration/upd/rsrc tagging ABI
Browse files Browse the repository at this point in the history
There are ABI moments about recently added rsrc registration/update and
tagging that might become a nuisance in the future. First,
IORING_REGISTER_RSRC[_UPD] hide different types of resources under it,
so breaks fine control over them by restrictions. It works for now, but
once those are wanted under restrictions it would require a rework.

It was also inconvenient trying to fit a new resource not supporting
all the features (e.g. dynamic update) into the interface, so better
to return to IORING_REGISTER_* top level dispatching.

Second, register/update were considered to accept a type of resource,
however that's not a good idea because there might be several ways of
registration of a single resource type, e.g. we may want to add
non-contig buffers or anything more exquisite as dma mapped memory.
So, remove IORING_RSRC_[FILE,BUFFER] out of the ABI, and place them
internally for now to limit changes.

Signed-off-by: Pavel Begunkov <[email protected]>
Link: https://lore.kernel.org/r/9b554897a7c17ad6e3becc48dfed2f7af9f423d5.1623339162.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
isilence authored and axboe committed Jun 10, 2021
1 parent 216e583 commit 992da01
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 21 deletions.
39 changes: 27 additions & 12 deletions fs/io_uring.c
Original file line number Diff line number Diff line change
Expand Up @@ -783,6 +783,11 @@ struct io_task_work {
task_work_func_t func;
};

enum {
IORING_RSRC_FILE = 0,
IORING_RSRC_BUFFER = 1,
};

/*
* NOTE! Each of the iocb union members has the file pointer
* as the first entry in their struct definition. So you can
Expand Down Expand Up @@ -9911,21 +9916,21 @@ static int io_register_files_update(struct io_ring_ctx *ctx, void __user *arg,
}

static int io_register_rsrc_update(struct io_ring_ctx *ctx, void __user *arg,
unsigned size)
unsigned size, unsigned type)
{
struct io_uring_rsrc_update2 up;

if (size != sizeof(up))
return -EINVAL;
if (copy_from_user(&up, arg, sizeof(up)))
return -EFAULT;
if (!up.nr)
if (!up.nr || up.resv)
return -EINVAL;
return __io_register_rsrc_update(ctx, up.type, &up, up.nr);
return __io_register_rsrc_update(ctx, type, &up, up.nr);
}

static int io_register_rsrc(struct io_ring_ctx *ctx, void __user *arg,
unsigned int size)
unsigned int size, unsigned int type)
{
struct io_uring_rsrc_register rr;

Expand All @@ -9936,10 +9941,10 @@ static int io_register_rsrc(struct io_ring_ctx *ctx, void __user *arg,
memset(&rr, 0, sizeof(rr));
if (copy_from_user(&rr, arg, size))
return -EFAULT;
if (!rr.nr)
if (!rr.nr || rr.resv || rr.resv2)
return -EINVAL;

switch (rr.type) {
switch (type) {
case IORING_RSRC_FILE:
return io_sqe_files_register(ctx, u64_to_user_ptr(rr.data),
rr.nr, u64_to_user_ptr(rr.tags));
Expand All @@ -9961,8 +9966,10 @@ static bool io_register_op_must_quiesce(int op)
case IORING_REGISTER_PROBE:
case IORING_REGISTER_PERSONALITY:
case IORING_UNREGISTER_PERSONALITY:
case IORING_REGISTER_RSRC:
case IORING_REGISTER_RSRC_UPDATE:
case IORING_REGISTER_FILES2:
case IORING_REGISTER_FILES_UPDATE2:
case IORING_REGISTER_BUFFERS2:
case IORING_REGISTER_BUFFERS_UPDATE:
return false;
default:
return true;
Expand Down Expand Up @@ -10088,11 +10095,19 @@ static int __io_uring_register(struct io_ring_ctx *ctx, unsigned opcode,
case IORING_REGISTER_RESTRICTIONS:
ret = io_register_restrictions(ctx, arg, nr_args);
break;
case IORING_REGISTER_RSRC:
ret = io_register_rsrc(ctx, arg, nr_args);
case IORING_REGISTER_FILES2:
ret = io_register_rsrc(ctx, arg, nr_args, IORING_RSRC_FILE);
break;
case IORING_REGISTER_FILES_UPDATE2:
ret = io_register_rsrc_update(ctx, arg, nr_args,
IORING_RSRC_FILE);
break;
case IORING_REGISTER_BUFFERS2:
ret = io_register_rsrc(ctx, arg, nr_args, IORING_RSRC_BUFFER);
break;
case IORING_REGISTER_RSRC_UPDATE:
ret = io_register_rsrc_update(ctx, arg, nr_args);
case IORING_REGISTER_BUFFERS_UPDATE:
ret = io_register_rsrc_update(ctx, arg, nr_args,
IORING_RSRC_BUFFER);
break;
default:
ret = -EINVAL;
Expand Down
18 changes: 9 additions & 9 deletions include/uapi/linux/io_uring.h
Original file line number Diff line number Diff line change
Expand Up @@ -298,8 +298,12 @@ enum {
IORING_UNREGISTER_PERSONALITY = 10,
IORING_REGISTER_RESTRICTIONS = 11,
IORING_REGISTER_ENABLE_RINGS = 12,
IORING_REGISTER_RSRC = 13,
IORING_REGISTER_RSRC_UPDATE = 14,

/* extended with tagging */
IORING_REGISTER_FILES2 = 13,
IORING_REGISTER_FILES_UPDATE2 = 14,
IORING_REGISTER_BUFFERS2 = 15,
IORING_REGISTER_BUFFERS_UPDATE = 16,

/* this goes last */
IORING_REGISTER_LAST
Expand All @@ -312,14 +316,10 @@ struct io_uring_files_update {
__aligned_u64 /* __s32 * */ fds;
};

enum {
IORING_RSRC_FILE = 0,
IORING_RSRC_BUFFER = 1,
};

struct io_uring_rsrc_register {
__u32 type;
__u32 nr;
__u32 resv;
__u64 resv2;
__aligned_u64 data;
__aligned_u64 tags;
};
Expand All @@ -335,8 +335,8 @@ struct io_uring_rsrc_update2 {
__u32 resv;
__aligned_u64 data;
__aligned_u64 tags;
__u32 type;
__u32 nr;
__u32 resv2;
};

/* Skip updating fd indexes set to this value in the fd table */
Expand Down

0 comments on commit 992da01

Please sign in to comment.