diff --git a/lib/env_dpdk/memory.c b/lib/env_dpdk/memory.c index 02b1286a2..de00fdc00 100644 --- a/lib/env_dpdk/memory.c +++ b/lib/env_dpdk/memory.c @@ -614,7 +614,7 @@ spdk_mem_map_translate(const struct spdk_mem_map *map, uint64_t vaddr, uint64_t if (size == NULL || map->ops.are_contiguous == NULL || map_2mb->translation_2mb == map->default_translation) { if (size != NULL) { - *size = cur_size; + *size = spdk_min(*size, cur_size); } return map_2mb->translation_2mb; } @@ -640,7 +640,7 @@ spdk_mem_map_translate(const struct spdk_mem_map *map, uint64_t vaddr, uint64_t prev_translation = map_2mb->translation_2mb; } - *size = cur_size; + *size = spdk_min(*size, cur_size); return orig_translation; } diff --git a/test/env/memory/memory_ut.c b/test/env/memory/memory_ut.c index b7fbbf71d..790154d66 100644 --- a/test/env/memory/memory_ut.c +++ b/test/env/memory/memory_ut.c @@ -296,6 +296,24 @@ test_mem_map_translation(void) */ CU_ASSERT(addr == 0); + /* Translate only a subset of a 2MB page */ + mapping_length = 543; + addr = spdk_mem_map_translate(map, 0, &mapping_length); + CU_ASSERT(addr == 0); + CU_ASSERT(mapping_length == 543); + + /* Translate another subset of a 2MB page */ + mapping_length = 543; + addr = spdk_mem_map_translate(map, VALUE_4KB, &mapping_length); + CU_ASSERT(addr == 0); + CU_ASSERT(mapping_length == 543); + + /* Try to translate an unaligned region that is only partially registered */ + mapping_length = 543; + addr = spdk_mem_map_translate(map, 3 * VALUE_2MB - 196, &mapping_length); + CU_ASSERT(addr == 0); + CU_ASSERT(mapping_length == 196); + /* Clear translation for the first page */ rc = spdk_mem_map_clear_translation(map, 0, VALUE_2MB); CU_ASSERT(rc == 0); @@ -345,6 +363,12 @@ test_mem_map_translation(void) CU_ASSERT(addr == 0); CU_ASSERT(mapping_length == VALUE_2MB) + /* Translate only a subset of a 2MB page */ + mapping_length = 543; + addr = spdk_mem_map_translate(map, 0, &mapping_length); + CU_ASSERT(addr == 0); + CU_ASSERT(mapping_length == 543); + /* Clear the translation */ rc = spdk_mem_map_clear_translation(map, 0, VALUE_2MB * 3); CU_ASSERT(rc == 0);