--- old/src/hotspot/share/memory/virtualspace.cpp 2018-06-13 17:32:29.251000000 -0700 +++ new/src/hotspot/share/memory/virtualspace.cpp 2018-06-13 17:32:29.090000000 -0700 @@ -37,10 +37,10 @@ // Dummy constructor ReservedSpace::ReservedSpace() : _base(NULL), _size(0), _noaccess_prefix(0), _nvdimm_base_nv(NULL), _nvdimm_size(0), _dram_size(0), - _alignment(0), _special(false), _executable(false), _fd_for_heap(-1), _fd_for_nvdimm(-1) { + _alignment(0), _special(false), _executable(false), _fd_for_heap(-1) { } -ReservedSpace::ReservedSpace(size_t size, size_t preferred_page_size) : _fd_for_heap(-1), _fd_for_nvdimm(-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) { bool has_preferred_page_size = preferred_page_size != 0; // Want to use large pages where possible and pad with small pages. @@ -62,14 +62,14 @@ ReservedSpace::ReservedSpace(size_t size, size_t alignment, bool large, - char* requested_address) : _fd_for_heap(-1), _fd_for_nvdimm(-1), + char* requested_address) : _fd_for_heap(-1), _nvdimm_base_nv(NULL), _nvdimm_size(0), _dram_size(0) { initialize(size, alignment, large, requested_address, false); } ReservedSpace::ReservedSpace(size_t size, size_t alignment, bool large, - bool executable) : _fd_for_heap(-1), _fd_for_nvdimm(-1), + bool executable) : _fd_for_heap(-1), _nvdimm_base_nv(NULL), _nvdimm_size(0), _dram_size(0) { initialize(size, alignment, large, NULL, executable); } @@ -172,7 +172,11 @@ } } } - + 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 @@ -183,16 +187,16 @@ // important. If available space is not detected, return NULL. if (requested_address != 0) { - 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)) { + base = os::attempt_reserve_memory_at(size, requested_address, fd); + if (failed_to_reserve_as_requested(base, requested_address, size, false, fd != -1)) { // OS ignored requested address. Try different address. base = NULL; } } else { - if (_nvdimm_base_nv != NULL && _fd_for_nvdimm != -1) { - base = os::reserve_memory(_dram_size, _nvdimm_base_nv, alignment, _fd_for_heap); + 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_for_heap); + base = os::reserve_memory(size, NULL, alignment, fd); } } @@ -201,14 +205,14 @@ // Check alignment constraints if ((((size_t)base) & (alignment - 1)) != 0) { // Base not aligned, retry - unmap_or_release_memory(base, size, _fd_for_heap != -1 /*is_file_mapped*/); + unmap_or_release_memory(base, size, fd != -1 /*is_file_mapped*/); // Make sure that size is aligned size = align_up(size, alignment); - base = os::reserve_memory_aligned(size, alignment, _fd_for_heap); + base = os::reserve_memory_aligned(size, alignment, fd); if (requested_address != 0 && - failed_to_reserve_as_requested(base, requested_address, size, false, _fd_for_heap != -1)) { + failed_to_reserve_as_requested(base, requested_address, size, false, fd != -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). @@ -225,7 +229,7 @@ _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_for_heap != -1) { + if (fd != -1) { _special = true; } } @@ -292,8 +296,8 @@ char *real_base = _base - _noaccess_prefix; const size_t real_size = _size + _noaccess_prefix; // unmap nvdimm - if (_fd_for_nvdimm != -1) { - os::unmap_memory(real_base+real_size, _nvdimm_size); + if (_nvdimm_base != NULL) { + os::unmap_memory(_nvdimm_base, _nvdimm_size); } if (special()) { if (_fd_for_heap != -1) { @@ -363,12 +367,13 @@ release(); } - if (_fd_for_nvdimm != -1 && UseG1GC) { + 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 @@ -419,7 +424,7 @@ // important. If available space is not detected, return NULL. if (requested_address != 0) { - if (_nvdimm_base_nv != NULL && _fd_for_nvdimm != -1) { + 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); @@ -427,7 +432,7 @@ base = os::attempt_reserve_memory_at(size, requested_address, _fd_for_heap); } } else { - if (_nvdimm_base_nv != NULL && _fd_for_nvdimm != -1) { + 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); @@ -441,7 +446,7 @@ // Done _base = base; _nvdimm_base = _base-_nvdimm_size; - if (_nvdimm_base_nv != NULL && _fd_for_nvdimm != -1) { + if (_nvdimm_base_nv != NULL && _fd_for_heap != -1 && AllocateOldGenAt != NULL) { _size = _dram_size; } else { _size = size; @@ -449,7 +454,7 @@ _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_for_heap != -1) { + if (_fd_for_heap != -1 && AllocateOldGenAt == NULL) { _special = true; } @@ -666,20 +671,20 @@ // if AllocateOldGen is used if (AllocateOldGenAt != NULL) { - _fd_for_nvdimm = os::create_file_for_heap(AllocateOldGenAt); - if (_fd_for_nvdimm == -1) { + _fd_for_heap = os::create_file_for_heap(AllocateOldGenAt); + if (_fd_for_heap== -1) { vm_exit_during_initialization( err_msg("Could not create file for Heap at location %s", AllocateOldGenAt)); } if (UseParallelOldGC) { // For ParallelOldGC, adaptive sizing picks _old_gen virtual space sizes as needed. // allocate Xmx on NVDIMM as adaptive sizing may put lot of pressure on NVDIMM. - os::allocate_file(_fd_for_nvdimm, MaxHeapSize); - os::set_nvdimm_fd(_fd_for_nvdimm); + os::allocate_file(_fd_for_heap, MaxHeapSize); + os::set_nvdimm_fd(_fd_for_heap); os::set_nvdimm_present(true); } } else { - _fd_for_nvdimm = -1; + _fd_for_heap = -1; } if (heap_allocation_directory != NULL) { @@ -696,7 +701,7 @@ char* base_nv = NULL; _nvdimm_base_nv = NULL; - if (_fd_for_nvdimm != -1 && UseG1GC) { + if (_fd_for_heap != -1 && UseG1GC && AllocateOldGenAt != NULL) { if (!UseCompressedOops) { // if compressed oops use requested address. initialize_g1gc_nvdimm_dram_sizes(size, alignment); @@ -714,7 +719,7 @@ establish_noaccess_prefix(); } } else { - if (_fd_for_nvdimm != -1 && UseG1GC) { + if (_fd_for_heap != -1 && UseG1GC && AllocateOldGenAt != NULL) { initialize(_dram_size, alignment, large, NULL, false); } else { initialize(size, alignment, large, NULL, false); @@ -728,18 +733,18 @@ if (base() != NULL) { MemTracker::record_virtual_memory_type((address)base(), mtJavaHeap); - if (_fd_for_nvdimm != -1 && UseG1GC) { + if (_fd_for_heap != -1 && UseG1GC && AllocateOldGenAt != NULL) { os::set_nvdimm_present(true); os::set_dram_heapbase((address)_base); os::set_nvdimm_heapbase((address)_nvdimm_base); - os::set_nvdimm_fd(_fd_for_nvdimm); + 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); } } - if (_fd_for_heap != -1) { + if (_fd_for_heap != -1 && AllocateOldGenAt == NULL) { os::close(_fd_for_heap); } } --- old/src/hotspot/share/memory/virtualspace.hpp 2018-06-13 17:32:29.618000000 -0700 +++ new/src/hotspot/share/memory/virtualspace.hpp 2018-06-13 17:32:29.457000000 -0700 @@ -42,7 +42,6 @@ size_t _alignment; bool _special; int _fd_for_heap; - int _fd_for_nvdimm; private: bool _executable; @@ -69,8 +68,8 @@ // Accessors char* base() const { return _base; } char* nvdimm_base() const { return _nvdimm_base; } - int nvdimm_fd() const { return _fd_for_nvdimm; } - void setup_fd(int fd) {_fd_for_nvdimm = fd; } + 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; }