Commit 5f265c33 authored by Clemens Backes's avatar Clemens Backes Committed by Commit Bot

[wasm] Remove --wasm-max-mem-pages-growth flag

This unifies {max_initial_mem_pages} and {max_maximum_mem_pages} into
{max_mem_pages}.
The {CompilationEnv} constructor was incorrectly using the former
instead of the latter anyway. This did not really matter though, since
they typically have the same value.
Also, there is not a single test that sets --wasm-max-mem-pages-growth.

R=manoskouk@chromium.org
CC=jkummerow@chromium.org

Bug: v8:10949
Change-Id: Ib7ab9b4c239d50b72013087eda5a214829c90369
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2426619Reviewed-by: 's avatarManos Koukoutos <manoskouk@chromium.org>
Commit-Queue: Clemens Backes <clemensb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#70114}
parent b77c63c0
...@@ -297,7 +297,7 @@ inline bool IsValidAsmjsMemorySize(size_t size) { ...@@ -297,7 +297,7 @@ inline bool IsValidAsmjsMemorySize(size_t size) {
// Enforce asm.js spec minimum size. // Enforce asm.js spec minimum size.
if (size < (1u << 12u)) return false; if (size < (1u << 12u)) return false;
// Enforce engine-limited and flag-limited maximum allocation size. // Enforce engine-limited and flag-limited maximum allocation size.
if (size > wasm::max_initial_mem_pages() * uint64_t{wasm::kWasmPageSize}) { if (size > wasm::max_mem_pages() * uint64_t{wasm::kWasmPageSize}) {
return false; return false;
} }
// Enforce power-of-2 sizes for 2^12 - 2^24. // Enforce power-of-2 sizes for 2^12 - 2^24.
......
...@@ -767,9 +767,7 @@ DEFINE_BOOL(wasm_async_compilation, true, ...@@ -767,9 +767,7 @@ DEFINE_BOOL(wasm_async_compilation, true,
DEFINE_BOOL(wasm_test_streaming, false, DEFINE_BOOL(wasm_test_streaming, false,
"use streaming compilation instead of async compilation for tests") "use streaming compilation instead of async compilation for tests")
DEFINE_UINT(wasm_max_mem_pages, v8::internal::wasm::kSpecMaxMemoryPages, DEFINE_UINT(wasm_max_mem_pages, v8::internal::wasm::kSpecMaxMemoryPages,
"maximum initial number of 64KiB memory pages of a wasm instance") "maximum number of 64KiB memory pages per wasm memory")
DEFINE_UINT(wasm_max_mem_pages_growth, v8::internal::wasm::kSpecMaxMemoryPages,
"maximum number of 64KiB pages a Wasm memory can grow to")
DEFINE_UINT(wasm_max_table_size, v8::internal::wasm::kV8MaxWasmTableSize, DEFINE_UINT(wasm_max_table_size, v8::internal::wasm::kV8MaxWasmTableSize,
"maximum table size of a wasm instance") "maximum table size of a wasm instance")
DEFINE_UINT(wasm_max_code_space, v8::internal::kMaxWasmCodeMB, DEFINE_UINT(wasm_max_code_space, v8::internal::kMaxWasmCodeMB,
......
...@@ -276,9 +276,9 @@ std::unique_ptr<BackingStore> BackingStore::Allocate( ...@@ -276,9 +276,9 @@ std::unique_ptr<BackingStore> BackingStore::Allocate(
} }
// Trying to allocate 4 GiB on a 32-bit platform is guaranteed to fail. // Trying to allocate 4 GiB on a 32-bit platform is guaranteed to fail.
// We don't lower the official max_maximum_mem_pages() limit because that // We don't lower the official max_mem_pages() limit because that would be
// would be observable upon instantiation; this way the effective limit // observable upon instantiation; this way the effective limit on 32-bit
// on 32-bit platforms is defined by the allocator. // platforms is defined by the allocator.
constexpr size_t kPlatformMaxPages = constexpr size_t kPlatformMaxPages =
std::numeric_limits<size_t>::max() / wasm::kWasmPageSize; std::numeric_limits<size_t>::max() / wasm::kWasmPageSize;
...@@ -325,7 +325,7 @@ std::unique_ptr<BackingStore> BackingStore::TryAllocateWasmMemory( ...@@ -325,7 +325,7 @@ std::unique_ptr<BackingStore> BackingStore::TryAllocateWasmMemory(
// Compute size of reserved memory. // Compute size of reserved memory.
size_t engine_max_pages = wasm::max_maximum_mem_pages(); size_t engine_max_pages = wasm::max_mem_pages();
maximum_pages = std::min(engine_max_pages, maximum_pages); maximum_pages = std::min(engine_max_pages, maximum_pages);
// If the platform doesn't support so many pages, attempting to allocate // If the platform doesn't support so many pages, attempting to allocate
// is guaranteed to fail, so we don't even try. // is guaranteed to fail, so we don't even try.
......
...@@ -1902,8 +1902,8 @@ auto Memory::make(Store* store_abs, const MemoryType* type) -> own<Memory> { ...@@ -1902,8 +1902,8 @@ auto Memory::make(Store* store_abs, const MemoryType* type) -> own<Memory> {
const Limits& limits = type->limits(); const Limits& limits = type->limits();
uint32_t minimum = limits.min; uint32_t minimum = limits.min;
// The max_initial_mem_pages limit is only spec'ed for JS embeddings, // The max_mem_pages limit is only spec'ed for JS embeddings, so we'll
// so we'll directly use the maximum pages limit here. // directly use the maximum pages limit here.
if (minimum > i::wasm::kSpecMaxMemoryPages) return nullptr; if (minimum > i::wasm::kSpecMaxMemoryPages) return nullptr;
uint32_t maximum = limits.max; uint32_t maximum = limits.max;
if (maximum != Limits(0).max) { if (maximum != Limits(0).max) {
......
...@@ -75,7 +75,7 @@ struct CompilationEnv { ...@@ -75,7 +75,7 @@ struct CompilationEnv {
: 0), : 0),
max_memory_size((module && module->has_maximum_pages max_memory_size((module && module->has_maximum_pages
? module->maximum_pages ? module->maximum_pages
: max_initial_mem_pages()) * : max_mem_pages()) *
uint64_t{kWasmPageSize}), uint64_t{kWasmPageSize}),
enabled_features(enabled_features), enabled_features(enabled_features),
lower_simd(lower_simd) {} lower_simd(lower_simd) {}
......
...@@ -636,10 +636,10 @@ class ModuleDecoderImpl : public Decoder { ...@@ -636,10 +636,10 @@ class ModuleDecoderImpl : public Decoder {
// ===== Imported memory ============================================= // ===== Imported memory =============================================
if (!AddMemory(module_.get())) break; if (!AddMemory(module_.get())) break;
uint8_t flags = validate_memory_flags(&module_->has_shared_memory); uint8_t flags = validate_memory_flags(&module_->has_shared_memory);
consume_resizable_limits( consume_resizable_limits("memory", "pages", max_mem_pages(),
"memory", "pages", max_initial_mem_pages(), &module_->initial_pages,
&module_->initial_pages, &module_->has_maximum_pages, &module_->has_maximum_pages, max_mem_pages(),
max_maximum_mem_pages(), &module_->maximum_pages, flags); &module_->maximum_pages, flags);
break; break;
} }
case kExternalGlobal: { case kExternalGlobal: {
...@@ -736,9 +736,9 @@ class ModuleDecoderImpl : public Decoder { ...@@ -736,9 +736,9 @@ class ModuleDecoderImpl : public Decoder {
for (uint32_t i = 0; ok() && i < memory_count; i++) { for (uint32_t i = 0; ok() && i < memory_count; i++) {
if (!AddMemory(module_.get())) break; if (!AddMemory(module_.get())) break;
uint8_t flags = validate_memory_flags(&module_->has_shared_memory); uint8_t flags = validate_memory_flags(&module_->has_shared_memory);
consume_resizable_limits( consume_resizable_limits("memory", "pages", max_mem_pages(),
"memory", "pages", max_initial_mem_pages(), &module_->initial_pages, &module_->initial_pages,
&module_->has_maximum_pages, max_maximum_mem_pages(), &module_->has_maximum_pages, max_mem_pages(),
&module_->maximum_pages, flags); &module_->maximum_pages, flags);
} }
} }
......
...@@ -1675,10 +1675,9 @@ void InstanceBuilder::InitGlobals(Handle<WasmInstanceObject> instance) { ...@@ -1675,10 +1675,9 @@ void InstanceBuilder::InitGlobals(Handle<WasmInstanceObject> instance) {
// Allocate memory for a module instance as a new JSArrayBuffer. // Allocate memory for a module instance as a new JSArrayBuffer.
bool InstanceBuilder::AllocateMemory() { bool InstanceBuilder::AllocateMemory() {
uint32_t initial_pages = module_->initial_pages; uint32_t initial_pages = module_->initial_pages;
uint32_t maximum_pages = module_->has_maximum_pages uint32_t maximum_pages =
? module_->maximum_pages module_->has_maximum_pages ? module_->maximum_pages : max_mem_pages();
: wasm::max_maximum_mem_pages(); if (initial_pages > max_mem_pages()) {
if (initial_pages > max_initial_mem_pages()) {
thrower_->RangeError("Out of memory: wasm memory too large"); thrower_->RangeError("Out of memory: wasm memory too large");
return false; return false;
} }
......
...@@ -1444,18 +1444,12 @@ std::shared_ptr<WasmEngine> WasmEngine::GetWasmEngine() { ...@@ -1444,18 +1444,12 @@ std::shared_ptr<WasmEngine> WasmEngine::GetWasmEngine() {
return *GetSharedWasmEngine(); return *GetSharedWasmEngine();
} }
// {max_initial_mem_pages} is declared in wasm-limits.h. // {max_mem_pages} is declared in wasm-limits.h.
uint32_t max_initial_mem_pages() { uint32_t max_mem_pages() {
STATIC_ASSERT(kV8MaxWasmMemoryPages <= kMaxUInt32); STATIC_ASSERT(kV8MaxWasmMemoryPages <= kMaxUInt32);
return std::min(uint32_t{kV8MaxWasmMemoryPages}, FLAG_wasm_max_mem_pages); return std::min(uint32_t{kV8MaxWasmMemoryPages}, FLAG_wasm_max_mem_pages);
} }
uint32_t max_maximum_mem_pages() {
STATIC_ASSERT(kV8MaxWasmMemoryPages <= kMaxUInt32);
return std::min(uint32_t{kV8MaxWasmMemoryPages},
FLAG_wasm_max_mem_pages_growth);
}
// {max_table_init_entries} is declared in wasm-limits.h. // {max_table_init_entries} is declared in wasm-limits.h.
uint32_t max_table_init_entries() { uint32_t max_table_init_entries() {
return std::min(uint32_t{kV8MaxWasmTableInitEntries}, return std::min(uint32_t{kV8MaxWasmTableInitEntries},
......
...@@ -1134,15 +1134,14 @@ void WebAssemblyMemory(const v8::FunctionCallbackInfo<v8::Value>& args) { ...@@ -1134,15 +1134,14 @@ void WebAssemblyMemory(const v8::FunctionCallbackInfo<v8::Value>& args) {
int64_t initial = 0; int64_t initial = 0;
if (!GetInitialOrMinimumProperty(isolate, &thrower, context, descriptor, if (!GetInitialOrMinimumProperty(isolate, &thrower, context, descriptor,
&initial, 0, &initial, 0, i::wasm::max_mem_pages())) {
i::wasm::max_initial_mem_pages())) {
return; return;
} }
// The descriptor's 'maximum'. // The descriptor's 'maximum'.
int64_t maximum = -1; int64_t maximum = -1;
if (!GetOptionalIntegerProperty(isolate, &thrower, context, descriptor, if (!GetOptionalIntegerProperty(isolate, &thrower, context, descriptor,
v8_str(isolate, "maximum"), nullptr, &maximum, v8_str(isolate, "maximum"), nullptr, &maximum,
initial, i::wasm::max_maximum_mem_pages())) { initial, i::wasm::max_mem_pages())) {
return; return;
} }
...@@ -1730,8 +1729,8 @@ void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { ...@@ -1730,8 +1729,8 @@ void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo<v8::Value>& args) {
} }
uint64_t max_size64 = receiver->maximum_pages(); uint64_t max_size64 = receiver->maximum_pages();
if (max_size64 > uint64_t{i::wasm::max_maximum_mem_pages()}) { if (max_size64 > uint64_t{i::wasm::max_mem_pages()}) {
max_size64 = i::wasm::max_maximum_mem_pages(); max_size64 = i::wasm::max_mem_pages();
} }
i::Handle<i::JSArrayBuffer> old_buffer(receiver->array_buffer(), i_isolate); i::Handle<i::JSArrayBuffer> old_buffer(receiver->array_buffer(), i_isolate);
......
...@@ -31,8 +31,8 @@ constexpr size_t kV8MaxWasmExceptions = 1000000; ...@@ -31,8 +31,8 @@ constexpr size_t kV8MaxWasmExceptions = 1000000;
constexpr size_t kV8MaxWasmExceptionTypes = 1000000; constexpr size_t kV8MaxWasmExceptionTypes = 1000000;
constexpr size_t kV8MaxWasmDataSegments = 100000; constexpr size_t kV8MaxWasmDataSegments = 100000;
// This indicates the maximum memory size our implementation supports. // This indicates the maximum memory size our implementation supports.
// Don't use this limit directly; use {max_initial_mem_pages()} instead // Don't use this limit directly; use {max_mem_pages()} instead to take the
// to take the spec'ed limit as well as command line flag into account. // spec'ed limit as well as command line flag into account.
constexpr size_t kV8MaxWasmMemoryPages = 65536; // = 4 GiB constexpr size_t kV8MaxWasmMemoryPages = 65536; // = 4 GiB
constexpr size_t kV8MaxWasmStringSize = 100000; constexpr size_t kV8MaxWasmStringSize = 100000;
constexpr size_t kV8MaxWasmModuleSize = 1024 * 1024 * 1024; // = 1 GiB constexpr size_t kV8MaxWasmModuleSize = 1024 * 1024 * 1024; // = 1 GiB
...@@ -65,13 +65,12 @@ constexpr uint64_t kWasmMaxHeapOffset = ...@@ -65,13 +65,12 @@ constexpr uint64_t kWasmMaxHeapOffset =
// Defined in wasm-engine.cc. // Defined in wasm-engine.cc.
// TODO(wasm): Make this size_t for wasm64. Currently the --wasm-max-mem-pages // TODO(wasm): Make this size_t for wasm64. Currently the --wasm-max-mem-pages
// flag is only uint32_t. // flag is only uint32_t.
V8_EXPORT_PRIVATE uint32_t max_initial_mem_pages(); V8_EXPORT_PRIVATE uint32_t max_mem_pages();
V8_EXPORT_PRIVATE uint32_t max_maximum_mem_pages();
uint32_t max_table_init_entries(); uint32_t max_table_init_entries();
size_t max_module_size(); size_t max_module_size();
inline uint64_t max_mem_bytes() { inline uint64_t max_mem_bytes() {
return uint64_t{max_maximum_mem_pages()} * kWasmPageSize; return uint64_t{max_mem_pages()} * kWasmPageSize;
} }
} // namespace wasm } // namespace wasm
......
...@@ -914,16 +914,15 @@ int32_t WasmMemoryObject::Grow(Isolate* isolate, ...@@ -914,16 +914,15 @@ int32_t WasmMemoryObject::Grow(Isolate* isolate,
if (old_buffer->is_asmjs_memory()) return -1; if (old_buffer->is_asmjs_memory()) return -1;
// Checks for maximum memory size. // Checks for maximum memory size.
uint32_t maximum_pages = wasm::max_maximum_mem_pages(); uint32_t maximum_pages = wasm::max_mem_pages();
if (memory_object->has_maximum_pages()) { if (memory_object->has_maximum_pages()) {
maximum_pages = std::min( maximum_pages = std::min(
maximum_pages, static_cast<uint32_t>(memory_object->maximum_pages())); maximum_pages, static_cast<uint32_t>(memory_object->maximum_pages()));
} }
DCHECK_GE(wasm::max_maximum_mem_pages(), maximum_pages);
size_t old_size = old_buffer->byte_length(); size_t old_size = old_buffer->byte_length();
DCHECK_EQ(0, old_size % wasm::kWasmPageSize); DCHECK_EQ(0, old_size % wasm::kWasmPageSize);
size_t old_pages = old_size / wasm::kWasmPageSize; size_t old_pages = old_size / wasm::kWasmPageSize;
CHECK_GE(wasm::max_maximum_mem_pages(), old_pages); CHECK_GE(wasm::max_mem_pages(), old_pages);
if (pages > maximum_pages - old_pages) return -1; if (pages > maximum_pages - old_pages) return -1;
std::shared_ptr<BackingStore> backing_store = old_buffer->GetBackingStore(); std::shared_ptr<BackingStore> backing_store = old_buffer->GetBackingStore();
if (!backing_store) return -1; if (!backing_store) return -1;
......
...@@ -32,8 +32,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { ...@@ -32,8 +32,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
// We reduce the maximum memory size and table size of WebAssembly instances // We reduce the maximum memory size and table size of WebAssembly instances
// to avoid OOMs in the fuzzer. // to avoid OOMs in the fuzzer.
i::FlagScope<uint32_t> max_mem_flag_scope(&i::FLAG_wasm_max_mem_pages, 32); i::FlagScope<uint32_t> max_mem_flag_scope(&i::FLAG_wasm_max_mem_pages, 32);
i::FlagScope<uint32_t> max_mem_growth_flag_scope(
&i::FLAG_wasm_max_mem_pages_growth, 32);
i::FlagScope<uint32_t> max_table_size_scope(&i::FLAG_wasm_max_table_size, i::FlagScope<uint32_t> max_table_size_scope(&i::FLAG_wasm_max_table_size,
100); 100);
v8_fuzzer::FuzzerSupport* support = v8_fuzzer::FuzzerSupport::Get(); v8_fuzzer::FuzzerSupport* support = v8_fuzzer::FuzzerSupport::Get();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment