diff --git a/src/libpmem2/map_posix.c b/src/libpmem2/map_posix.c index 302cc7a19d3a7031a661cc6900ed91c574923988..0b042aa6869bf2d67db3a9d279b9361ddae08fa4 100644 --- a/src/libpmem2/map_posix.c +++ b/src/libpmem2/map_posix.c @@ -263,8 +263,11 @@ unmap(void *addr, size_t len) static int vm_reservation_mend(struct pmem2_vm_reservation *rsv, void *addr, size_t size) { - ASSERT((char *)addr >= (char *)rsv->addr && - (char *)addr + size <= (char *)rsv->addr + rsv->size); + void *rsv_addr = pmem2_vm_reservation_get_address(rsv); + size_t rsv_size = pmem2_vm_reservation_get_size(rsv); + + ASSERT((char *)addr >= (char *)rsv_addr && + (char *)addr + size <= (char *)rsv_addr + rsv_size); char *daddr = mmap(addr, size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); @@ -570,8 +573,8 @@ pmem2_map_delete(struct pmem2_map **map_ptr) VALGRIND_REMOVE_PMEM_MAPPING(map_addr, map_len); if (rsv) { - size_t rsv_offset = (size_t)map_addr - - (size_t)rsv->addr; + void *rsv_addr = pmem2_vm_reservation_get_address(rsv); + size_t rsv_offset = (size_t)map_addr - (size_t)rsv_addr; if (!vm_reservation_map_find_acquire(rsv, rsv_offset, map_len)) { ret = PMEM2_E_MAPPING_NOT_FOUND; diff --git a/src/libpmem2/map_windows.c b/src/libpmem2/map_windows.c index b35926dc033c5d89f569026e4e83ccde4b0070fa..67901eed316610becc58142e229f9e33980b7911 100644 --- a/src/libpmem2/map_windows.c +++ b/src/libpmem2/map_windows.c @@ -142,8 +142,9 @@ static int vm_reservation_merge(struct pmem2_vm_reservation *rsv, void *addr, size_t length) { + void *rsv_addr = pmem2_vm_reservation_get_address(rsv); size_t rsv_size = pmem2_vm_reservation_get_size(rsv); - size_t rsv_offset = (size_t)addr - (size_t)rsv->addr; + size_t rsv_offset = (size_t)addr - (size_t)rsv_addr; /* * After unmapping from the reservation, it is neccessary to merge @@ -161,7 +162,7 @@ vm_reservation_merge(struct pmem2_vm_reservation *rsv, void *addr, merge_addr = (char *)map->addr + map->reserved_length; merge_size += (char *)addr - (char *)merge_addr; } else { - merge_addr = rsv->addr; + merge_addr = rsv_addr; merge_size += rsv_offset; } } @@ -172,7 +173,7 @@ vm_reservation_merge(struct pmem2_vm_reservation *rsv, void *addr, if (map) merge_size += (char *)map->addr - (char *)addr - length; else - merge_size += rsv->size - rsv_offset - length; + merge_size += rsv_size - rsv_offset - length; } if ((addr != merge_addr) || (length != merge_size)) { @@ -546,8 +547,8 @@ pmem2_map_delete(struct pmem2_map **map_ptr) if (map->reserved_length != 0) { if (rsv) { - size_t rsv_offset = (size_t)map_addr - - (size_t)rsv->addr; + void *rsv_addr = pmem2_vm_reservation_get_address(rsv); + size_t rsv_offset = (size_t)map_addr - (size_t)rsv_addr; if (!vm_reservation_map_find_acquire(rsv, rsv_offset, map_len)) { ret = PMEM2_E_MAPPING_NOT_FOUND; diff --git a/src/libpmem2/vm_reservation.c b/src/libpmem2/vm_reservation.c index ae5f6c9f1b0c55f536d0489c47a59da8730b586d..7ea400387a59065322a1ab78e8f09388ef6ea48e 100644 --- a/src/libpmem2/vm_reservation.c +++ b/src/libpmem2/vm_reservation.c @@ -16,9 +16,18 @@ #include <Windows.h> #endif +struct pmem2_vm_reservation { + struct ravl_interval *itree; + void *addr; + size_t size; + os_rwlock_t lock; +}; + int vm_reservation_reserve_memory(void *addr, size_t size, void **raddr, size_t *rsize); int vm_reservation_release_memory(void *addr, size_t size); +struct ravl_interval *vm_reservation_get_interval_tree( + struct pmem2_vm_reservation *rsv); /* * pmem2_vm_reservation_get_address -- get reservation address @@ -274,3 +283,12 @@ vm_reservation_release(struct pmem2_vm_reservation *rsv) { util_rwlock_unlock(&rsv->lock); } + +/* + * vm_reservation_get_interval_tree -- get interval tree + */ +struct ravl_interval * +vm_reservation_get_interval_tree(struct pmem2_vm_reservation *rsv) +{ + return rsv->itree; +} diff --git a/src/libpmem2/vm_reservation.h b/src/libpmem2/vm_reservation.h index bcae6ef23ffce173e81cffb608edb0671c9185ed..68e4273f3e46e1501d5052c41d943f17f35e76c6 100644 --- a/src/libpmem2/vm_reservation.h +++ b/src/libpmem2/vm_reservation.h @@ -9,12 +9,7 @@ #include "ravl_interval.h" -struct pmem2_vm_reservation { - struct ravl_interval *itree; - void *addr; - size_t size; - os_rwlock_t lock; -}; +struct pmem2_vm_reservation; int vm_reservation_map_register_release(struct pmem2_vm_reservation *rsv, struct pmem2_map *map); diff --git a/src/libpmem2/vm_reservation_windows.c b/src/libpmem2/vm_reservation_windows.c index e8c3cacecf5358e2dafc93af506c1805b054bfef..6e8c2a77635d18b8cc081367e5afcd50d6b45b0b 100644 --- a/src/libpmem2/vm_reservation_windows.c +++ b/src/libpmem2/vm_reservation_windows.c @@ -22,6 +22,8 @@ struct pmem2_map *vm_reservation_map_find_closest_prior( struct pmem2_map *vm_reservation_map_find_closest_later( struct pmem2_vm_reservation *rsv, size_t reserv_offset, size_t len); +struct ravl_interval *vm_reservation_get_interval_tree( + struct pmem2_vm_reservation *rsv); /* * vm_reservation_reserve_memory -- create a blank virual memory mapping @@ -79,12 +81,14 @@ vm_reservation_map_find_closest_prior(struct pmem2_vm_reservation *rsv, size_t reserv_offset, size_t len) { struct pmem2_map map; - map.addr = (char *)rsv->addr + reserv_offset; + + map.addr = (char *)pmem2_vm_reservation_get_address(rsv) + + reserv_offset; map.content_length = len; struct ravl_interval_node *node; - - node = ravl_interval_find_closest_prior(rsv->itree, &map); + struct ravl_interval *itree = vm_reservation_get_interval_tree(rsv); + node = ravl_interval_find_closest_prior(itree, &map); if (!node) return NULL; @@ -101,12 +105,13 @@ vm_reservation_map_find_closest_later(struct pmem2_vm_reservation *rsv, size_t reserv_offset, size_t len) { struct pmem2_map map; - map.addr = (char *)rsv->addr + reserv_offset; + map.addr = (char *)pmem2_vm_reservation_get_address(rsv) + + reserv_offset; map.content_length = len; struct ravl_interval_node *node; - - node = ravl_interval_find_closest_later(rsv->itree, &map); + struct ravl_interval *itree = vm_reservation_get_interval_tree(rsv); + node = ravl_interval_find_closest_later(itree, &map); if (!node) return NULL; diff --git a/src/test/pmem2_vm_reservation/TESTS.py b/src/test/pmem2_vm_reservation/TESTS.py index 0b07d7e70425387bc1566e721d6403cbb5ab0dd7..4cb35d6bc5c19160811be773073b3cddbebe3e7a 100755 --- a/src/test/pmem2_vm_reservation/TESTS.py +++ b/src/test/pmem2_vm_reservation/TESTS.py @@ -205,27 +205,6 @@ class TEST20(PMEM2_VM_RESERVATION): class TEST21(PMEM2_VM_RESERVATION): - """delete a vm reservation with spoiled address""" - test_case = "test_vm_reserv_delete_spoil_addr" - - -class TEST22(PMEM2_VM_RESERVATION_DEVDAX): - """DevDax delete a vm reservation with spoiled address""" - test_case = "test_vm_reserv_delete_spoil_addr" - - -@t.windows_exclude -class TEST23(PMEM2_VM_RESERVATION): - """delete a vm reservation with spoiled size""" - test_case = "test_vm_reserv_delete_spoil_size" - - -class TEST24(PMEM2_VM_RESERVATION_DEVDAX): - """DevDax delete a vm reservation with spoiled size""" - test_case = "test_vm_reserv_delete_spoil_size" - - -class TEST25(PMEM2_VM_RESERVATION): """ map multiple files to a vm reservation, then unmap every 2nd mapping and map the mappings again @@ -233,7 +212,7 @@ class TEST25(PMEM2_VM_RESERVATION): test_case = "test_vm_reserv_map_unmap_multiple_files" -class TEST26(PMEM2_VM_RESERVATION_DEVDAX): +class TEST22(PMEM2_VM_RESERVATION_DEVDAX): """ DevDax map multiple files to a vm reservation, then unmap every 2nd mapping and map the mappings again @@ -241,12 +220,12 @@ class TEST26(PMEM2_VM_RESERVATION_DEVDAX): test_case = "test_vm_reserv_map_unmap_multiple_files" -class TEST27(PMEM2_VM_RESERVATION): +class TEST23(PMEM2_VM_RESERVATION): """map a file to a vm reservation with insufficient space""" test_case = "test_vm_reserv_map_insufficient_space" -class TEST28(PMEM2_VM_RESERVATION): +class TEST24(PMEM2_VM_RESERVATION): """ map a file to a vm reservation and overlap whole other existing mapping belonging to the same reservation @@ -254,7 +233,7 @@ class TEST28(PMEM2_VM_RESERVATION): test_case = "test_vm_reserv_map_full_overlap" -class TEST29(PMEM2_VM_RESERVATION_DEVDAX): +class TEST25(PMEM2_VM_RESERVATION_DEVDAX): """ DevDax map a file to a vm reservation and overlap whole other existing mapping belonging to the same reservation @@ -262,7 +241,7 @@ class TEST29(PMEM2_VM_RESERVATION_DEVDAX): test_case = "test_vm_reserv_map_full_overlap" -class TEST30(PMEM2_VM_RESERVATION): +class TEST26(PMEM2_VM_RESERVATION): """ map a file to a vm reservation overlapping with the ealier half of the other existing mapping @@ -270,7 +249,7 @@ class TEST30(PMEM2_VM_RESERVATION): test_case = "test_vm_reserv_map_partial_overlap_below" -class TEST31(PMEM2_VM_RESERVATION_DEVDAX): +class TEST27(PMEM2_VM_RESERVATION_DEVDAX): """ DevDax map a file to a vm reservation overlapping with the ealier half of the other existing mapping @@ -278,7 +257,7 @@ class TEST31(PMEM2_VM_RESERVATION_DEVDAX): test_case = "test_vm_reserv_map_partial_overlap_below" -class TEST32(PMEM2_VM_RESERVATION): +class TEST28(PMEM2_VM_RESERVATION): """ map a file to a vm reservation overlapping with the latter half of the other existing mapping @@ -286,7 +265,7 @@ class TEST32(PMEM2_VM_RESERVATION): test_case = "test_vm_reserv_map_partial_overlap_above" -class TEST33(PMEM2_VM_RESERVATION_DEVDAX): +class TEST29(PMEM2_VM_RESERVATION_DEVDAX): """ DevDax map a file to a vm reservation overlapping with the latter half of the other existing mapping @@ -295,7 +274,7 @@ class TEST33(PMEM2_VM_RESERVATION_DEVDAX): @g.require_granularity(g.PAGE, g.CACHELINE) -class TEST34(PMEM2_VM_RESERVATION): +class TEST30(PMEM2_VM_RESERVATION): """ map a file with invalid granularity to a vm reservation in the middle of the vm reservation bigger than the file, then map a file that covers whole @@ -304,7 +283,7 @@ class TEST34(PMEM2_VM_RESERVATION): test_case = "test_vm_reserv_map_invalid_granularity" -class TEST35(PMEM2_VM_RESERVATION_ASYNC): +class TEST31(PMEM2_VM_RESERVATION_ASYNC): """ map and unmap asynchronously multiple times to the whole vm reservation region @@ -314,7 +293,7 @@ class TEST35(PMEM2_VM_RESERVATION_ASYNC): ops_per_thread = 1000 -class TEST36(PMEM2_VM_RESERVATION_ASYNC_DEVDAX): +class TEST32(PMEM2_VM_RESERVATION_ASYNC_DEVDAX): """ DevDax map and unmap asynchronously multiple times to the whole whole vm reservation region diff --git a/src/test/pmem2_vm_reservation/pmem2_vm_reservation.c b/src/test/pmem2_vm_reservation/pmem2_vm_reservation.c index 6c433fca224ed860e1dec68157c28e991312f1ba..43725634479e47fb5b6b446d339f5f82f30ff335 100644 --- a/src/test/pmem2_vm_reservation/pmem2_vm_reservation.c +++ b/src/test/pmem2_vm_reservation/pmem2_vm_reservation.c @@ -558,76 +558,6 @@ test_vm_reserv_delete_contains_mapping(const struct test_case *tc, return 2; } -/* - * test_vm_reserv_delete_spoil_addr - delete a vm reservation with - * spoiled address - */ -static int -test_vm_reserv_delete_spoil_addr(const struct test_case *tc, - int argc, char *argv[]) -{ - if (argc < 2) - UT_FATAL("usage: test_vm_reserv_delete_spoil_addr " - "<file> <size>"); - size_t size = ATOUL(argv[1]); - void *rsv_addr; - struct pmem2_vm_reservation *rsv; - - /* create a reservation in the virtual memory */ - int ret = pmem2_vm_reservation_new(&rsv, NULL, size); - UT_ASSERTeq(ret, 0); - - rsv_addr = pmem2_vm_reservation_get_address(rsv); - /* spoil vm_reservation struct address */ - rsv->addr = (void *) - 1; - - ret = pmem2_vm_reservation_delete(&rsv); - UT_PMEM2_EXPECT_RETURN(ret, -EINVAL); - - /* restore the appropriate address */ - rsv->addr = rsv_addr; - - ret = pmem2_vm_reservation_delete(&rsv); - UT_ASSERTeq(ret, 0); - - return 2; -} - -/* - * test_vm_reserv_delete_spoil_size - delete a vm reservation with - * spoiled size - */ -static int -test_vm_reserv_delete_spoil_size(const struct test_case *tc, - int argc, char *argv[]) -{ - if (argc < 2) - UT_FATAL("usage: test_vm_reserv_delete_spoil_size " - "<file> <size>"); - size_t size = ATOUL(argv[1]); - size_t rsv_size; - struct pmem2_vm_reservation *rsv; - - /* create a reservation in the virtual memory */ - int ret = pmem2_vm_reservation_new(&rsv, NULL, size); - UT_ASSERTeq(ret, 0); - - rsv_size = pmem2_vm_reservation_get_size(rsv); - /* spoil vm_reservation struct address */ - rsv->size = 0; - - ret = pmem2_vm_reservation_delete(&rsv); - UT_PMEM2_EXPECT_RETURN(ret, -EINVAL); - - /* restore the appropriate size */ - rsv->size = rsv_size; - - ret = pmem2_vm_reservation_delete(&rsv); - UT_ASSERTeq(ret, 0); - - return 2; -} - /* * test_vm_reserv_map_unmap_multiple_files - map multiple files to a * vm reservation, then unmap every 2nd mapping and map the mapping again @@ -1173,8 +1103,6 @@ static struct test_case test_cases[] = { TEST_CASE(test_vm_reserv_map_file), TEST_CASE(test_vm_reserv_map_part_file), TEST_CASE(test_vm_reserv_delete_contains_mapping), - TEST_CASE(test_vm_reserv_delete_spoil_addr), - TEST_CASE(test_vm_reserv_delete_spoil_size), TEST_CASE(test_vm_reserv_map_unmap_multiple_files), TEST_CASE(test_vm_reserv_map_insufficient_space), TEST_CASE(test_vm_reserv_map_full_overlap),