@@ -3564,6 +3564,30 @@ bool os::Linux::hugetlbfs_sanity_check(bool warn, size_t page_size) {
3564
3564
return result;
3565
3565
}
3566
3566
3567
+ bool os::Linux::shm_hugetlbfs_sanity_check (bool warn, size_t page_size) {
3568
+ // Try to create a large shared memory segment.
3569
+ int shmid = shmget (IPC_PRIVATE, page_size, SHM_HUGETLB|IPC_CREAT|SHM_R|SHM_W);
3570
+ if (shmid == -1 ) {
3571
+ // Possible reasons for shmget failure:
3572
+ // 1. shmmax is too small for the request.
3573
+ // > check shmmax value: cat /proc/sys/kernel/shmmax
3574
+ // > increase shmmax value: echo "new_value" > /proc/sys/kernel/shmmax
3575
+ // 2. not enough large page memory.
3576
+ // > check available large pages: cat /proc/meminfo
3577
+ // > increase amount of large pages:
3578
+ // sysctl -w vm.nr_hugepages=new_value
3579
+ // > For more information regarding large pages please refer to:
3580
+ // https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt
3581
+ if (warn) {
3582
+ warning (" Large pages using UseSHM are not configured on this system." );
3583
+ }
3584
+ return false ;
3585
+ }
3586
+ // Managed to create a segment, now delete it.
3587
+ shmctl (shmid, IPC_RMID, NULL );
3588
+ return true ;
3589
+ }
3590
+
3567
3591
// From the coredump_filter documentation:
3568
3592
//
3569
3593
// - (bit 0) anonymous private memory
@@ -3748,7 +3772,18 @@ bool os::Linux::setup_large_page_type(size_t page_size) {
3748
3772
UseHugeTLBFS = false ;
3749
3773
}
3750
3774
3751
- return UseSHM;
3775
+ if (UseSHM) {
3776
+ bool warn_on_failure = !FLAG_IS_DEFAULT (UseSHM);
3777
+ if (shm_hugetlbfs_sanity_check (warn_on_failure, page_size)) {
3778
+ return true ;
3779
+ }
3780
+ UseSHM = false ;
3781
+ }
3782
+
3783
+ if (!FLAG_IS_DEFAULT (UseLargePages)) {
3784
+ log_warning (pagesize)(" UseLargePages disabled, no large pages configured and available on the system." );
3785
+ }
3786
+ return false ;
3752
3787
}
3753
3788
3754
3789
void os::large_page_init () {
@@ -3888,13 +3923,15 @@ char* os::Linux::reserve_memory_special_shm(size_t bytes, size_t alignment,
3888
3923
int shmid = shmget (IPC_PRIVATE, bytes, SHM_HUGETLB|IPC_CREAT|SHM_R|SHM_W);
3889
3924
if (shmid == -1 ) {
3890
3925
// Possible reasons for shmget failure:
3891
- // 1. shmmax is too small for Java heap .
3926
+ // 1. shmmax is too small for the request .
3892
3927
// > check shmmax value: cat /proc/sys/kernel/shmmax
3893
- // > increase shmmax value: echo "0xffffffff " > /proc/sys/kernel/shmmax
3928
+ // > increase shmmax value: echo "new_value " > /proc/sys/kernel/shmmax
3894
3929
// 2. not enough large page memory.
3895
3930
// > check available large pages: cat /proc/meminfo
3896
3931
// > increase amount of large pages:
3897
- // echo new_value > /proc/sys/vm/nr_hugepages
3932
+ // sysctl -w vm.nr_hugepages=new_value
3933
+ // > For more information regarding large pages please refer to:
3934
+ // https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt
3898
3935
// Note 1: different Linux may use different name for this property,
3899
3936
// e.g. on Redhat AS-3 it is "hugetlb_pool".
3900
3937
// Note 2: it's possible there's enough physical memory available but
0 commit comments