--- old/src/hotspot/share/gc/g1/g1PageBasedVirtualSpace.cpp 2018-06-14 13:48:26.847000000 -0700 +++ new/src/hotspot/share/gc/g1/g1PageBasedVirtualSpace.cpp 2018-06-14 13:48:26.682000000 -0700 @@ -124,6 +124,16 @@ return index == _committed.size(); } +// Setsup NVDIMM to Max oldgen Size allowed. +size_t G1PageBasedVirtualSpace::get_nvdimm_size() { + size_t size = reserved_size(); + uint nvdimm_max_percent = 100 - G1MaxNewSizePercent; + size_t nvdimm_size = (size_t)((size * nvdimm_max_percent)/100); + size_t page_sz = os::vm_page_size() -1 ; + nvdimm_size = (nvdimm_size + page_sz) & (~page_sz); + return nvdimm_size; +} + void G1PageBasedVirtualSpace::commit_preferred_pages(size_t start, size_t num_pages) { vmassert(num_pages > 0, "No full pages to commit"); vmassert(start + num_pages <= _committed.size(), @@ -133,7 +143,6 @@ char* start_addr = page_start(start); size_t size = num_pages * _page_size; - if (((address)start_addr == (address)os::nvdimm_heapbase())) { // first remove my dummy mapping. if (os::unmap_memory(start_addr, size)) { @@ -145,6 +154,14 @@ log_info(gc, heap)("NVDIMM Memory successfully mapped at %p, Size %lu", start_addr, size); os::close(os::nvdimm_fd()); } + + size_t nvdimm_size = get_nvdimm_size(); + char* dram_base = (char*)start_addr + nvdimm_size; + size_t total_sz = reserved_size(); + os::set_dram_heapbase((address)dram_base); + log_info(gc, heap)("Java DRAM Heap at [%p - %p] & NVDIMM Old Gen at [%p - %p] Total Heap Sz %ld \n", + start_addr+nvdimm_size, (char*)(start_addr + total_sz), start_addr, (char*)(start_addr + nvdimm_size), total_sz); + } return; } --- old/src/hotspot/share/gc/g1/g1PageBasedVirtualSpace.hpp 2018-06-14 13:48:27.194000000 -0700 +++ new/src/hotspot/share/gc/g1/g1PageBasedVirtualSpace.hpp 2018-06-14 13:48:27.030000000 -0700 @@ -110,6 +110,7 @@ bool is_area_uncommitted(size_t start_page, size_t size_in_pages) const; void initialize_with_page_size(ReservedSpace rs, size_t used_size, size_t page_size); + size_t get_nvdimm_size(); public: // Commit the given area of pages starting at start being size_in_pages large. --- old/src/hotspot/share/memory/virtualspace.cpp 2018-06-14 13:48:27.556000000 -0700 +++ new/src/hotspot/share/memory/virtualspace.cpp 2018-06-14 13:48:27.396000000 -0700 @@ -35,13 +35,11 @@ // ReservedSpace // Dummy constructor -ReservedSpace::ReservedSpace() : _base(NULL), _size(0), _noaccess_prefix(0), - _nvdimm_base_nv(NULL), _nvdimm_size(0), _dram_size(0), +ReservedSpace::ReservedSpace() : _base(NULL), _size(0), _noaccess_prefix(0), _alignment(0), _special(false), _executable(false), _fd_for_heap(-1) { } -ReservedSpace::ReservedSpace(size_t size, size_t preferred_page_size) : _fd_for_heap(-1), - _nvdimm_base_nv(NULL), _nvdimm_size(0), _dram_size(0) { +ReservedSpace::ReservedSpace(size_t size, size_t preferred_page_size) : _fd_for_heap(-1) { bool has_preferred_page_size = preferred_page_size != 0; // Want to use large pages where possible and pad with small pages. size_t page_size = has_preferred_page_size ? preferred_page_size : os::page_size_for_region_unaligned(size, 1); @@ -62,15 +60,13 @@ ReservedSpace::ReservedSpace(size_t size, size_t alignment, bool large, - char* requested_address) : _fd_for_heap(-1), - _nvdimm_base_nv(NULL), _nvdimm_size(0), _dram_size(0) { + char* requested_address) : _fd_for_heap(-1) { initialize(size, alignment, large, requested_address, false); } ReservedSpace::ReservedSpace(size_t size, size_t alignment, bool large, - bool executable) : _fd_for_heap(-1), - _nvdimm_base_nv(NULL), _nvdimm_size(0), _dram_size(0) { + bool executable) : _fd_for_heap(-1) { initialize(size, alignment, large, NULL, executable); } @@ -147,7 +143,6 @@ } char* base = NULL; - char* nvdimm_base = NULL; if (special) { @@ -172,11 +167,7 @@ } } } - int fd = -1; - if (AllocateOldGenAt == NULL && _fd_for_heap != -1) { - // AllocateHeapAt is in use. - fd = _fd_for_heap; - } + if (base == NULL) { // Optimistically assume that the OSes returns an aligned base pointer. // When reserving a large address range, most OSes seem to align to at @@ -187,17 +178,13 @@ // important. If available space is not detected, return NULL. if (requested_address != 0) { - base = os::attempt_reserve_memory_at(size, requested_address, fd); - if (failed_to_reserve_as_requested(base, requested_address, size, false, fd != -1)) { + base = os::attempt_reserve_memory_at(size, requested_address, _fd_for_heap); + if (failed_to_reserve_as_requested(base, requested_address, size, false, _fd_for_heap != -1)) { // OS ignored requested address. Try different address. base = NULL; } } else { - if (_nvdimm_base_nv != NULL && _fd_for_heap != -1) { - base = os::reserve_memory(_dram_size, _nvdimm_base_nv, alignment, fd); - } else { - base = os::reserve_memory(size, NULL, alignment, fd); - } + base = os::reserve_memory(size, NULL, alignment, _fd_for_heap); } if (base == NULL) return; @@ -205,14 +192,14 @@ // Check alignment constraints if ((((size_t)base) & (alignment - 1)) != 0) { // Base not aligned, retry - unmap_or_release_memory(base, size, fd != -1 /*is_file_mapped*/); + unmap_or_release_memory(base, size, _fd_for_heap != -1 /*is_file_mapped*/); // Make sure that size is aligned size = align_up(size, alignment); - base = os::reserve_memory_aligned(size, alignment, fd); + base = os::reserve_memory_aligned(size, alignment, _fd_for_heap); if (requested_address != 0 && - failed_to_reserve_as_requested(base, requested_address, size, false, fd != -1)) { + failed_to_reserve_as_requested(base, requested_address, size, false, _fd_for_heap != -1)) { // As a result of the alignment constraints, the allocated base differs // from the requested address. Return back to the caller who can // take remedial action (like try again without a requested address). @@ -223,13 +210,10 @@ } // Done _base = base; - _nvdimm_base = _base-_nvdimm_size; - _nvdimm_base_nv = NULL; - _dram_size = (size_t)size; _size = size; _alignment = alignment; // If heap is reserved with a backing file, the entire space has been committed. So set the _special flag to true - if (fd != -1) { + if (_fd_for_heap != -1 && AllocateOldGenAt == NULL) { _special = true; } } @@ -241,15 +225,13 @@ "size not allocation aligned"); _base = base; _size = size; - _nvdimm_base = NULL; - _nvdimm_base_nv = NULL; - _dram_size = (size_t)size; _alignment = alignment; _noaccess_prefix = 0; _special = special; _executable = executable; } + ReservedSpace ReservedSpace::first_part(size_t partition_size, size_t alignment, bool split, bool realloc) { assert(partition_size <= size(), "partition failed"); @@ -295,10 +277,6 @@ if (is_reserved()) { char *real_base = _base - _noaccess_prefix; const size_t real_size = _size + _noaccess_prefix; - // unmap nvdimm - if (_nvdimm_base != NULL) { - os::unmap_memory(_nvdimm_base, _nvdimm_size); - } if (special()) { if (_fd_for_heap != -1) { os::unmap_memory(real_base, real_size); @@ -309,10 +287,6 @@ os::release_memory(real_base, real_size); } _base = NULL; - _nvdimm_base = NULL; - _nvdimm_base_nv = NULL; - _dram_size = 0; - _nvdimm_size = 0; _size = 0; _noaccess_prefix = 0; _alignment = 0; @@ -347,7 +321,6 @@ Universe::set_narrow_oop_use_implicit_null_checks(false); } } - _base += _noaccess_prefix; _size -= _noaccess_prefix; assert(((uintptr_t)_base % _alignment == 0), "must be exactly of required alignment"); @@ -367,13 +340,6 @@ release(); } - if (_fd_for_heap != -1 && UseG1GC && AllocateOldGenAt != NULL) { - char* base_nv = os::reserve_memory(size, requested_address, alignment); - initialize_g1gc_nvdimm_dram_sizes(size, alignment); - _nvdimm_base_nv = base_nv+_nvdimm_size; // hint for allocation address of DRAM COMPRESSED HEAP. - } - - // If OS doesn't support demand paging for large page memory, we need // to use reserve_memory_special() to reserve and pin the entire region. // If there is a backing file directory for this space then whether @@ -388,7 +354,6 @@ } } char* base = NULL; - char* nvdimm_base = NULL; log_trace(gc, heap, coops)("Trying to allocate at address " PTR_FORMAT " heap of size " SIZE_FORMAT_HEX, @@ -424,33 +389,16 @@ // important. If available space is not detected, return NULL. if (requested_address != 0) { - if (_nvdimm_base_nv != NULL && _fd_for_heap != -1 && AllocateOldGenAt != NULL) { - // first unmap so that OS does not keep trying. - os::unmap_memory(_nvdimm_base_nv, _dram_size); - base = os::attempt_reserve_memory_at(_dram_size, _nvdimm_base_nv); - } else { - base = os::attempt_reserve_memory_at(size, requested_address, _fd_for_heap); - } + base = os::attempt_reserve_memory_at(size, requested_address, _fd_for_heap); } else { - if (_nvdimm_base_nv != NULL && _fd_for_heap != -1 && AllocateOldGenAt != NULL) { - // first unmap so that OS does not keep trying. - os::unmap_memory(_nvdimm_base_nv, _dram_size); - base = os::reserve_memory(_dram_size, _nvdimm_base_nv, alignment); - } else { - base = os::reserve_memory(size, NULL, alignment, _fd_for_heap); - } + base = os::reserve_memory(size, NULL, alignment, _fd_for_heap); } } if (base == NULL) { return; } // Done _base = base; - _nvdimm_base = _base-_nvdimm_size; - if (_nvdimm_base_nv != NULL && _fd_for_heap != -1 && AllocateOldGenAt != NULL) { - _size = _dram_size; - } else { - _size = size; - } + _size = size; _alignment = alignment; // If heap is reserved with a backing file, the entire space has been committed. So set the _special flag to true @@ -652,24 +600,13 @@ } } -void ReservedHeapSpace::initialize_g1gc_nvdimm_dram_sizes(size_t size, size_t alignment) { - _dram_size = (size_t)((size * G1MaxNewSizePercent)/100); - size_t page_sz = os::vm_page_size() -1 ; - _dram_size = (_dram_size + page_sz) & (~page_sz); - // align sizes. - _dram_size = align_down(_dram_size, alignment); - _nvdimm_size = size - _dram_size; - _nvdimm_size = (_nvdimm_size + page_sz) & (~page_sz); - _nvdimm_size = align_down(_nvdimm_size, alignment); -} - ReservedHeapSpace::ReservedHeapSpace(size_t size, size_t alignment, bool large, const char* heap_allocation_directory) : ReservedSpace() { if (size == 0) { return; } - // if AllocateOldGen is used + // Open AllocateOldGenAt file if (AllocateOldGenAt != NULL) { _fd_for_heap = os::create_file_for_heap(AllocateOldGenAt); if (_fd_for_heap== -1) { @@ -698,18 +635,6 @@ // Heap size should be aligned to alignment, too. guarantee(is_aligned(size, alignment), "set by caller"); - char* base_nv = NULL; - _nvdimm_base_nv = NULL; - - if (_fd_for_heap != -1 && UseG1GC && AllocateOldGenAt != NULL) { - if (!UseCompressedOops) { - // if compressed oops use requested address. - initialize_g1gc_nvdimm_dram_sizes(size, alignment); - base_nv = os::reserve_memory(size, NULL, alignment); - _nvdimm_base_nv = base_nv+_nvdimm_size; // hint for allocation address of DRAM heap - } - } - if (UseCompressedOops) { initialize_compressed_heap(size, alignment, large); if (_size > size) { @@ -719,11 +644,7 @@ establish_noaccess_prefix(); } } else { - if (_fd_for_heap != -1 && UseG1GC && AllocateOldGenAt != NULL) { - initialize(_dram_size, alignment, large, NULL, false); - } else { - initialize(size, alignment, large, NULL, false); - } + initialize(size, alignment, large, NULL, false); } assert(markOopDesc::encode_pointer_as_mark(_base)->decode_pointer() == _base, @@ -733,14 +654,10 @@ if (base() != NULL) { MemTracker::record_virtual_memory_type((address)base(), mtJavaHeap); - if (_fd_for_heap != -1 && UseG1GC && AllocateOldGenAt != NULL) { + if (AllocateOldGenAt != NULL && _fd_for_heap != -1) { os::set_nvdimm_present(true); - os::set_dram_heapbase((address)_base); - os::set_nvdimm_heapbase((address)_nvdimm_base); + os::set_nvdimm_heapbase((address)_base); os::set_nvdimm_fd(_fd_for_heap); - _size += _nvdimm_size; - _base = _nvdimm_base; - log_info(gc, heap)("Java DRAM Heap at [%p - %p] & NVDIMM Old Gen at [%p - %p] %ld \n", _nvdimm_base+_nvdimm_size, (char*)(_nvdimm_base+_nvdimm_size+_dram_size), _nvdimm_base, (char*)(_nvdimm_base+_nvdimm_size), size); } } --- old/src/hotspot/share/memory/virtualspace.hpp 2018-06-14 13:48:27.946000000 -0700 +++ new/src/hotspot/share/memory/virtualspace.hpp 2018-06-14 13:48:27.767000000 -0700 @@ -33,11 +33,7 @@ friend class VMStructs; protected: char* _base; - char* _nvdimm_base; - char* _nvdimm_base_nv; size_t _size; - size_t _dram_size; - size_t _nvdimm_size; size_t _noaccess_prefix; size_t _alignment; bool _special; @@ -67,11 +63,9 @@ // Accessors char* base() const { return _base; } - char* nvdimm_base() const { return _nvdimm_base; } int nvdimm_fd() const { return _fd_for_heap; } void setup_fd(int fd) {_fd_for_heap = fd; } size_t size() const { return _size; } - size_t nvdimm_size() const { return _nvdimm_size; } char* end() const { return _base + _size; } size_t alignment() const { return _alignment; } bool special() const { return _special; } @@ -122,7 +116,6 @@ void initialize_compressed_heap(const size_t size, size_t alignment, bool large); // Create protection page at the beginning of the space. void establish_noaccess_prefix(); - void initialize_g1gc_nvdimm_dram_sizes(size_t size, size_t alignment); public: // Constructor. Tries to find a heap that is good for compressed oops. // heap_allocation_directory is the path to the backing memory for Java heap. When set, Java heap will be allocated