3168 if (start != req_addr) { |
3168 if (start != req_addr) { |
3169 ::munmap(start, extra_size); |
3169 ::munmap(start, extra_size); |
3170 start = NULL; |
3170 start = NULL; |
3171 } |
3171 } |
3172 } else { |
3172 } else { |
3173 char* const start_aligned = (char*) align_ptr_up(start, alignment); |
3173 char* const start_aligned = align_ptr_up(start, alignment); |
3174 char* const end_aligned = start_aligned + bytes; |
3174 char* const end_aligned = start_aligned + bytes; |
3175 char* const end = start + extra_size; |
3175 char* const end = start + extra_size; |
3176 if (start_aligned > start) { |
3176 if (start_aligned > start) { |
3177 ::munmap(start, start_aligned - start); |
3177 ::munmap(start, start_aligned - start); |
3178 } |
3178 } |
3672 assert(is_ptr_aligned(start, alignment), "Must be"); |
3672 assert(is_ptr_aligned(start, alignment), "Must be"); |
3673 |
3673 |
3674 char* end = start + bytes; |
3674 char* end = start + bytes; |
3675 |
3675 |
3676 // Find the regions of the allocated chunk that can be promoted to large pages. |
3676 // Find the regions of the allocated chunk that can be promoted to large pages. |
3677 char* lp_start = (char*)align_ptr_up(start, large_page_size); |
3677 char* lp_start = align_ptr_up(start, large_page_size); |
3678 char* lp_end = (char*)align_ptr_down(end, large_page_size); |
3678 char* lp_end = align_ptr_down(end, large_page_size); |
3679 |
3679 |
3680 size_t lp_bytes = lp_end - lp_start; |
3680 size_t lp_bytes = lp_end - lp_start; |
3681 |
3681 |
3682 assert(is_size_aligned(lp_bytes, large_page_size), "Must be"); |
3682 assert(is_size_aligned(lp_bytes, large_page_size), "Must be"); |
3683 |
3683 |
5984 test_log("size align req_addr result"); |
5984 test_log("size align req_addr result"); |
5985 |
5985 |
5986 for (int i = 0; i < num_sizes; i++) { |
5986 for (int i = 0; i < num_sizes; i++) { |
5987 const size_t size = sizes[i]; |
5987 const size_t size = sizes[i]; |
5988 for (size_t alignment = ag; is_size_aligned(size, alignment); alignment *= 2) { |
5988 for (size_t alignment = ag; is_size_aligned(size, alignment); alignment *= 2) { |
5989 char* const req_addr = (char*) align_ptr_up(mapping1, alignment); |
5989 char* const req_addr = align_ptr_up(mapping1, alignment); |
5990 char* p = os::Linux::reserve_memory_special_huge_tlbfs_mixed(size, alignment, req_addr, false); |
5990 char* p = os::Linux::reserve_memory_special_huge_tlbfs_mixed(size, alignment, req_addr, false); |
5991 test_log(SIZE_FORMAT_HEX " " SIZE_FORMAT_HEX " " PTR_FORMAT " -> " PTR_FORMAT " %s", |
5991 test_log(SIZE_FORMAT_HEX " " SIZE_FORMAT_HEX " " PTR_FORMAT " -> " PTR_FORMAT " %s", |
5992 size, alignment, p2i(req_addr), p2i(p), |
5992 size, alignment, p2i(req_addr), p2i(p), |
5993 ((p != NULL ? (p == req_addr ? "(exact match)" : "") : "(failed)"))); |
5993 ((p != NULL ? (p == req_addr ? "(exact match)" : "") : "(failed)"))); |
5994 if (p != NULL) { |
5994 if (p != NULL) { |
6004 test_log("size align req_addr result"); |
6004 test_log("size align req_addr result"); |
6005 |
6005 |
6006 for (int i = 0; i < num_sizes; i++) { |
6006 for (int i = 0; i < num_sizes; i++) { |
6007 const size_t size = sizes[i]; |
6007 const size_t size = sizes[i]; |
6008 for (size_t alignment = ag; is_size_aligned(size, alignment); alignment *= 2) { |
6008 for (size_t alignment = ag; is_size_aligned(size, alignment); alignment *= 2) { |
6009 char* const req_addr = (char*) align_ptr_up(mapping2, alignment); |
6009 char* const req_addr = align_ptr_up(mapping2, alignment); |
6010 char* p = os::Linux::reserve_memory_special_huge_tlbfs_mixed(size, alignment, req_addr, false); |
6010 char* p = os::Linux::reserve_memory_special_huge_tlbfs_mixed(size, alignment, req_addr, false); |
6011 test_log(SIZE_FORMAT_HEX " " SIZE_FORMAT_HEX " " PTR_FORMAT " -> " PTR_FORMAT " %s", |
6011 test_log(SIZE_FORMAT_HEX " " SIZE_FORMAT_HEX " " PTR_FORMAT " -> " PTR_FORMAT " %s", |
6012 size, alignment, p2i(req_addr), p2i(p), ((p != NULL ? "" : "(failed)"))); |
6012 size, alignment, p2i(req_addr), p2i(p), ((p != NULL ? "" : "(failed)"))); |
6013 // as the area around req_addr contains already existing mappings, the API should always |
6013 // as the area around req_addr contains already existing mappings, the API should always |
6014 // return NULL (as per contract, it cannot return another address) |
6014 // return NULL (as per contract, it cannot return another address) |