< prev index next >

src/hotspot/share/gc/g1/g1PageBasedVirtualSpace.cpp

Print this page

        

@@ -122,20 +122,48 @@
   guarantee(index <= _committed.size(),
             "Given boundary page " SIZE_FORMAT " is beyond managed page count " SIZE_FORMAT, index, _committed.size());
   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);
+  nvdimm_size = align_up(nvdimm_size, HeapRegion::GrainBytes);
+  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(),
            "Tried to commit area from page " SIZE_FORMAT " to page " SIZE_FORMAT " "
            "that is outside of managed space of " SIZE_FORMAT " pages",
            start, start + num_pages, _committed.size());
 
   char* start_addr = page_start(start);
   size_t size = num_pages * _page_size;
+  if (((address)start_addr == (address)os::nvdimm_heapbase())) {
+    bool is_committed = os::commit_memory(start_addr, size, false, os::nvdimm_fd());
+    if (!is_committed)  {
+      vm_exit_during_initialization(
+        err_msg("Could not map memory at %p for NVDIMM %s Fd %d", start_addr, AllocateOldGenAt, os::nvdimm_fd()));
+    } else {
+      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;
+  }
   os::commit_memory_or_exit(start_addr, size, _page_size, _executable,
                             err_msg("Failed to commit area from " PTR_FORMAT " to " PTR_FORMAT " of length " SIZE_FORMAT ".",
                             p2i(start_addr), p2i(start_addr + size), size));
 }
 
< prev index next >