On 5/13/22 6:25 AM, Jens Axboe wrote: > 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. You can send it against now, I don't think there's any further changes needed. -- Jens Axboe