From 9cec99b84b9a08e9122ada4f4455172e40ff6c06 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Sat, 17 Nov 2018 05:49:21 -0700 Subject: [PATCH] env_dpdk: tell DPDK to not free dynamically allocated memory This keeps us from having to deal with ALLOC and FREE events for mismatching regions - which necessitated splitting new regions into individual pages. This caused all kinds of problems with NVMe-oF - for example, buffers that spanned memory regions, or bumping up against MR limits on RDMA NICs. Signed-off-by: Jim Harris Change-Id: I18dcdae148436b55d4481bb9fb8799f4832c7de1 Reviewed-on: https://review.gerrithub.io/434895 Tested-by: SPDK CI Jenkins Reviewed-by: Seth Howell Reviewed-by: Changpeng Liu Reviewed-by: Sasha Kotchubievsky Reviewed-by: Shuhei Matsumoto Chandler-Test-Pool: SPDK Automated Test System --- lib/env_dpdk/memory.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/env_dpdk/memory.c b/lib/env_dpdk/memory.c index eaeccb903..c2038b2c6 100644 --- a/lib/env_dpdk/memory.c +++ b/lib/env_dpdk/memory.c @@ -653,14 +653,18 @@ memory_hotplug_cb(enum rte_mem_event event_type, const void *addr, size_t len, void *arg) { if (event_type == RTE_MEM_EVENT_ALLOC) { + spdk_mem_register((void *)addr, len); + + /* Now mark each segment so that DPDK won't later free it. + * This ensures we don't have to deal with the memory + * getting freed in different units than it was allocated. + */ while (len > 0) { struct rte_memseg *seg; seg = rte_mem_virt2memseg(addr, NULL); assert(seg != NULL); - assert(len >= seg->hugepage_sz); - - spdk_mem_register((void *)seg->addr, seg->hugepage_sz); + seg->flags |= RTE_MEMSEG_FLAG_DO_NOT_FREE; addr = (void *)((uintptr_t)addr + seg->hugepage_sz); len -= seg->hugepage_sz; }