Commit cea92448 authored by Jim Harris's avatar Jim Harris Committed by Tomasz Zawadzki
Browse files

nvmf: move all block-oriented calculations into nvmf_bdev_ctrlr_identify_ns()



This requires passing the transport's max_io_size to this function.
It's better to keep all of these calculations in one place,
especially to facilitate an upcoming patch.

Signed-off-by: default avatarJim Harris <jim.harris@nvidia.com>
Change-Id: I12d5c6240dbdd71896ea3650ea3d5a3141af1ad0
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/26509


Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz@tzawadzki.com>
Reviewed-by: default avatarAnkit Kumar <ankit.kumar@samsung.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
parent 40d2198b
Loading
Loading
Loading
Loading
+2 −16
Original line number Diff line number Diff line
@@ -2780,7 +2780,6 @@ nvmf_ctrlr_identify_ns(struct spdk_nvmf_ctrlr *ctrlr,
{
	struct spdk_nvmf_subsystem *subsystem = ctrlr->subsys;
	struct spdk_nvmf_ns *ns;
	uint32_t max_num_blocks, format_index;
	enum spdk_nvme_ana_state ana_state;

	ns = _nvmf_ctrlr_get_ns_safe(ctrlr, nsid, rsp);
@@ -2788,24 +2787,11 @@ nvmf_ctrlr_identify_ns(struct spdk_nvmf_ctrlr *ctrlr,
		return;
	}

	nvmf_bdev_ctrlr_identify_ns(ns, nsdata, ctrlr->dif_insert_or_strip);
	nvmf_bdev_ctrlr_identify_ns(ns, nsdata, ctrlr->dif_insert_or_strip,
				    ctrlr->admin_qpair->transport->opts.max_io_size);

	assert(ctrlr->admin_qpair);

	format_index = spdk_nvme_ns_get_format_index(nsdata);

	/* Due to bug in the Linux kernel NVMe driver we have to set noiob no larger than mdts */
	max_num_blocks = ctrlr->admin_qpair->transport->opts.max_io_size /
			 (1U << nsdata->lbaf[format_index].lbads);
	if (nsdata->noiob > max_num_blocks) {
		nsdata->noiob = max_num_blocks;
	}

	/* Set NOWS equal to Controller MDTS */
	if (nsdata->nsfeat.optperf) {
		nsdata->nows = max_num_blocks - 1;
	}

	if (subsystem->flags.ana_reporting) {
		assert(ns->anagrpid - 1 < subsystem->max_nsid);
		nsdata->anagrpid = ns->anagrpid;
+12 −3
Original line number Diff line number Diff line
@@ -117,12 +117,13 @@ nvmf_bdev_ctrlr_complete_admin_cmd(struct spdk_bdev_io *bdev_io, bool success,

void
nvmf_bdev_ctrlr_identify_ns(struct spdk_nvmf_ns *ns, struct spdk_nvme_ns_data *nsdata,
			    bool dif_insert_or_strip)
			    bool dif_insert_or_strip, uint32_t transport_max_io_size)
{
	struct spdk_bdev *bdev = ns->bdev;
	struct spdk_bdev_desc *desc = ns->desc;
	uint64_t num_blocks;
	uint32_t phys_blocklen;
	uint32_t max_num_blocks;
	uint32_t max_copy;

	num_blocks = spdk_bdev_get_num_blocks(bdev);
@@ -167,6 +168,8 @@ nvmf_bdev_ctrlr_identify_ns(struct spdk_nvmf_ns *ns, struct spdk_nvme_ns_data *n
		nsdata->lbaf[0].lbads = spdk_u32log2(spdk_bdev_get_data_block_size(bdev));
	}

	max_num_blocks = transport_max_io_size / (1U << nsdata->lbaf[0].lbads);

	phys_blocklen = spdk_bdev_get_physical_block_size(bdev);
	assert(phys_blocklen > 0);
	/* Linux driver uses min(nawupf, npwg) to set physical_block_size */
@@ -177,9 +180,15 @@ nvmf_bdev_ctrlr_identify_ns(struct spdk_nvmf_ns *ns, struct spdk_nvme_ns_data *n
	nsdata->npwa = nsdata->npwg;
	nsdata->npdg = nsdata->npwg;
	nsdata->npda = nsdata->npwg;

	/* Set NOWS equal to controller MDTS if the namespace did not set one
	 * explicitly.
	 */
	nsdata->nows = max_num_blocks - 1;
	if (spdk_bdev_get_write_unit_size(bdev) == 1) {
		nsdata->noiob = spdk_bdev_get_optimal_io_boundary(bdev);
		/* Due to bug in the Linux kernel NVMe driver, we have to set noiob no larger
		 * than mdts.
		 */
		nsdata->noiob = spdk_min(spdk_bdev_get_optimal_io_boundary(bdev), max_num_blocks);
	}
	nsdata->nmic.can_share = 1;
	if (nvmf_ns_is_ptpl_capable(ns)) {
+1 −1
Original line number Diff line number Diff line
@@ -404,7 +404,7 @@ void nvmf_ctrlr_ns_changed(struct spdk_nvmf_ctrlr *ctrlr, uint32_t nsid);
bool nvmf_ctrlr_use_zcopy(struct spdk_nvmf_request *req);

void nvmf_bdev_ctrlr_identify_ns(struct spdk_nvmf_ns *ns, struct spdk_nvme_ns_data *nsdata,
				 bool dif_insert_or_strip);
				 bool dif_insert_or_strip, uint32_t transport_max_io_size);
void nvmf_bdev_ctrlr_identify_iocs_nvm(struct spdk_nvmf_ns *ns,
				       struct spdk_nvme_nvm_ns_data *nsdata_nvm);
int nvmf_bdev_ctrlr_read_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
+1 −1
Original line number Diff line number Diff line
@@ -242,7 +242,7 @@ spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair)

void
nvmf_bdev_ctrlr_identify_ns(struct spdk_nvmf_ns *ns, struct spdk_nvme_ns_data *nsdata,
			    bool dif_insert_or_strip)
			    bool dif_insert_or_strip, uint32_t transport_max_io_size)
{
	uint64_t num_blocks;

+3 −2
Original line number Diff line number Diff line
@@ -572,7 +572,7 @@ test_nvmf_bdev_ctrlr_identify_ns(void)
	bdev.optimal_io_boundary = SPDK_BDEV_IO_NUM_CHILD_IOV;
	bdev.dif_is_head_of_md = true;

	nvmf_bdev_ctrlr_identify_ns(&ns, &nsdata, false);
	nvmf_bdev_ctrlr_identify_ns(&ns, &nsdata, false, 128 * 1024);
	CU_ASSERT(nsdata.nsze == 10);
	CU_ASSERT(nsdata.ncap == 10);
	CU_ASSERT(nsdata.nuse == 10);
@@ -580,6 +580,7 @@ test_nvmf_bdev_ctrlr_identify_ns(void)
	CU_ASSERT(nsdata.flbas.format == 0);
	CU_ASSERT(nsdata.flbas.msb_format == 0);
	CU_ASSERT(nsdata.nacwu == 0);
	CU_ASSERT(nsdata.nows == (128 * 1024 / 4096) - 1);
	CU_ASSERT(nsdata.lbaf[0].lbads == spdk_u32log2(4096));
	CU_ASSERT(nsdata.lbaf[0].ms == 512);
	CU_ASSERT(nsdata.dpc.pit1 == 1);
@@ -602,7 +603,7 @@ test_nvmf_bdev_ctrlr_identify_ns(void)
	CU_ASSERT(!strncmp((uint8_t *)&nsdata.eui64, eui64, 8));

	memset(&nsdata, 0, sizeof(nsdata));
	nvmf_bdev_ctrlr_identify_ns(&ns, &nsdata, true);
	nvmf_bdev_ctrlr_identify_ns(&ns, &nsdata, true, 128 * 1024);
	CU_ASSERT(nsdata.nsze == 10);
	CU_ASSERT(nsdata.ncap == 10);
	CU_ASSERT(nsdata.nuse == 10);
Loading