env_dpdk: fix mem map array sizes

The arrays for both the map_256tb and map_1gb structures were twice
as large as necessary; fix the sizes and add unit tests for the boundary
conditions to verify that the fix works.

Change-Id: I66bce463f234f54e69cf2a697db9f806d398ca1e
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/418105
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
This commit is contained in:
Daniel Verkamp 2018-07-05 11:03:42 -07:00
parent 88e26908fa
commit 7ac8b609b0
2 changed files with 15 additions and 3 deletions

View File

@ -55,7 +55,7 @@
#define FN_4KB_TO_2MB(fn) (fn >> (SHIFT_2MB - SHIFT_4KB))
#define MAP_256TB_IDX(vfn_2mb) ((vfn_2mb) >> (SHIFT_1GB - SHIFT_2MB))
#define MAP_1GB_IDX(vfn_2mb) ((vfn_2mb) & ((1ULL << (SHIFT_1GB - SHIFT_2MB + 1)) - 1))
#define MAP_1GB_IDX(vfn_2mb) ((vfn_2mb) & ((1ULL << (SHIFT_1GB - SHIFT_2MB)) - 1))
/* Translation of a single 2MB page. */
struct map_2mb {
@ -67,14 +67,14 @@ struct map_2mb {
* been retrieved yet.
*/
struct map_1gb {
struct map_2mb map[1ULL << (SHIFT_1GB - SHIFT_2MB + 1)];
struct map_2mb map[1ULL << (SHIFT_1GB - SHIFT_2MB)];
};
/* Top-level map table indexed by bits [30..46] of the virtual address.
* Each entry points to a second-level map table or NULL.
*/
struct map_256tb {
struct map_1gb *map[1ULL << (SHIFT_256TB - SHIFT_1GB + 1)];
struct map_1gb *map[1ULL << (SHIFT_256TB - SHIFT_1GB)];
};
/* Page-granularity memory address translation */

View File

@ -181,6 +181,18 @@ test_mem_map_translation(void)
addr = spdk_mem_map_translate(map, 2 * VALUE_2MB, VALUE_2MB);
CU_ASSERT(addr == default_translation);
/* Set translation for the last valid 2MB region */
rc = spdk_mem_map_set_translation(map, 0xffffffe00000ULL, VALUE_2MB, 0x1234);
CU_ASSERT(rc == 0);
/* Verify translation for last valid 2MB region */
addr = spdk_mem_map_translate(map, 0xffffffe00000ULL, VALUE_2MB);
CU_ASSERT(addr == 0x1234);
/* Attempt to set translation for the first invalid address */
rc = spdk_mem_map_set_translation(map, 0x1000000000000ULL, VALUE_2MB, 0x5678);
CU_ASSERT(rc == -EINVAL);
spdk_mem_map_free(&map);
CU_ASSERT(map == NULL);
}