From f4cb6c90b4d8676d67c0ee03eefe989c72d38e06 Mon Sep 17 00:00:00 2001 From: Darek Stojaczyk Date: Wed, 10 Oct 2018 17:52:33 +0200 Subject: [PATCH] memory: register each hotplugged page separately The problem with registering the entire hotplugged memory region is that it won't necessarily be unregistered in one go. Registering each hugepage separately solves that problem. This puts a limitation on the number of pages that can be allocated when using RDMA. We'll hopefully lift this limitation sometime in future - probably levereging ibv_rereg_mr, but for now we'll have to resort to either: a) using 1GB hugepages b) preallocating memory (with [-s|--mem-size ] app param) as it will be registered as just one region no matter what size it is. This memory won't be returned to the system until the SPDK app exits. Change-Id: I6de997fb4901b772730ba6fe995dcc0640b85749 Signed-off-by: Darek Stojaczyk Reviewed-on: https://review.gerrithub.io/428716 Chandler-Test-Pool: SPDK Automated Test System Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Jim Harris --- lib/env_dpdk/memory.c | 12 +++++++++++- test/env/memory/memory_ut.c | 2 ++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/env_dpdk/memory.c b/lib/env_dpdk/memory.c index 20171f2e3..a35ea7a41 100644 --- a/lib/env_dpdk/memory.c +++ b/lib/env_dpdk/memory.c @@ -655,7 +655,17 @@ 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); + 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); + addr = (void *)((uintptr_t)addr + seg->hugepage_sz); + len -= seg->hugepage_sz; + } } else if (event_type == RTE_MEM_EVENT_FREE) { spdk_mem_unregister((void *)addr, len); } diff --git a/test/env/memory/memory_ut.c b/test/env/memory/memory_ut.c index bfdadb0f6..39a89a102 100644 --- a/test/env/memory/memory_ut.c +++ b/test/env/memory/memory_ut.c @@ -54,6 +54,8 @@ rte_eal_get_configuration(void) DEFINE_STUB(rte_mem_event_callback_register, int, (const char *name, rte_mem_event_callback_t clb, void *arg), 0); DEFINE_STUB(rte_memseg_contig_walk, int, (rte_memseg_contig_walk_t func, void *arg), 0); +DEFINE_STUB(rte_mem_virt2memseg, struct rte_memseg *, (const void *addr, + const struct rte_memseg_list *msl), NULL); #endif #define PAGE_ARRAY_SIZE (100)