< prev index next >

src/hotspot/share/memory/virtualspace.cpp

Print this page

        

@@ -35,14 +35,14 @@
 // ReservedSpace
 
 // 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.
   size_t page_size = has_preferred_page_size ? preferred_page_size : os::page_size_for_region_unaligned(size, 1);
   bool large_pages = page_size != (size_t)os::vm_page_size();

@@ -60,18 +60,18 @@
   initialize(size, alignment, large_pages, NULL, false);
 }
 
 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);
 }
 
 // Helper method

@@ -170,47 +170,51 @@
                             !FLAG_IS_DEFAULT(LargePageSizeInBytes))) {
         log_debug(gc, heap, coops)("Reserve regular memory without large pages");
       }
     }
   }
-
+  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
     // least 64K.
 
     // If the memory was requested at a particular address, use
     // os::attempt_reserve_memory_at() to avoid over mapping something
     // 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);
       }
     }
 
     if (base == NULL) return;
 
     // 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).
         assert(_base == NULL, "should be");
         return;

@@ -223,11 +227,11 @@
   _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_for_heap != -1) {
+  if (fd != -1) {
     _special = true;
   }
 }
 
 

@@ -290,12 +294,12 @@
 void ReservedSpace::release() {
   if (is_reserved()) {
     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) {
         os::unmap_memory(real_base, real_size);
       } else {

@@ -361,16 +365,17 @@
   if (_base != NULL) {
     // We tried before, but we didn't like the address delivered.
     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
   // large pages are allocated is up to the filesystem of the backing file.
   // So we ignore the UseLargePages flag in this case.

@@ -417,19 +422,19 @@
     // If the memory was requested at a particular address, use
     // os::attempt_reserve_memory_at() to avoid over mapping something
     // 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);
       } else {
         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);
       } else {
         base = os::reserve_memory(size, NULL, alignment, _fd_for_heap);

@@ -439,19 +444,19 @@
   if (base == NULL) { return; }
 
   // 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;
   }
   _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;
   }
 
   // Check alignment constraints
   if ((((size_t)base) & (alignment - 1)) != 0) {

@@ -664,24 +669,24 @@
     return;
   }
 
   // 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) {
     _fd_for_heap = os::create_file_for_heap(heap_allocation_directory);
     if (_fd_for_heap == -1) {

@@ -694,11 +699,11 @@
   guarantee(is_aligned(size, alignment), "set by caller");
 
   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);
       base_nv = os::reserve_memory(size, NULL, alignment);
       _nvdimm_base_nv = base_nv+_nvdimm_size; // hint for allocation address of DRAM heap

@@ -712,11 +717,11 @@
       // It can happen we get a zerobased/unscaled heap with noaccess prefix,
       // if we had to try at arbitrary address.
       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);
     }
   }

@@ -726,22 +731,22 @@
   assert(markOopDesc::encode_pointer_as_mark(&_base[size])->decode_pointer() == &_base[size],
          "area must be distinguishable from marks for mark-sweep");
 
   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);
   }
 }
 
 // Reserve space for code segment.  Same as Java heap only we mark this as
< prev index next >