8261636: The test mapping in hugetlbfs_sanity_check should consider LargePageSizeInBytes

Reviewed-by: tschatzl, iwalulya
This commit is contained in:
Stefan Johansson 2021-03-01 12:02:54 +00:00
parent 702ca6228c
commit 0a7fff46cf
2 changed files with 16 additions and 11 deletions

View file

@ -3529,11 +3529,19 @@ bool os::Linux::transparent_huge_pages_sanity_check(bool warn,
return result; return result;
} }
int os::Linux::hugetlbfs_page_size_flag(size_t page_size) {
if (page_size != default_large_page_size()) {
return (exact_log2(page_size) << MAP_HUGE_SHIFT);
}
return 0;
}
bool os::Linux::hugetlbfs_sanity_check(bool warn, size_t page_size) { bool os::Linux::hugetlbfs_sanity_check(bool warn, size_t page_size) {
bool result = false; bool result = false;
void *p = mmap(NULL, page_size, PROT_READ|PROT_WRITE,
MAP_ANONYMOUS|MAP_PRIVATE|MAP_HUGETLB, // Include the page size flag to ensure we sanity check the correct page size.
-1, 0); int flags = MAP_ANONYMOUS | MAP_PRIVATE | MAP_HUGETLB | hugetlbfs_page_size_flag(page_size);
void *p = mmap(NULL, page_size, PROT_READ|PROT_WRITE, flags, -1, 0);
if (p != MAP_FAILED) { if (p != MAP_FAILED) {
// We don't know if this really is a huge page or not. // We don't know if this really is a huge page or not.
@ -3980,10 +3988,9 @@ char* os::Linux::reserve_memory_special_huge_tlbfs_only(size_t bytes,
int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE; int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
int flags = MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB; int flags = MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB;
// Ensure the correct page size flag is used when needed.
flags |= hugetlbfs_page_size_flag(os::large_page_size());
if (os::large_page_size() != default_large_page_size()) {
flags |= (exact_log2(os::large_page_size()) << MAP_HUGE_SHIFT);
}
char* addr = (char*)::mmap(req_addr, bytes, prot, flags, -1, 0); char* addr = (char*)::mmap(req_addr, bytes, prot, flags, -1, 0);
if (addr == MAP_FAILED) { if (addr == MAP_FAILED) {
@ -4053,11 +4060,7 @@ char* os::Linux::reserve_memory_special_huge_tlbfs_mixed(size_t bytes,
} }
// Commit large-paged area. // Commit large-paged area.
flags |= MAP_HUGETLB; flags |= MAP_HUGETLB | hugetlbfs_page_size_flag(os::large_page_size());
if (os::large_page_size() != default_large_page_size()) {
flags |= (exact_log2(os::large_page_size()) << MAP_HUGE_SHIFT);
}
result = ::mmap(lp_start, lp_bytes, prot, flags, -1, 0); result = ::mmap(lp_start, lp_bytes, prot, flags, -1, 0);
if (result == MAP_FAILED) { if (result == MAP_FAILED) {

View file

@ -87,6 +87,8 @@ class Linux {
static bool hugetlbfs_sanity_check(bool warn, size_t page_size); static bool hugetlbfs_sanity_check(bool warn, size_t page_size);
static bool shm_hugetlbfs_sanity_check(bool warn, size_t page_size); static bool shm_hugetlbfs_sanity_check(bool warn, size_t page_size);
static int hugetlbfs_page_size_flag(size_t page_size);
static char* reserve_memory_special_shm(size_t bytes, size_t alignment, char* req_addr, bool exec); static char* reserve_memory_special_shm(size_t bytes, size_t alignment, char* req_addr, bool exec);
static char* reserve_memory_special_huge_tlbfs(size_t bytes, size_t alignment, char* req_addr, bool exec); static char* reserve_memory_special_huge_tlbfs(size_t bytes, size_t alignment, char* req_addr, bool exec);
static char* reserve_memory_special_huge_tlbfs_only(size_t bytes, char* req_addr, bool exec); static char* reserve_memory_special_huge_tlbfs_only(size_t bytes, char* req_addr, bool exec);