src/hotspot/os/linux/os_linux.cpp
changeset 48153 cfa2c43e58c2
parent 48122 37937ce6adf3
child 48635 612dfa1d8aad
equal deleted inserted replaced
48152:bef902d8fef1 48153:cfa2c43e58c2
   128 
   128 
   129 // for timer info max values which include all bits
   129 // for timer info max values which include all bits
   130 #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
   130 #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
   131 
   131 
   132 #define LARGEPAGES_BIT (1 << 6)
   132 #define LARGEPAGES_BIT (1 << 6)
       
   133 #define DAX_SHARED_BIT (1 << 8)
   133 ////////////////////////////////////////////////////////////////////////////////
   134 ////////////////////////////////////////////////////////////////////////////////
   134 // global variables
   135 // global variables
   135 julong os::Linux::_physical_memory = 0;
   136 julong os::Linux::_physical_memory = 0;
   136 
   137 
   137 address   os::Linux::_initial_thread_stack_bottom = NULL;
   138 address   os::Linux::_initial_thread_stack_bottom = NULL;
  3368 // - (bit 3) file-backed shared memory
  3369 // - (bit 3) file-backed shared memory
  3369 // - (bit 4) ELF header pages in file-backed private memory areas (it is
  3370 // - (bit 4) ELF header pages in file-backed private memory areas (it is
  3370 //           effective only if the bit 2 is cleared)
  3371 //           effective only if the bit 2 is cleared)
  3371 // - (bit 5) hugetlb private memory
  3372 // - (bit 5) hugetlb private memory
  3372 // - (bit 6) hugetlb shared memory
  3373 // - (bit 6) hugetlb shared memory
       
  3374 // - (bit 7) dax private memory
       
  3375 // - (bit 8) dax shared memory
  3373 //
  3376 //
  3374 static void set_coredump_filter(void) {
  3377 static void set_coredump_filter(bool largepages, bool dax_shared) {
  3375   FILE *f;
  3378   FILE *f;
  3376   long cdm;
  3379   long cdm;
       
  3380   bool filter_changed = false;
  3377 
  3381 
  3378   if ((f = fopen("/proc/self/coredump_filter", "r+")) == NULL) {
  3382   if ((f = fopen("/proc/self/coredump_filter", "r+")) == NULL) {
  3379     return;
  3383     return;
  3380   }
  3384   }
  3381 
  3385 
  3384     return;
  3388     return;
  3385   }
  3389   }
  3386 
  3390 
  3387   rewind(f);
  3391   rewind(f);
  3388 
  3392 
  3389   if ((cdm & LARGEPAGES_BIT) == 0) {
  3393   if (largepages && (cdm & LARGEPAGES_BIT) == 0) {
  3390     cdm |= LARGEPAGES_BIT;
  3394     cdm |= LARGEPAGES_BIT;
       
  3395     filter_changed = true;
       
  3396   }
       
  3397   if (dax_shared && (cdm & DAX_SHARED_BIT) == 0) {
       
  3398     cdm |= DAX_SHARED_BIT;
       
  3399     filter_changed = true;
       
  3400   }
       
  3401   if (filter_changed) {
  3391     fprintf(f, "%#lx", cdm);
  3402     fprintf(f, "%#lx", cdm);
  3392   }
  3403   }
  3393 
  3404 
  3394   fclose(f);
  3405   fclose(f);
  3395 }
  3406 }
  3524   }
  3535   }
  3525 
  3536 
  3526   size_t large_page_size = Linux::setup_large_page_size();
  3537   size_t large_page_size = Linux::setup_large_page_size();
  3527   UseLargePages          = Linux::setup_large_page_type(large_page_size);
  3538   UseLargePages          = Linux::setup_large_page_type(large_page_size);
  3528 
  3539 
  3529   set_coredump_filter();
  3540   set_coredump_filter(true /*largepages*/, false /*dax_shared*/);
  3530 }
  3541 }
  3531 
  3542 
  3532 #ifndef SHM_HUGETLB
  3543 #ifndef SHM_HUGETLB
  3533   #define SHM_HUGETLB 04000
  3544   #define SHM_HUGETLB 04000
  3534 #endif
  3545 #endif
  3893   return UseTransparentHugePages;
  3904   return UseTransparentHugePages;
  3894 }
  3905 }
  3895 
  3906 
  3896 bool os::can_execute_large_page_memory() {
  3907 bool os::can_execute_large_page_memory() {
  3897   return UseTransparentHugePages || UseHugeTLBFS;
  3908   return UseTransparentHugePages || UseHugeTLBFS;
       
  3909 }
       
  3910 
       
  3911 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr, int file_desc) {
       
  3912   assert(file_desc >= 0, "file_desc is not valid");
       
  3913   char* result = pd_attempt_reserve_memory_at(bytes, requested_addr);
       
  3914   if (result != NULL) {
       
  3915     if (replace_existing_mapping_with_file_mapping(result, bytes, file_desc) == NULL) {
       
  3916       vm_exit_during_initialization(err_msg("Error in mapping Java heap at the given filesystem directory"));
       
  3917     }
       
  3918   }
       
  3919   return result;
  3898 }
  3920 }
  3899 
  3921 
  3900 // Reserve memory at an arbitrary address, only if that area is
  3922 // Reserve memory at an arbitrary address, only if that area is
  3901 // available (and not reserved for something else).
  3923 // available (and not reserved for something else).
  3902 
  3924 
  5006   }
  5028   }
  5007 
  5029 
  5008   // initialize thread priority policy
  5030   // initialize thread priority policy
  5009   prio_init();
  5031   prio_init();
  5010 
  5032 
       
  5033   if (!FLAG_IS_DEFAULT(AllocateHeapAt)) {
       
  5034     set_coredump_filter(false /*largepages*/, true /*dax_shared*/);
       
  5035   }
  5011   return JNI_OK;
  5036   return JNI_OK;
  5012 }
  5037 }
  5013 
  5038 
  5014 // Mark the polling page as unreadable
  5039 // Mark the polling page as unreadable
  5015 void os::make_polling_page_unreadable(void) {
  5040 void os::make_polling_page_unreadable(void) {