On 5/12/22 10:38 PM, Hao Xu wrote: > ? 2022/5/9 ??11:50, Jens Axboe ??: >> If the application passes in IORING_FILE_INDEX_ALLOC as the file_slot, >> then that's a hint to allocate a fixed file descriptor rather than have >> one be passed in directly. >> >> This can be useful for having io_uring manage the direct descriptor space. >> >> Normal open direct requests will complete with 0 for success, and < 0 >> in case of error. If io_uring is asked to allocated the direct descriptor, >> then the direct descriptor is returned in case of success. >> >> Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> >> --- >> fs/io_uring.c | 32 +++++++++++++++++++++++++++++--- >> include/uapi/linux/io_uring.h | 9 +++++++++ >> 2 files changed, 38 insertions(+), 3 deletions(-) >> >> diff --git a/fs/io_uring.c b/fs/io_uring.c >> index 8c40411a7e78..ef999d0e09de 100644 >> --- a/fs/io_uring.c >> +++ b/fs/io_uring.c >> @@ -4697,7 +4697,7 @@ static int io_openat2_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) >> return __io_openat_prep(req, sqe); >> } >> -static int __maybe_unused io_file_bitmap_get(struct io_ring_ctx *ctx) >> +static int io_file_bitmap_get(struct io_ring_ctx *ctx) >> { >> struct io_file_table *table = &ctx->file_table; >> unsigned long nr = ctx->nr_user_files; >> @@ -4722,6 +4722,32 @@ static int __maybe_unused io_file_bitmap_get(struct io_ring_ctx *ctx) >> return -ENFILE; >> } >> +static int io_fixed_fd_install(struct io_kiocb *req, unsigned int issue_flags, >> + struct file *file, unsigned int file_slot) >> +{ >> + int alloc_slot = file_slot == IORING_FILE_INDEX_ALLOC; >> + struct io_ring_ctx *ctx = req->ctx; >> + int ret; >> + >> + if (alloc_slot) { >> + io_ring_submit_lock(ctx, issue_flags); >> + file_slot = io_file_bitmap_get(ctx); >> + if (unlikely(file_slot < 0)) { >> + io_ring_submit_unlock(ctx, issue_flags); >> + return file_slot; >> + } >> + } >> + >> + ret = io_install_fixed_file(req, file, issue_flags, file_slot); >> + if (alloc_slot) { >> + io_ring_submit_unlock(ctx, issue_flags); >> + if (!ret) >> + return file_slot; > > Sorry, I missed onething, looks like this should be file_slot+1, as this > is returned to the userspace. I refer to the previous open/accept direct > feature, they see the file_index from userspace as number counted from > one, so it'd better to keep it consistent. We need to return the actual slot, not slot + 1. It's kind of an ugly API, but what we had left to deal with. The actual slot number is what most other things would fill into sqe->fd and set IOSQE_FIXED_FILE with, not slot + 1. -- Jens Axboe