[VM/Runtime] Check for valid values specified for old_gen_heap_size and

new_gen_semi_max_size

TEST=new unit test

Change-Id: I3dd985baf28c1e876c128252c15b8566d22b170d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/212267
Commit-Queue: Siva Annamalai <asiva@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
This commit is contained in:
asiva 2021-09-09 02:39:03 +00:00 committed by commit-bot@chromium.org
parent e44b653283
commit 2785fe9996
6 changed files with 96 additions and 4 deletions

View file

@ -89,6 +89,52 @@ UNIT_TEST_CASE(DartAPI_DartInitializeCallsCodeObserver) {
EXPECT(Dart_Cleanup() == NULL);
}
UNIT_TEST_CASE(DartAPI_DartInitializeHeapSizes) {
Dart_InitializeParams params;
memset(&params, 0, sizeof(Dart_InitializeParams));
params.version = DART_INITIALIZE_PARAMS_CURRENT_VERSION;
params.vm_snapshot_data = TesterState::vm_snapshot_data;
params.create_group = TesterState::create_callback;
params.shutdown_isolate = TesterState::shutdown_callback;
params.cleanup_group = TesterState::group_cleanup_callback;
params.start_kernel_isolate = true;
// Initialize with a normal heap size specification.
const char* options_1[] = {"--old-gen-heap-size=3192",
"--new-gen-semi-max-size=32"};
EXPECT(Dart_SetVMFlags(2, options_1) == NULL);
EXPECT(Dart_Initialize(&params) == NULL);
EXPECT(FLAG_old_gen_heap_size == 3192);
EXPECT(FLAG_new_gen_semi_max_size == 32);
EXPECT(Dart_Cleanup() == NULL);
const char* options_2[] = {"--old-gen-heap-size=16384",
"--new-gen-semi-max-size=16384"};
EXPECT(Dart_SetVMFlags(2, options_2) == NULL);
EXPECT(Dart_Initialize(&params) == NULL);
if (kMaxAddrSpaceMB == 4096) {
EXPECT(FLAG_old_gen_heap_size == 0);
EXPECT(FLAG_new_gen_semi_max_size == kDefaultNewGenSemiMaxSize);
} else {
EXPECT(FLAG_old_gen_heap_size == 16384);
EXPECT(FLAG_new_gen_semi_max_size == 16384);
}
EXPECT(Dart_Cleanup() == NULL);
const char* options_3[] = {"--old-gen-heap-size=30720",
"--new-gen-semi-max-size=30720"};
EXPECT(Dart_SetVMFlags(2, options_3) == NULL);
EXPECT(Dart_Initialize(&params) == NULL);
if (kMaxAddrSpaceMB == 4096) {
EXPECT(FLAG_old_gen_heap_size == 0);
EXPECT(FLAG_new_gen_semi_max_size == kDefaultNewGenSemiMaxSize);
} else {
EXPECT(FLAG_old_gen_heap_size == 30720);
EXPECT(FLAG_new_gen_semi_max_size == 30720);
}
EXPECT(Dart_Cleanup() == NULL);
}
TEST_CASE(Dart_KillIsolate) {
const char* kScriptChars =
"int testMain() {\n"

View file

@ -152,7 +152,7 @@ constexpr bool FLAG_support_il_printer = false;
"Maximum number of polymorphic check, otherwise it is megamorphic.") \
P(max_equality_polymorphic_checks, int, 32, \
"Maximum number of polymorphic checks in equality operator,") \
P(new_gen_semi_max_size, int, (kWordSize <= 4) ? 8 : 16, \
P(new_gen_semi_max_size, int, kDefaultNewGenSemiMaxSize, \
"Max size of new gen semi space in MB") \
P(new_gen_semi_initial_size, int, (kWordSize <= 4) ? 1 : 2, \
"Initial size of new gen semi space in MB") \

View file

@ -42,17 +42,19 @@ static constexpr int kCompressedWordSize = kWordSize;
static constexpr int kCompressedWordSizeLog2 = kWordSizeLog2;
typedef uintptr_t compressed_uword;
#endif
const int kMaxAddrSpaceMB = (kWordSize <= 4) ? 4096 : kMaxInt;
// Number of bytes per BigInt digit.
const intptr_t kBytesPerBigIntDigit = 4;
// The default old gen heap size in MB, where 0 == unlimited.
// The default old gen heap size in MB, where 0 -- unlimited.
// 32-bit: OS limit is 2 or 3 GB
// 64-bit: Linux's limit is
// sysctl vm.max_map_count (default 2^16) * 512 KB OldPages = 32 GB
// Set the VM limit below the OS limit to increase the likelihood of failing
// gracefully with a Dart OutOfMemory exception instead of SIGABORT.
const intptr_t kDefaultMaxOldGenHeapSize = (kWordSize <= 4) ? 1536 : 30720;
const intptr_t kDefaultNewGenSemiMaxSize = (kWordSize <= 4) ? 8 : 16;
#define kPosInfinity bit_cast<double>(DART_UINT64_C(0x7ff0000000000000))
#define kNegInfinity bit_cast<double>(DART_UINT64_C(0xfff0000000000000))

View file

@ -52,6 +52,22 @@ intptr_t VirtualMemory::CalculatePageSize() {
}
void VirtualMemory::Init() {
if (FLAG_old_gen_heap_size < 0 || FLAG_old_gen_heap_size > kMaxAddrSpaceMB) {
OS::PrintErr(
"warning: value specified for --old_gen_heap_size %d is larger than"
" the physically addressable range, using 0(unlimited) instead.`\n",
FLAG_old_gen_heap_size);
FLAG_old_gen_heap_size = 0;
}
if (FLAG_new_gen_semi_max_size < 0 ||
FLAG_new_gen_semi_max_size > kMaxAddrSpaceMB) {
OS::PrintErr(
"warning: value specified for --new_gen_semi_max_size %d is larger"
" than the physically addressable range, using %" Pd " instead.`\n",
FLAG_new_gen_semi_max_size, kDefaultNewGenSemiMaxSize);
FLAG_new_gen_semi_max_size = kDefaultNewGenSemiMaxSize;
}
#if defined(DART_COMPRESSED_POINTERS)
if (compressed_heap_vmar_ == ZX_HANDLE_INVALID) {
const zx_vm_option_t align_flag =

View file

@ -105,8 +105,22 @@ static MemoryRegion ClipToAlignedRegion(MemoryRegion region, size_t alignment) {
#endif // LARGE_RESERVATIONS_MAY_FAIL
void VirtualMemory::Init() {
if (FLAG_old_gen_heap_size < 0 || FLAG_old_gen_heap_size > kMaxAddrSpaceMB) {
OS::PrintErr(
"warning: value specified for --old_gen_heap_size %d is larger than"
" the physically addressable range, using 0(unlimited) instead.`\n",
FLAG_old_gen_heap_size);
FLAG_old_gen_heap_size = 0;
}
if (FLAG_new_gen_semi_max_size < 0 ||
FLAG_new_gen_semi_max_size > kMaxAddrSpaceMB) {
OS::PrintErr(
"warning: value specified for --new_gen_semi_max_size %d is larger"
" than the physically addressable range, using %" Pd " instead.`\n",
FLAG_new_gen_semi_max_size, kDefaultNewGenSemiMaxSize);
FLAG_new_gen_semi_max_size = kDefaultNewGenSemiMaxSize;
}
page_size_ = CalculatePageSize();
#if defined(DART_COMPRESSED_POINTERS)
ASSERT(compressed_heap_ == nullptr);
#if defined(LARGE_RESERVATIONS_MAY_FAIL)

View file

@ -53,8 +53,22 @@ static void* AllocateAlignedImpl(intptr_t size,
}
void VirtualMemory::Init() {
if (FLAG_old_gen_heap_size < 0 || FLAG_old_gen_heap_size > kMaxAddrSpaceMB) {
OS::PrintErr(
"warning: value specified for --old_gen_heap_size %d is larger than"
" the physically addressable range, using 0(unlimited) instead.`\n",
FLAG_old_gen_heap_size);
FLAG_old_gen_heap_size = 0;
}
if (FLAG_new_gen_semi_max_size < 0 ||
FLAG_new_gen_semi_max_size > kMaxAddrSpaceMB) {
OS::PrintErr(
"warning: value specified for --new_gen_semi_max_size %d is larger"
" than the physically addressable range, using %" Pd " instead.`\n",
FLAG_new_gen_semi_max_size, kDefaultNewGenSemiMaxSize);
FLAG_new_gen_semi_max_size = kDefaultNewGenSemiMaxSize;
}
page_size_ = CalculatePageSize();
#if defined(DART_COMPRESSED_POINTERS)
ASSERT(compressed_heap_ == nullptr);
compressed_heap_ = Reserve(kCompressedHeapSize, kCompressedHeapAlignment);