From fed1f52b9e92bd7dde34073e015703ffc6dfc100 Mon Sep 17 00:00:00 2001 From: Artur Paszkiewicz Date: Thu, 24 Nov 2022 10:08:16 +0100 Subject: [PATCH] nvmef: don't set optimal I/O boundary if write_unit_size != 1 Optimal I/O boundary causes I/O to be split in the nvme driver. This is a problem for writes if write_unit_size > 1 because the split I/O may not match the write_unit_size. Fixes: #2791 Change-Id: I437e6cb6d8e2415658d5b46539feeacb5363fd46 Signed-off-by: Artur Paszkiewicz Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15627 Tested-by: SPDK CI Jenkins Community-CI: Mellanox Build Bot Reviewed-by: Ben Walker Reviewed-by: Tomasz Zawadzki --- lib/nvmf/ctrlr_bdev.c | 4 +++- test/unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/nvmf/ctrlr_bdev.c b/lib/nvmf/ctrlr_bdev.c index aa26f7f32..d4938f862 100644 --- a/lib/nvmf/ctrlr_bdev.c +++ b/lib/nvmf/ctrlr_bdev.c @@ -159,7 +159,9 @@ nvmf_bdev_ctrlr_identify_ns(struct spdk_nvmf_ns *ns, struct spdk_nvme_ns_data *n nsdata->npdg = nsdata->npwg; nsdata->npda = nsdata->npwg; - nsdata->noiob = spdk_bdev_get_optimal_io_boundary(bdev); + if (spdk_bdev_get_write_unit_size(bdev) == 1) { + nsdata->noiob = spdk_bdev_get_optimal_io_boundary(bdev); + } nsdata->nmic.can_share = 1; if (ns->ptpl_file != NULL) { nsdata->nsrescap.rescap.persist = 1; diff --git a/test/unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c b/test/unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c index c0bfe1cbf..3923a12f6 100644 --- a/test/unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c +++ b/test/unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c @@ -42,6 +42,7 @@ DEFINE_STUB(spdk_bdev_abort, int, DEFINE_STUB_V(spdk_bdev_io_get_iovec, (struct spdk_bdev_io *bdev_io, struct iovec **iovp, int *iovcntp)); +DEFINE_STUB(spdk_bdev_get_write_unit_size, uint32_t, (const struct spdk_bdev *bdev), 1); uint32_t spdk_bdev_get_optimal_io_boundary(const struct spdk_bdev *bdev)