• Ming Lei's avatar
    ublk_drv: add io_uring based userspace block driver · 71f28f31
    Ming Lei authored
    This is the driver part of userspace block driver(ublk driver), the other
    part is userspace daemon part(ublksrv)[1].
    
    The two parts communicate by io_uring's IORING_OP_URING_CMD with one
    shared cmd buffer for storing io command, and the buffer is read only for
    ublksrv, each io command is indexed by io request tag directly, and is
    written by ublk driver.
    
    For example, when one READ io request is submitted to ublk block driver,
    ublk driver stores the io command into cmd buffer first, then completes
    one IORING_OP_URING_CMD for notifying ublksrv, and the URING_CMD is issued
    to ublk driver beforehand by ublksrv for getting notification of any new
    io request, and each URING_CMD is associated with one io request by tag.
    
    After ublksrv gets the io command, it translates and handles the ublk io
    request, such as, for the ublk-loop target, ublksrv translates the request
    into same request on another file or disk, like the kernel loop block
    driver. In ublksrv's implementation, the io is still handled by io_uring,
    and share same ring with IORING_OP_URING_CMD command. When the target io
    request is done, the same IORING_OP_URING_CMD is issued to ublk driver for
    both committing io request result and getting future notification of new
    io request.
    
    Another thing done by ublk driver is to copy data between kernel io
    request and ublksrv's io buffer:
    
    1) before ubsrv handles WRITE request, copy the request's data into
       ublksrv's userspace io buffer, so that ublksrv can handle the write
       request
    
    2) after ubsrv handles READ request, copy ublksrv's userspace io buffer
       into this READ request, then ublk driver can complete the READ request
    
    Zero copy may be switched if mm is ready to support it.
    
    ublk driver doesn't handle any logic of the specific user space driver,
    so it is small/simple enough.
    
    [1] ublksrv
    
    https://github.com/ming1/ubdsrvSigned-off-by: default avatarMing Lei <ming.lei@redhat.com>
    Link: https://lore.kernel.org/r/20220713140711.97356-2-ming.lei@redhat.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    71f28f31
Kconfig 14.5 KB