Skip to content

Commit e84025d

Browse files
Ming Leiaxboe
authored andcommitted
ublk: add DMA alignment limit
The in-tree ublk driver doesn't need DMA alignment limit because there is one data copy between request pages and the userspace buffer. However, ublk is going to support zero copy, then DMA alignment limit is required, because same IO buffer is forwarded to backend which may have specific buffer DMA alignment limit, so the limit has to be exposed from the frontend driver to client application. Cc: Keith Busch <[email protected]> Signed-off-by: Ming Lei <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent 105ca2a commit e84025d

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

drivers/block/ublk_drv.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@
7070
/* All UBLK_PARAM_TYPE_* should be included here */
7171
#define UBLK_PARAM_TYPE_ALL \
7272
(UBLK_PARAM_TYPE_BASIC | UBLK_PARAM_TYPE_DISCARD | \
73-
UBLK_PARAM_TYPE_DEVT | UBLK_PARAM_TYPE_ZONED)
73+
UBLK_PARAM_TYPE_DEVT | UBLK_PARAM_TYPE_ZONED | \
74+
UBLK_PARAM_TYPE_DMA_ALIGN)
7475

7576
struct ublk_rq_data {
7677
struct llist_node node;
@@ -568,6 +569,16 @@ static int ublk_validate_params(const struct ublk_device *ub)
568569
else if (ublk_dev_is_zoned(ub))
569570
return -EINVAL;
570571

572+
if (ub->params.types & UBLK_PARAM_TYPE_DMA_ALIGN) {
573+
const struct ublk_param_dma_align *p = &ub->params.dma;
574+
575+
if (p->alignment >= PAGE_SIZE)
576+
return -EINVAL;
577+
578+
if (!is_power_of_2(p->alignment + 1))
579+
return -EINVAL;
580+
}
581+
571582
return 0;
572583
}
573584

@@ -2300,6 +2311,9 @@ static int ublk_ctrl_start_dev(struct ublk_device *ub, struct io_uring_cmd *cmd)
23002311
if (ub->params.basic.attrs & UBLK_ATTR_ROTATIONAL)
23012312
lim.features |= BLK_FEAT_ROTATIONAL;
23022313

2314+
if (ub->params.types & UBLK_PARAM_TYPE_DMA_ALIGN)
2315+
lim.dma_alignment = ub->params.dma.alignment;
2316+
23032317
if (wait_for_completion_interruptible(&ub->completion) != 0)
23042318
return -EINTR;
23052319

include/uapi/linux/ublk_cmd.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,11 @@ struct ublk_param_zoned {
401401
__u8 reserved[20];
402402
};
403403

404+
struct ublk_param_dma_align {
405+
__u32 alignment;
406+
__u8 pad[4];
407+
};
408+
404409
struct ublk_params {
405410
/*
406411
* Total length of parameters, userspace has to set 'len' for both
@@ -413,12 +418,14 @@ struct ublk_params {
413418
#define UBLK_PARAM_TYPE_DISCARD (1 << 1)
414419
#define UBLK_PARAM_TYPE_DEVT (1 << 2)
415420
#define UBLK_PARAM_TYPE_ZONED (1 << 3)
421+
#define UBLK_PARAM_TYPE_DMA_ALIGN (1 << 4)
416422
__u32 types; /* types of parameter included */
417423

418424
struct ublk_param_basic basic;
419425
struct ublk_param_discard discard;
420426
struct ublk_param_devt devt;
421427
struct ublk_param_zoned zoned;
428+
struct ublk_param_dma_align dma;
422429
};
423430

424431
#endif

0 commit comments

Comments
 (0)