mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-23 14:02:06 -04:00
ublk: add read()/write() support for ublk char device
Support pread()/pwrite() on ublk char device for reading/writing request io buffer, so data copy between io request buffer and userspace buffer can be moved to ublk server from ublk driver. Then UBLK_F_NEED_GET_DATA becomes not necessary, so ublk server can allocate buffer without one extra round uring command communication for userspace to provide buffer. IO buffer can be located by iocb->ki_pos which encodes buffer offset, io tag and queue id info, and type of iocb->ki_pos is u64, so it is big enough for holding reasonable queue depth, nr_queues and max io buffer size. Signed-off-by: Ming Lei <ming.lei@redhat.com> Link: https://lore.kernel.org/r/20230519065030.351216-7-ming.lei@redhat.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
@@ -93,9 +93,29 @@
|
||||
#define UBLKSRV_CMD_BUF_OFFSET 0
|
||||
#define UBLKSRV_IO_BUF_OFFSET 0x80000000
|
||||
|
||||
/* tag bit is 12bit, so at most 4096 IOs for each queue */
|
||||
/* tag bit is 16bit, so far limit at most 4096 IOs for each queue */
|
||||
#define UBLK_MAX_QUEUE_DEPTH 4096
|
||||
|
||||
/* single IO buffer max size is 32MB */
|
||||
#define UBLK_IO_BUF_OFF 0
|
||||
#define UBLK_IO_BUF_BITS 25
|
||||
#define UBLK_IO_BUF_BITS_MASK ((1ULL << UBLK_IO_BUF_BITS) - 1)
|
||||
|
||||
/* so at most 64K IOs for each queue */
|
||||
#define UBLK_TAG_OFF UBLK_IO_BUF_BITS
|
||||
#define UBLK_TAG_BITS 16
|
||||
#define UBLK_TAG_BITS_MASK ((1ULL << UBLK_TAG_BITS) - 1)
|
||||
|
||||
/* max 4096 queues */
|
||||
#define UBLK_QID_OFF (UBLK_TAG_OFF + UBLK_TAG_BITS)
|
||||
#define UBLK_QID_BITS 12
|
||||
#define UBLK_QID_BITS_MASK ((1ULL << UBLK_QID_BITS) - 1)
|
||||
|
||||
#define UBLK_MAX_NR_QUEUES (1U << UBLK_QID_BITS)
|
||||
|
||||
#define UBLKSRV_IO_BUF_TOTAL_BITS (UBLK_QID_OFF + UBLK_QID_BITS)
|
||||
#define UBLKSRV_IO_BUF_TOTAL_SIZE (1ULL << UBLKSRV_IO_BUF_TOTAL_BITS)
|
||||
|
||||
/*
|
||||
* zero copy requires 4k block size, and can remap ublk driver's io
|
||||
* request into ublksrv's vm space
|
||||
|
||||
Reference in New Issue
Block a user