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)