@@ -596,6 +596,18 @@ static void* mi_os_page_align_area_conservative(void* addr, size_t size, size_t*
596
596
return mi_os_page_align_areax (true, addr , size , newsize );
597
597
}
598
598
599
+ static void mi_mprotect_hint (int err ) {
600
+ #if defined(MI_OS_USE_MMAP ) && (MI_SECURE >=2 ) // guard page around every mimalloc page
601
+ if (err == ENOMEM ) {
602
+ _mi_warning_message ("the previous warning may have been caused by a low memory map limit.\n"
603
+ " On Linux this is controlled by the vm.max_map_count. For example:\n"
604
+ " > sudo sysctl -w vm.max_map_count=262144\n" );
605
+ }
606
+ #else
607
+ UNUSED (err );
608
+ #endif
609
+ }
610
+
599
611
// Commit/Decommit memory.
600
612
// Usuelly commit is aligned liberal, while decommit is aligned conservative.
601
613
// (but not for the reset version where we want commit to be conservative as well)
@@ -644,6 +656,7 @@ static bool mi_os_commitx(void* addr, size_t size, bool commit, bool conservativ
644
656
#endif
645
657
if (err != 0 ) {
646
658
_mi_warning_message ("%s error: start: 0x%p, csize: 0x%x, err: %i\n" , commit ? "commit" : "decommit" , start , csize , err );
659
+ mi_mprotect_hint (err );
647
660
}
648
661
mi_assert_internal (err == 0 );
649
662
return (err == 0 );
@@ -762,6 +775,7 @@ static bool mi_os_protectx(void* addr, size_t size, bool protect) {
762
775
#endif
763
776
if (err != 0 ) {
764
777
_mi_warning_message ("mprotect error: start: 0x%p, csize: 0x%x, err: %i\n" , start , csize , err );
778
+ mi_mprotect_hint (err );
765
779
}
766
780
return (err == 0 );
767
781
}
0 commit comments