In case of hugepages munmap requires size aligned to page.
Signed-off-by: Maxim Uvarov <[email protected]>
---
platform/linux-generic/odp_shared_memory.c | 12 ++++++++++--
test/validation/odp_shm.c | 4 ++++
2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/platform/linux-generic/odp_shared_memory.c
b/platform/linux-generic/odp_shared_memory.c
index 23a9ceb..7adbe52 100644
--- a/platform/linux-generic/odp_shared_memory.c
+++ b/platform/linux-generic/odp_shared_memory.c
@@ -179,12 +179,20 @@ odp_shm_t odp_shm_reserve(const char *name, uint64_t
size, uint64_t align,
int map_flag = MAP_SHARED;
/* If already exists: O_EXCL: error, O_TRUNC: truncate to zero */
int oflag = O_RDWR | O_CREAT | O_TRUNC;
- uint64_t alloc_size = size + align;
+ uint64_t alloc_size;
uint64_t page_sz, huge_sz;
- huge_sz = odp_sys_huge_page_size();
page_sz = odp_sys_page_size();
+#ifdef MAP_HUGETLB
+ huge_sz = odp_sys_huge_page_size();
+ /* munmap for huge pages requires sizes round up by page */
+ alloc_size = (size + align + (huge_sz - 1))
+ & (-huge_sz);
+#else
+ alloc_size = size + align;
+#endif
+
if (flags & ODP_SHM_PROC) {
/* Creates a file to /dev/shm */
fd = shm_open(name, oflag,
diff --git a/test/validation/odp_shm.c b/test/validation/odp_shm.c
index c26925b..918a77b 100644
--- a/test/validation/odp_shm.c
+++ b/test/validation/odp_shm.c
@@ -32,7 +32,11 @@ static void *run_shm_thread(void *arg)
CU_ASSERT(0 == info.flags);
CU_ASSERT(test_shared_data == info.addr);
CU_ASSERT(sizeof(test_shared_data_t) <= info.size);
+#ifdef MAP_HUGETLB
CU_ASSERT(odp_sys_page_size() == info.page_size);
+#else
+ CU_ASSERT(odp_sys_huge_page_size() == info.page_size);
+#endif
odp_shm_print_all();
fflush(stdout);
--
1.8.5.1.163.gd7aced9
_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp