6038 // mapping will serve as a value for a "good" req_addr (case 2). The second |
6028 // mapping will serve as a value for a "good" req_addr (case 2). The second |
6039 // mapping, still intact, as "bad" req_addr (case 3). |
6029 // mapping, still intact, as "bad" req_addr (case 3). |
6040 ::munmap(mapping1, mapping_size); |
6030 ::munmap(mapping1, mapping_size); |
6041 |
6031 |
6042 // Case 1 |
6032 // Case 1 |
6043 test_log("%s, req_addr NULL:", __FUNCTION__); |
|
6044 test_log("size align result"); |
|
6045 |
|
6046 for (int i = 0; i < num_sizes; i++) { |
6033 for (int i = 0; i < num_sizes; i++) { |
6047 const size_t size = sizes[i]; |
6034 const size_t size = sizes[i]; |
6048 for (size_t alignment = ag; is_aligned(size, alignment); alignment *= 2) { |
6035 for (size_t alignment = ag; is_aligned(size, alignment); alignment *= 2) { |
6049 char* p = os::Linux::reserve_memory_special_huge_tlbfs_mixed(size, alignment, NULL, false); |
6036 char* p = os::Linux::reserve_memory_special_huge_tlbfs_mixed(size, alignment, NULL, false); |
6050 test_log(SIZE_FORMAT_HEX " " SIZE_FORMAT_HEX " -> " PTR_FORMAT " %s", |
|
6051 size, alignment, p2i(p), (p != NULL ? "" : "(failed)")); |
|
6052 if (p != NULL) { |
6037 if (p != NULL) { |
6053 assert(is_aligned(p, alignment), "must be"); |
6038 assert(is_aligned(p, alignment), "must be"); |
6054 small_page_write(p, size); |
6039 small_page_write(p, size); |
6055 os::Linux::release_memory_special_huge_tlbfs(p, size); |
6040 os::Linux::release_memory_special_huge_tlbfs(p, size); |
6056 } |
6041 } |
6057 } |
6042 } |
6058 } |
6043 } |
6059 |
6044 |
6060 // Case 2 |
6045 // Case 2 |
6061 test_log("%s, req_addr non-NULL:", __FUNCTION__); |
|
6062 test_log("size align req_addr result"); |
|
6063 |
|
6064 for (int i = 0; i < num_sizes; i++) { |
6046 for (int i = 0; i < num_sizes; i++) { |
6065 const size_t size = sizes[i]; |
6047 const size_t size = sizes[i]; |
6066 for (size_t alignment = ag; is_aligned(size, alignment); alignment *= 2) { |
6048 for (size_t alignment = ag; is_aligned(size, alignment); alignment *= 2) { |
6067 char* const req_addr = align_up(mapping1, alignment); |
6049 char* const req_addr = align_up(mapping1, alignment); |
6068 char* p = os::Linux::reserve_memory_special_huge_tlbfs_mixed(size, alignment, req_addr, false); |
6050 char* p = os::Linux::reserve_memory_special_huge_tlbfs_mixed(size, alignment, req_addr, false); |
6069 test_log(SIZE_FORMAT_HEX " " SIZE_FORMAT_HEX " " PTR_FORMAT " -> " PTR_FORMAT " %s", |
|
6070 size, alignment, p2i(req_addr), p2i(p), |
|
6071 ((p != NULL ? (p == req_addr ? "(exact match)" : "") : "(failed)"))); |
|
6072 if (p != NULL) { |
6051 if (p != NULL) { |
6073 assert(p == req_addr, "must be"); |
6052 assert(p == req_addr, "must be"); |
6074 small_page_write(p, size); |
6053 small_page_write(p, size); |
6075 os::Linux::release_memory_special_huge_tlbfs(p, size); |
6054 os::Linux::release_memory_special_huge_tlbfs(p, size); |
6076 } |
6055 } |
6077 } |
6056 } |
6078 } |
6057 } |
6079 |
6058 |
6080 // Case 3 |
6059 // Case 3 |
6081 test_log("%s, req_addr non-NULL with preexisting mapping:", __FUNCTION__); |
|
6082 test_log("size align req_addr result"); |
|
6083 |
|
6084 for (int i = 0; i < num_sizes; i++) { |
6060 for (int i = 0; i < num_sizes; i++) { |
6085 const size_t size = sizes[i]; |
6061 const size_t size = sizes[i]; |
6086 for (size_t alignment = ag; is_aligned(size, alignment); alignment *= 2) { |
6062 for (size_t alignment = ag; is_aligned(size, alignment); alignment *= 2) { |
6087 char* const req_addr = align_up(mapping2, alignment); |
6063 char* const req_addr = align_up(mapping2, alignment); |
6088 char* p = os::Linux::reserve_memory_special_huge_tlbfs_mixed(size, alignment, req_addr, false); |
6064 char* p = os::Linux::reserve_memory_special_huge_tlbfs_mixed(size, alignment, req_addr, false); |
6089 test_log(SIZE_FORMAT_HEX " " SIZE_FORMAT_HEX " " PTR_FORMAT " -> " PTR_FORMAT " %s", |
|
6090 size, alignment, p2i(req_addr), p2i(p), ((p != NULL ? "" : "(failed)"))); |
|
6091 // as the area around req_addr contains already existing mappings, the API should always |
6065 // as the area around req_addr contains already existing mappings, the API should always |
6092 // return NULL (as per contract, it cannot return another address) |
6066 // return NULL (as per contract, it cannot return another address) |
6093 assert(p == NULL, "must be"); |
6067 assert(p == NULL, "must be"); |
6094 } |
6068 } |
6095 } |
6069 } |