On 5/12/22 11:28 PM, Hao Xu wrote: > ? 2022/5/12 ??8:23, Jens Axboe ??: >> On 5/12/22 2:21 AM, 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; >>>> + } >>>> + } >>> >>> if (alloc_slot) { >>> ... >>> } else { >>> file_slot -= 1; >>> } >>> >>> Otherwise there is off-by-one error. >>> >>> Others looks good, >>> >>> Reviewed-by: Hao Xu <howeyxu@xxxxxxxxxxx> >> >> Thanks, you are correct, I've folded that in. >> > > Hi Jens, > I've rebased multishot accept based on your fixed-alloc branch: > > https://github.com/HowHsu/linux/commits/for-5.19/io_uring_multishot_accept_v6 > > Let me know when ixed-alloc is ready, then I'll do the final rebase > for multishot accept and send it to the list, including the liburing > change. Just base it against for-5.19/io_uring, I'm fixing the one-off and pushing it out. -- Jens Axboe