On Wed, Jan 27, 2021 at 9:32 PM Pavel Begunkov <asml.silence@xxxxxxxxx> wrote: > > On 27/01/2021 15:42, Pavel Begunkov wrote: > > On 27/01/2021 15:00, Kanchan Joshi wrote: > >> This RFC patchset adds asynchronous ioctl capability for NVMe devices. > >> Purpose of RFC is to get the feedback and optimize the path. > >> > >> At the uppermost io-uring layer, a new opcode IORING_OP_IOCTL_PT is > >> presented to user-space applications. Like regular-ioctl, it takes > >> ioctl opcode and an optional argument (ioctl-specific input/output > >> parameter). Unlike regular-ioctl, it is made to skip the block-layer > >> and reach directly to the underlying driver (nvme in the case of this > >> patchset). This path between io-uring and nvme is via a newly > >> introduced block-device operation "async_ioctl". This operation > >> expects io-uring to supply a callback function which can be used to > >> report completion at later stage. > >> > >> For a regular ioctl, NVMe driver submits the command to the device and > >> the submitter (task) is made to wait until completion arrives. For > >> async-ioctl, completion is decoupled from submission. Submitter goes > >> back to its business without waiting for nvme-completion. When > >> nvme-completion arrives, it informs io-uring via the registered > >> completion-handler. But some ioctls may require updating certain > >> ioctl-specific fields which can be accessed only in context of the > >> submitter task. For that reason, NVMe driver uses task-work infra for > >> that ioctl-specific update. Since task-work is not exported, it cannot > >> be referenced when nvme is compiled as a module. Therefore, one of the > >> patch exports task-work API. > >> > >> Here goes example of usage (pseudo-code). > >> Actual nvme-cli source, modified to issue all ioctls via this opcode > >> is present at- > >> https://github.com/joshkan/nvme-cli/commit/a008a733f24ab5593e7874cfbc69ee04e88068c5 > > > > see https://git.kernel.dk/cgit/linux-block/log/?h=io_uring-fops > > > > Looks like good time to bring that branch/discussion back > > a bit more context: > https://github.com/axboe/liburing/issues/270 Thanks, it looked good. It seems key differences (compared to uring-patch that I posted) are - 1. using file-operation instead of block-dev operation. 2. repurpose the sqe memory for ioctl-cmd. If an application does ioctl with <=40 bytes of cmd, it does not have to allocate ioctl-cmd. That's nifty. We still need to support passing larger-cmd (e.g. nvme-passthru ioctl takes 72 bytes) but that shouldn't get too difficult I suppose. And for some ioctls, driver may still need to use task-work to update the user-space pointers (embedded in uring/ioctl cmd) during completion. @Jens - will it be fine if I start looking at plumbing nvme-part of this series on top of your work? Thanks,