equal
deleted
inserted
replaced
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) { |