3499 return NULL; |
3499 return NULL; |
3500 } |
3500 } |
3501 |
3501 |
3502 assert(is_ptr_aligned(start, alignment), "Must be"); |
3502 assert(is_ptr_aligned(start, alignment), "Must be"); |
3503 |
3503 |
3504 // os::reserve_memory_special will record this memory area. |
3504 if (MemTracker::tracking_level() > NMT_minimal) { |
3505 // Need to release it here to prevent overlapping reservations. |
3505 // os::reserve_memory_special will record this memory area. |
3506 MemTracker::record_virtual_memory_release((address)start, bytes); |
3506 // Need to release it here to prevent overlapping reservations. |
|
3507 Tracker tkr = MemTracker::get_virtual_memory_release_tracker(); |
|
3508 tkr.record((address)start, bytes); |
|
3509 } |
3507 |
3510 |
3508 char* end = start + bytes; |
3511 char* end = start + bytes; |
3509 |
3512 |
3510 // Find the regions of the allocated chunk that can be promoted to large pages. |
3513 // Find the regions of the allocated chunk that can be promoted to large pages. |
3511 char* lp_start = (char*)align_ptr_up(start, large_page_size); |
3514 char* lp_start = (char*)align_ptr_up(start, large_page_size); |
3596 if (UseNUMAInterleaving) { |
3599 if (UseNUMAInterleaving) { |
3597 numa_make_global(addr, bytes); |
3600 numa_make_global(addr, bytes); |
3598 } |
3601 } |
3599 |
3602 |
3600 // The memory is committed |
3603 // The memory is committed |
3601 MemTracker::record_virtual_memory_reserve_and_commit((address)addr, bytes, mtNone, CALLER_PC); |
3604 MemTracker::record_virtual_memory_reserve_and_commit((address)addr, bytes, CALLER_PC); |
3602 } |
3605 } |
3603 |
3606 |
3604 return addr; |
3607 return addr; |
3605 } |
3608 } |
3606 |
3609 |
3612 bool os::Linux::release_memory_special_huge_tlbfs(char* base, size_t bytes) { |
3615 bool os::Linux::release_memory_special_huge_tlbfs(char* base, size_t bytes) { |
3613 return pd_release_memory(base, bytes); |
3616 return pd_release_memory(base, bytes); |
3614 } |
3617 } |
3615 |
3618 |
3616 bool os::release_memory_special(char* base, size_t bytes) { |
3619 bool os::release_memory_special(char* base, size_t bytes) { |
|
3620 bool res; |
|
3621 if (MemTracker::tracking_level() > NMT_minimal) { |
|
3622 Tracker tkr = MemTracker::get_virtual_memory_release_tracker(); |
|
3623 res = os::Linux::release_memory_special_impl(base, bytes); |
|
3624 if (res) { |
|
3625 tkr.record((address)base, bytes); |
|
3626 } |
|
3627 |
|
3628 } else { |
|
3629 res = os::Linux::release_memory_special_impl(base, bytes); |
|
3630 } |
|
3631 return res; |
|
3632 } |
|
3633 |
|
3634 bool os::Linux::release_memory_special_impl(char* base, size_t bytes) { |
3617 assert(UseLargePages, "only for large pages"); |
3635 assert(UseLargePages, "only for large pages"); |
3618 |
|
3619 MemTracker::Tracker tkr = MemTracker::get_virtual_memory_release_tracker(); |
|
3620 |
|
3621 bool res; |
3636 bool res; |
|
3637 |
3622 if (UseSHM) { |
3638 if (UseSHM) { |
3623 res = os::Linux::release_memory_special_shm(base, bytes); |
3639 res = os::Linux::release_memory_special_shm(base, bytes); |
3624 } else { |
3640 } else { |
3625 assert(UseHugeTLBFS, "must be"); |
3641 assert(UseHugeTLBFS, "must be"); |
3626 res = os::Linux::release_memory_special_huge_tlbfs(base, bytes); |
3642 res = os::Linux::release_memory_special_huge_tlbfs(base, bytes); |
3627 } |
3643 } |
3628 |
|
3629 if (res) { |
|
3630 tkr.record((address)base, bytes); |
|
3631 } else { |
|
3632 tkr.discard(); |
|
3633 } |
|
3634 |
|
3635 return res; |
3644 return res; |
3636 } |
3645 } |
3637 |
3646 |
3638 size_t os::large_page_size() { |
3647 size_t os::large_page_size() { |
3639 return _large_page_size; |
3648 return _large_page_size; |