From 2044690e6a7c8bf650e680823bb463e9a78807d6 Mon Sep 17 00:00:00 2001 From: Dariusz Stojaczyk Date: Wed, 27 Jun 2018 10:29:22 +0200 Subject: [PATCH] env: introduce SPDK_MEMZONE_NO_IOVA_CONTIG Future DPDK versions may drop physical memory contiguity guarantee for common memzones. DPDK 18.05 introduces an RTE_MEMZONE_IOVA_CONTIG (0x00100000) flag, which is documented as follows: > RTE_MEMZONE_IOVA_CONTIG - Ensure reserved memzone is IOVA-contiguous. > This option should be used when allocating > memory intended for hardware rings etc. To preserve backward compatibility, SPDK introduces an opposite flag, SPDK_MEMZONE_NO_IOVA_CONTIG. Change-Id: I9ea79b096fdb094051f13c9a802740b0e4ccc98e Signed-off-by: Dariusz Stojaczyk Reviewed-on: https://review.gerrithub.io/416977 Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp Reviewed-by: Shuhei Matsumoto --- include/spdk/env.h | 5 +++++ lib/env_dpdk/env.c | 9 +++++++++ lib/nvme/nvme.c | 3 ++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/include/spdk/env.h b/include/spdk/env.h index c401f55b3..5e841d09f 100644 --- a/include/spdk/env.h +++ b/include/spdk/env.h @@ -58,6 +58,11 @@ extern "C" { */ #define SPDK_MALLOC_SHARE 0x02 +/** + * Memzone flags + */ +#define SPDK_MEMZONE_NO_IOVA_CONTIG 0x00100000 /**< no iova contiguity */ + struct spdk_pci_device; /** diff --git a/lib/env_dpdk/env.c b/lib/env_dpdk/env.c index bcbe305ec..b7659600b 100644 --- a/lib/env_dpdk/env.c +++ b/lib/env_dpdk/env.c @@ -138,6 +138,15 @@ spdk_memzone_reserve(const char *name, size_t len, int socket_id, unsigned flags const struct rte_memzone *mz; unsigned dpdk_flags = 0; +#if RTE_VERSION >= RTE_VERSION_NUM(18, 05, 0, 0) + /* Older DPDKs do not offer such flag since their + * memzones are iova-contiguous by default. + */ + if ((flags & SPDK_MEMZONE_NO_IOVA_CONTIG) == 0) { + dpdk_flags |= RTE_MEMZONE_IOVA_CONTIG; + } +#endif + if (socket_id == SPDK_ENV_SOCKET_ID_ANY) { socket_id = SOCKET_ID_ANY; } diff --git a/lib/nvme/nvme.c b/lib/nvme/nvme.c index eb52b9001..b03fc90fc 100644 --- a/lib/nvme/nvme.c +++ b/lib/nvme/nvme.c @@ -305,7 +305,8 @@ nvme_driver_init(void) return 0; } else { g_spdk_nvme_driver = spdk_memzone_reserve(SPDK_NVME_DRIVER_NAME, - sizeof(struct nvme_driver), socket_id, 0); + sizeof(struct nvme_driver), socket_id, + SPDK_MEMZONE_NO_IOVA_CONTIG); } if (g_spdk_nvme_driver == NULL) {