io_uring: change registration/upd/rsrc tagging ABI
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 <asml.silence@gmail.com> Link: https://lore.kernel.org/r/9b554897a7c17ad6e3becc48dfed2f7af9f423d5.1623339162.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
216e583596
commit
992da01aa9
2 changed files with 36 additions and 21 deletions
|
@ -783,6 +783,11 @@ struct io_task_work {
|
||||||
task_work_func_t func;
|
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
|
* NOTE! Each of the iocb union members has the file pointer
|
||||||
* as the first entry in their struct definition. So you can
|
* as the first entry in their struct definition. So you can
|
||||||
|
@ -9911,7 +9916,7 @@ 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,
|
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;
|
struct io_uring_rsrc_update2 up;
|
||||||
|
|
||||||
|
@ -9919,13 +9924,13 @@ static int io_register_rsrc_update(struct io_ring_ctx *ctx, void __user *arg,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (copy_from_user(&up, arg, sizeof(up)))
|
if (copy_from_user(&up, arg, sizeof(up)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (!up.nr)
|
if (!up.nr || up.resv)
|
||||||
return -EINVAL;
|
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,
|
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;
|
struct io_uring_rsrc_register rr;
|
||||||
|
|
||||||
|
@ -9936,10 +9941,10 @@ static int io_register_rsrc(struct io_ring_ctx *ctx, void __user *arg,
|
||||||
memset(&rr, 0, sizeof(rr));
|
memset(&rr, 0, sizeof(rr));
|
||||||
if (copy_from_user(&rr, arg, size))
|
if (copy_from_user(&rr, arg, size))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (!rr.nr)
|
if (!rr.nr || rr.resv || rr.resv2)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
switch (rr.type) {
|
switch (type) {
|
||||||
case IORING_RSRC_FILE:
|
case IORING_RSRC_FILE:
|
||||||
return io_sqe_files_register(ctx, u64_to_user_ptr(rr.data),
|
return io_sqe_files_register(ctx, u64_to_user_ptr(rr.data),
|
||||||
rr.nr, u64_to_user_ptr(rr.tags));
|
rr.nr, u64_to_user_ptr(rr.tags));
|
||||||
|
@ -9961,8 +9966,10 @@ static bool io_register_op_must_quiesce(int op)
|
||||||
case IORING_REGISTER_PROBE:
|
case IORING_REGISTER_PROBE:
|
||||||
case IORING_REGISTER_PERSONALITY:
|
case IORING_REGISTER_PERSONALITY:
|
||||||
case IORING_UNREGISTER_PERSONALITY:
|
case IORING_UNREGISTER_PERSONALITY:
|
||||||
case IORING_REGISTER_RSRC:
|
case IORING_REGISTER_FILES2:
|
||||||
case IORING_REGISTER_RSRC_UPDATE:
|
case IORING_REGISTER_FILES_UPDATE2:
|
||||||
|
case IORING_REGISTER_BUFFERS2:
|
||||||
|
case IORING_REGISTER_BUFFERS_UPDATE:
|
||||||
return false;
|
return false;
|
||||||
default:
|
default:
|
||||||
return true;
|
return true;
|
||||||
|
@ -10088,11 +10095,19 @@ static int __io_uring_register(struct io_ring_ctx *ctx, unsigned opcode,
|
||||||
case IORING_REGISTER_RESTRICTIONS:
|
case IORING_REGISTER_RESTRICTIONS:
|
||||||
ret = io_register_restrictions(ctx, arg, nr_args);
|
ret = io_register_restrictions(ctx, arg, nr_args);
|
||||||
break;
|
break;
|
||||||
case IORING_REGISTER_RSRC:
|
case IORING_REGISTER_FILES2:
|
||||||
ret = io_register_rsrc(ctx, arg, nr_args);
|
ret = io_register_rsrc(ctx, arg, nr_args, IORING_RSRC_FILE);
|
||||||
break;
|
break;
|
||||||
case IORING_REGISTER_RSRC_UPDATE:
|
case IORING_REGISTER_FILES_UPDATE2:
|
||||||
ret = io_register_rsrc_update(ctx, arg, nr_args);
|
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_BUFFERS_UPDATE:
|
||||||
|
ret = io_register_rsrc_update(ctx, arg, nr_args,
|
||||||
|
IORING_RSRC_BUFFER);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
|
|
|
@ -298,8 +298,12 @@ enum {
|
||||||
IORING_UNREGISTER_PERSONALITY = 10,
|
IORING_UNREGISTER_PERSONALITY = 10,
|
||||||
IORING_REGISTER_RESTRICTIONS = 11,
|
IORING_REGISTER_RESTRICTIONS = 11,
|
||||||
IORING_REGISTER_ENABLE_RINGS = 12,
|
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 */
|
/* this goes last */
|
||||||
IORING_REGISTER_LAST
|
IORING_REGISTER_LAST
|
||||||
|
@ -312,14 +316,10 @@ struct io_uring_files_update {
|
||||||
__aligned_u64 /* __s32 * */ fds;
|
__aligned_u64 /* __s32 * */ fds;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
|
||||||
IORING_RSRC_FILE = 0,
|
|
||||||
IORING_RSRC_BUFFER = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct io_uring_rsrc_register {
|
struct io_uring_rsrc_register {
|
||||||
__u32 type;
|
|
||||||
__u32 nr;
|
__u32 nr;
|
||||||
|
__u32 resv;
|
||||||
|
__u64 resv2;
|
||||||
__aligned_u64 data;
|
__aligned_u64 data;
|
||||||
__aligned_u64 tags;
|
__aligned_u64 tags;
|
||||||
};
|
};
|
||||||
|
@ -335,8 +335,8 @@ struct io_uring_rsrc_update2 {
|
||||||
__u32 resv;
|
__u32 resv;
|
||||||
__aligned_u64 data;
|
__aligned_u64 data;
|
||||||
__aligned_u64 tags;
|
__aligned_u64 tags;
|
||||||
__u32 type;
|
|
||||||
__u32 nr;
|
__u32 nr;
|
||||||
|
__u32 resv2;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Skip updating fd indexes set to this value in the fd table */
|
/* Skip updating fd indexes set to this value in the fd table */
|
||||||
|
|
Loading…
Add table
Reference in a new issue