From dcac8e9706b1b2f4556f8865e63b2e25af58feba Mon Sep 17 00:00:00 2001 From: Darek Stojaczyk Date: Wed, 12 Feb 2020 13:05:42 +0100 Subject: [PATCH] memory: reverse the order of calling mem_map unregister cb Memory maps might be dependant on one another, so make sure their dependencies are unregistered after the dependees. Change-Id: I3853dfe51bacc70d0b27976a3df9c0ae9253ebac Signed-off-by: Darek Stojaczyk Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/833 Tested-by: SPDK CI Jenkins Reviewed-by: Shuhei Matsumoto Reviewed-by: Changpeng Liu Reviewed-by: Ben Walker Reviewed-by: Jim Harris --- lib/env_dpdk/memory.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/env_dpdk/memory.c b/lib/env_dpdk/memory.c index 59f626fcc..96daafafb 100644 --- a/lib/env_dpdk/memory.c +++ b/lib/env_dpdk/memory.c @@ -144,7 +144,8 @@ struct spdk_mem_map { * 62 - 63 : flags */ static struct spdk_mem_map *g_mem_reg_map; -static TAILQ_HEAD(, spdk_mem_map) g_spdk_mem_maps = TAILQ_HEAD_INITIALIZER(g_spdk_mem_maps); +static TAILQ_HEAD(spdk_mem_map_head, spdk_mem_map) g_spdk_mem_maps = + TAILQ_HEAD_INITIALIZER(g_spdk_mem_maps); static pthread_mutex_t g_spdk_mem_map_mutex = PTHREAD_MUTEX_INITIALIZER; static bool g_legacy_mem; @@ -476,7 +477,7 @@ spdk_mem_unregister(void *vaddr, size_t len) spdk_mem_map_set_translation(g_mem_reg_map, (uint64_t)vaddr, VALUE_2MB, 0); if (seg_len > 0 && (reg & REG_MAP_NOTIFY_START)) { - TAILQ_FOREACH(map, &g_spdk_mem_maps, tailq) { + TAILQ_FOREACH_REVERSE(map, &g_spdk_mem_maps, spdk_mem_map_head, tailq) { rc = map->ops.notify_cb(map->cb_ctx, map, SPDK_MEM_MAP_NOTIFY_UNREGISTER, seg_vaddr, seg_len); if (rc != 0) { pthread_mutex_unlock(&g_spdk_mem_map_mutex); @@ -495,7 +496,7 @@ spdk_mem_unregister(void *vaddr, size_t len) } if (seg_len > 0) { - TAILQ_FOREACH(map, &g_spdk_mem_maps, tailq) { + TAILQ_FOREACH_REVERSE(map, &g_spdk_mem_maps, spdk_mem_map_head, tailq) { rc = map->ops.notify_cb(map->cb_ctx, map, SPDK_MEM_MAP_NOTIFY_UNREGISTER, seg_vaddr, seg_len); if (rc != 0) { pthread_mutex_unlock(&g_spdk_mem_map_mutex);