From 0d57730e290f46d231f0054fb431609c7f2e27cd Mon Sep 17 00:00:00 2001 From: Darek Stojaczyk Date: Wed, 10 Oct 2018 19:29:04 +0200 Subject: [PATCH] memory: fix segfault when freeing mem map with no notify_cb In spdk_mem_map_alloc() we only do the memory walk when notify_cb is provided, but spdk_mem_map_free() does the memory walk undonditionally. Not anymore. Change-Id: Ic8dfdc5cb2c99dc58e62ab0523cf5a18ba8691cc Signed-off-by: Darek Stojaczyk Reviewed-on: https://review.gerrithub.io/428722 Reviewed-by: Ben Walker Reviewed-by: Jim Harris Tested-by: SPDK CI Jenkins Chandler-Test-Pool: SPDK Automated Test System --- lib/env_dpdk/memory.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/env_dpdk/memory.c b/lib/env_dpdk/memory.c index 90605fc44..4da8392f3 100644 --- a/lib/env_dpdk/memory.c +++ b/lib/env_dpdk/memory.c @@ -270,10 +270,12 @@ spdk_mem_map_free(struct spdk_mem_map **pmap) return; } - pthread_mutex_lock(&g_spdk_mem_map_mutex); - spdk_mem_map_notify_walk(map, SPDK_MEM_MAP_NOTIFY_UNREGISTER); - TAILQ_REMOVE(&g_spdk_mem_maps, map, tailq); - pthread_mutex_unlock(&g_spdk_mem_map_mutex); + if (map->ops.notify_cb) { + pthread_mutex_lock(&g_spdk_mem_map_mutex); + spdk_mem_map_notify_walk(map, SPDK_MEM_MAP_NOTIFY_UNREGISTER); + TAILQ_REMOVE(&g_spdk_mem_maps, map, tailq); + pthread_mutex_unlock(&g_spdk_mem_map_mutex); + } for (i = 0; i < sizeof(map->map_256tb.map) / sizeof(map->map_256tb.map[0]); i++) { free(map->map_256tb.map[i]);