Re: [PATCH 00/10] io_uring/ublk: exit notifier support
From: Jens Axboe <axboe@kernel.dk>
Date: 2023-09-18 15:30:36
Also in:
io-uring
On 9/18/23 7:24 AM, Ming Lei wrote:
On Mon, Sep 18, 2023 at 06:54:33AM -0600, Jens Axboe wrote:quoted
On 9/17/23 10:10 PM, Ming Lei wrote:quoted
Hello, In do_exit(), io_uring needs to wait pending requests. ublk is one uring_cmd driver, and its usage is a bit special by submitting command for waiting incoming block IO request in advance, so if there isn't any IO request coming, the command can't be completed. So far ublk driver has to bind its queue with one ublk daemon server, meantime starts one monitor work to check if this daemon is live periodically. This way requires ublk queue to be bound one single daemon pthread, and not flexible, meantime the monitor work is run in 3rd context, and the implementation is a bit tricky. The 1st 3 patches adds io_uring task exit notifier, and the other patches converts ublk into this exit notifier, and the implementation becomes more robust & readable, meantime it becomes easier to relax the ublk queue/daemon limit in future, such as not require to bind ublk queue with single daemon.The normal approach for this is to ensure that each request is cancelable, which we need for other things too (like actual cancel support) Why can't we just do the same for ublk?I guess you meant IORING_OP_ASYNC_CANCEL, which needs userspace to submit this command, but here the userspace(ublk server) may be just panic or killed, and there isn't chance to send IORING_OP_ASYNC_CANCEL.
Either that, or cancel done because of task exit.
And driver doesn't have any knowledge if the io_uring ctx or io task is exiting, so can't complete issued commands, then hang in io_uring_cancel_generic() when the io task/ctx is exiting.
If you hooked into the normal cancel paths, you very much would get notified when the task is exiting. That's how the other cancelations work, eg if a task has pending poll requests and exits, they get canceled and reaped. -- Jens Axboe