diff --git a/include/spdk/env.h b/include/spdk/env.h index 5e841d09f..3d7f5fca4 100644 --- a/include/spdk/env.h +++ b/include/spdk/env.h @@ -255,6 +255,22 @@ void spdk_dma_free(void *buf); */ void *spdk_memzone_reserve(const char *name, size_t len, int socket_id, unsigned flags); +/** + * Reserve a named, process shared memory zone with the given size, socket_id, + * flags and alignment. + * + * \param name Name to set for this memory zone. + * \param len Length in bytes. + * \param socket_id Socket ID to allocate memory on, or SPDK_ENV_SOCKET_ID_ANY + * for any socket. + * \param flags Flags to set for this memory zone. + * \param align Alignment for resulting memzone. Must be a power of 2. + * + * \return a pointer to the allocated memory address on success, or NULL on failure. + */ +void *spdk_memzone_reserve_aligned(const char *name, size_t len, int socket_id, + unsigned flags, unsigned align); + /** * Lookup the memory zone identified by the given name. * diff --git a/lib/env_dpdk/env.c b/lib/env_dpdk/env.c index b7659600b..02cd55730 100644 --- a/lib/env_dpdk/env.c +++ b/lib/env_dpdk/env.c @@ -133,7 +133,8 @@ spdk_dma_free(void *buf) } void * -spdk_memzone_reserve(const char *name, size_t len, int socket_id, unsigned flags) +spdk_memzone_reserve_aligned(const char *name, size_t len, int socket_id, + unsigned flags, unsigned align) { const struct rte_memzone *mz; unsigned dpdk_flags = 0; @@ -151,7 +152,7 @@ spdk_memzone_reserve(const char *name, size_t len, int socket_id, unsigned flags socket_id = SOCKET_ID_ANY; } - mz = rte_memzone_reserve(name, len, socket_id, dpdk_flags); + mz = rte_memzone_reserve_aligned(name, len, socket_id, dpdk_flags, align); if (mz != NULL) { memset(mz->addr, 0, len); @@ -161,6 +162,13 @@ spdk_memzone_reserve(const char *name, size_t len, int socket_id, unsigned flags } } +void * +spdk_memzone_reserve(const char *name, size_t len, int socket_id, unsigned flags) +{ + return spdk_memzone_reserve_aligned(name, len, socket_id, flags, + RTE_CACHE_LINE_SIZE); +} + void * spdk_memzone_lookup(const char *name) { diff --git a/test/common/lib/test_env.c b/test/common/lib/test_env.c index 43a1c4134..deda18564 100644 --- a/test/common/lib/test_env.c +++ b/test/common/lib/test_env.c @@ -75,6 +75,20 @@ spdk_memzone_reserve(const char *name, size_t len, int socket_id, unsigned flags } } +/* setup the mock control to pass thru by default */ +void *ut_p_spdk_memzone_reserve_aligned = MOCK_PASS_THRU_P; +void * +spdk_memzone_reserve_aligned(const char *name, size_t len, int socket_id, + unsigned flags, unsigned align) +{ + if (ut_p_spdk_memzone_reserve_aligned && + ut_p_spdk_memzone_reserve_aligned == MOCK_PASS_THRU_P) { + return malloc(len); + } else { + return ut_p_spdk_memzone_reserve_aligned; + } +} + void * spdk_dma_malloc(size_t size, size_t align, uint64_t *phys_addr) {