Commit 8c02add9 authored by Marcin Spiewak's avatar Marcin Spiewak Committed by Jim Harris
Browse files

ut/nvme_pcie: added test for building PRP MD while SGL supported



Added a test for buildig metadata, when the controller
supports SGLs, but it doesn't support Metadata Pointer
containing an SGL Descriptor. In such case cmd.psdt
shall be set to SPDK_NVME_PSDT_SGL_MPTR_CONTIG

Change-Id: I46c15c6dbfc5bad0e3ece083e840aee523b76816
Signed-off-by: default avatarMarcin Spiewak <marcin.spiewak@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/18095


Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
parent 074c62d0
Loading
Loading
Loading
Loading
+19 −1
Original line number Diff line number Diff line
@@ -505,13 +505,18 @@ test_nvme_pcie_qpair_build_metadata(void)
	req.payload.md = (void *)0xDEADBEE0;
	req.md_offset = 0;
	req.md_size = 4096;
	/* The nvme_pcie_qpair_build_metadata() function expects the cmd.psdt
	 * is set to SPDK_NVME_PSDT_SGL_MPTR_CONTIG, and then if metadata is
	 * built using SGL, cmd.psdt is changed to SPDK_NVME_PSDT_SGL_MPTR_SGL
	 * by this function. We need to verify if this indeed is the case.
	 */
	req.cmd.psdt = SPDK_NVME_PSDT_SGL_MPTR_CONTIG;
	tr.prp_sgl_bus_addr = 0xDBADBEEF;
	MOCK_SET(spdk_vtophys, 0xDCADBEE0);

	rc = nvme_pcie_qpair_build_metadata(qpair, &tr, true, true, true);
	CU_ASSERT(rc == 0);
	CU_ASSERT(req.cmd.psdt = SPDK_NVME_PSDT_SGL_MPTR_SGL);
	CU_ASSERT(req.cmd.psdt == SPDK_NVME_PSDT_SGL_MPTR_SGL);
	CU_ASSERT(tr.meta_sgl.address == 0xDCADBEE0);
	CU_ASSERT(tr.meta_sgl.unkeyed.type == SPDK_NVME_SGL_TYPE_DATA_BLOCK);
	CU_ASSERT(tr.meta_sgl.unkeyed.length == 4096);
@@ -534,6 +539,19 @@ test_nvme_pcie_qpair_build_metadata(void)
	CU_ASSERT(rc == 0);
	CU_ASSERT(req.cmd.mptr == 0xDDADBEE0);

	/* Build non sgl metadata while sgls are supported */
	memset(&tr.meta_sgl, 0, sizeof(tr.meta_sgl));
	/* If SGLs are supported, but not in metadata, the cmd.psdt
	 * shall not be changed to SPDK_NVME_PSDT_SGL_MPTR_SGL
	 */
	req.cmd.psdt = SPDK_NVME_PSDT_SGL_MPTR_CONTIG;
	rc = nvme_pcie_qpair_build_metadata(qpair, &tr, true, false, true);
	CU_ASSERT(rc == 0);
	CU_ASSERT(tr.meta_sgl.address == 0);
	CU_ASSERT(tr.meta_sgl.unkeyed.length == 0);
	CU_ASSERT(req.cmd.psdt == SPDK_NVME_PSDT_SGL_MPTR_CONTIG);
	CU_ASSERT(req.cmd.mptr == 0xDDADBEE0);

	/* Non-IOVA contiguous metadata buffers should fail. */
	g_vtophys_size = 1024;
	rc = nvme_pcie_qpair_build_metadata(qpair, &tr, false, false, true);