Skip to content

Commit 841ca52

Browse files
eholkCommit Bot
authored andcommitted
Revert "Reland "[wasm] always allocate memory when guard regions are needed""
This reverts commit 5e76ff5. Reason for revert: tsan failures - https://build.chromium.org/p/client.v8/builders/V8%20Linux64%20TSAN/builds/17574 Original change's description: > Reland "[wasm] always allocate memory when guard regions are needed" > > This reverts commit 7cf29d8. > > Original change's description: > > [wasm] always allocate memory when guard regions are needed > > > > When using trap handlers, memory references do not get any checks inserted. This > > means there is no check for a null memory as happens when the memory size is > > 0. Normally this would be correctly caught as an out of bounds access, since the > > low memory addresses are not normally mapped. However, if they were mapped for > > some reason, we would not catch the out of bounds access. > > > > The fix is to ensure WebAssembly instances always have a guard region even if > > the memory is size 0. > > > > Bug: chromium:769637 > > Change-Id: I09fdaea92b7ccb3a6cc9e28392171ec098538a00 > Reviewed-on: https://chromium-review.googlesource.com/695812 > Commit-Queue: Eric Holk <eholk@chromium.org> > Reviewed-by: Clemens Hammacher <clemensh@chromium.org> > Reviewed-by: Michael Lippautz <mlippautz@chromium.org> > Cr-Commit-Position: refs/heads/master@{#48293} TBR=gdeepti@chromium.org,mtrofin@chromium.org,mlippautz@chromium.org,eholk@chromium.org,eholk@google.com,clemensh@chromium.org Change-Id: I52d5354126158a92602b08c48703d562ac95075b No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://chromium-review.googlesource.com/699599 Reviewed-by: Eric Holk <eholk@chromium.org> Commit-Queue: Eric Holk <eholk@chromium.org> Cr-Commit-Position: refs/heads/master@{#48294}
1 parent 5e76ff5 commit 841ca52

8 files changed

Lines changed: 11 additions & 66 deletions

File tree

src/heap/array-buffer-tracker-inl.h

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ void ArrayBufferTracker::RegisterNew(Heap* heap, JSArrayBuffer* buffer) {
1717
void* data = buffer->backing_store();
1818
if (!data) return;
1919

20-
size_t length = static_cast<size_t>(buffer->byte_length()->Number());
20+
size_t length = buffer->allocation_length();
2121
Page* page = Page::FromAddress(buffer->address());
2222
{
2323
base::LockGuard<base::RecursiveMutex> guard(page->mutex());
@@ -40,7 +40,7 @@ void ArrayBufferTracker::Unregister(Heap* heap, JSArrayBuffer* buffer) {
4040
if (!data) return;
4141

4242
Page* page = Page::FromAddress(buffer->address());
43-
size_t length = static_cast<size_t>(buffer->byte_length()->Number());
43+
size_t length = buffer->allocation_length();
4444
{
4545
base::LockGuard<base::RecursiveMutex> guard(page->mutex());
4646
LocalArrayBufferTracker* tracker = page->local_tracker();
@@ -50,30 +50,14 @@ void ArrayBufferTracker::Unregister(Heap* heap, JSArrayBuffer* buffer) {
5050
heap->update_external_memory(-static_cast<intptr_t>(length));
5151
}
5252

53-
void ArrayBufferTracker::IncreaseArrayBufferSize(Heap* heap,
54-
JSArrayBuffer* buffer,
55-
size_t delta) {
56-
DCHECK_NOT_NULL(buffer->backing_store());
57-
58-
Page* const page = Page::FromAddress(buffer->address());
59-
{
60-
base::LockGuard<base::RecursiveMutex> guard(page->mutex());
61-
LocalArrayBufferTracker* tracker = page->local_tracker();
62-
DCHECK_NOT_NULL(tracker);
63-
DCHECK(tracker->IsTracked(buffer));
64-
tracker->IncreaseRetainedSize(delta);
65-
}
66-
heap->update_external_memory(delta);
67-
}
68-
6953
template <typename Callback>
7054
void LocalArrayBufferTracker::Free(Callback should_free) {
7155
size_t freed_memory = 0;
7256
size_t retained_size = 0;
7357
for (TrackingData::iterator it = array_buffers_.begin();
7458
it != array_buffers_.end();) {
7559
JSArrayBuffer* buffer = reinterpret_cast<JSArrayBuffer*>(*it);
76-
const size_t length = static_cast<size_t>(buffer->byte_length()->Number());
60+
const size_t length = buffer->allocation_length();
7761
if (should_free(buffer)) {
7862
freed_memory += length;
7963
buffer->FreeBackingStore();
@@ -122,11 +106,6 @@ void LocalArrayBufferTracker::Remove(JSArrayBuffer* buffer, size_t length) {
122106
array_buffers_.erase(it);
123107
}
124108

125-
void LocalArrayBufferTracker::IncreaseRetainedSize(size_t delta) {
126-
DCHECK_GE(retained_size_ + delta, retained_size_);
127-
retained_size_ += delta;
128-
}
129-
130109
} // namespace internal
131110
} // namespace v8
132111

src/heap/array-buffer-tracker.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,6 @@ class ArrayBufferTracker : public AllStatic {
3333
// access to the tracker by taking the page lock for the corresponding page.
3434
inline static void RegisterNew(Heap* heap, JSArrayBuffer* buffer);
3535
inline static void Unregister(Heap* heap, JSArrayBuffer* buffer);
36-
// Tells the tracker that the array buffer has increased in size. The buffer
37-
// must already be tracked.
38-
inline static void IncreaseArrayBufferSize(Heap* heap, JSArrayBuffer* buffer,
39-
size_t delta);
4036

4137
// Frees all backing store pointers for dead JSArrayBuffers in new space.
4238
// Does not take any locks and can only be called during Scavenge.
@@ -77,7 +73,6 @@ class LocalArrayBufferTracker {
7773

7874
inline void Add(JSArrayBuffer* buffer, size_t length);
7975
inline void Remove(JSArrayBuffer* buffer, size_t length);
80-
inline void IncreaseRetainedSize(size_t delta);
8176

8277
// Frees up array buffers.
8378
//

src/heap/heap.cc

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2341,10 +2341,6 @@ void Heap::UnregisterArrayBuffer(JSArrayBuffer* buffer) {
23412341
ArrayBufferTracker::Unregister(this, buffer);
23422342
}
23432343

2344-
void Heap::TrackIncreasedArrayBufferSize(JSArrayBuffer* buffer, size_t delta) {
2345-
ArrayBufferTracker::IncreaseArrayBufferSize(this, buffer, delta);
2346-
}
2347-
23482344
void Heap::ConfigureInitialOldGenerationSize() {
23492345
if (!old_generation_size_configured_ && tracer()->SurvivalEventsRecorded()) {
23502346
old_generation_allocation_limit_ =

src/heap/heap.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1474,7 +1474,6 @@ class Heap {
14741474
// unregistered buffer, too, and the name is confusing.
14751475
void RegisterNewArrayBuffer(JSArrayBuffer* buffer);
14761476
void UnregisterArrayBuffer(JSArrayBuffer* buffer);
1477-
void TrackIncreasedArrayBufferSize(JSArrayBuffer* buffer, size_t delta);
14781477

14791478
// ===========================================================================
14801479
// Allocation site tracking. =================================================

src/wasm/module-compiler.cc

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1807,10 +1807,7 @@ MaybeHandle<WasmInstanceObject> InstanceBuilder::Build() {
18071807

18081808
DCHECK_IMPLIES(EnableGuardRegions(),
18091809
module_->is_asm_js() || memory->has_guard_region());
1810-
} else if (initial_pages > 0 || EnableGuardRegions()) {
1811-
// We need to unconditionally create a guard region if using trap handlers,
1812-
// even when the size is zero to prevent null-derence issues
1813-
// (e.g. https://crbug.com/769637).
1810+
} else if (initial_pages > 0) {
18141811
memory_ = AllocateMemory(initial_pages);
18151812
if (memory_.is_null()) return {}; // failed to allocate memory
18161813
}

src/wasm/wasm-memory.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,11 @@ Handle<JSArrayBuffer> NewArrayBuffer(Isolate* isolate, size_t size,
8888

8989
void* allocation_base = nullptr; // Set by TryAllocateBackingStore
9090
size_t allocation_length = 0; // Set by TryAllocateBackingStore
91-
// Normally we would avoid calling TryAllocateBackingStore at all for
92-
// zero-sized memories. This is tricky with guard pages. Instead, this logic
93-
// for when to allocate lives inside TryAllocateBackingStore.
94-
void* memory = TryAllocateBackingStore(isolate, size, enable_guard_regions,
95-
allocation_base, allocation_length);
91+
// Do not reserve memory till non zero memory is encountered.
92+
void* memory =
93+
(size == 0) ? nullptr
94+
: TryAllocateBackingStore(isolate, size, enable_guard_regions,
95+
allocation_base, allocation_length);
9696

9797
if (size > 0 && memory == nullptr) {
9898
return Handle<JSArrayBuffer>::null();

src/wasm/wasm-objects.cc

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,8 @@ Handle<JSArrayBuffer> GrowMemoryBuffer(Isolate* isolate,
331331
const bool enable_guard_regions = old_buffer.is_null()
332332
? wasm::EnableGuardRegions()
333333
: old_buffer->has_guard_region();
334-
const uint32_t size_increase = pages * WasmModule::kPageSize;
335-
const uint32_t new_size = old_size + size_increase;
334+
size_t new_size =
335+
static_cast<size_t>(old_pages + pages) * WasmModule::kPageSize;
336336
if (enable_guard_regions && old_size != 0) {
337337
DCHECK_NOT_NULL(old_buffer->backing_store());
338338
if (new_size > FLAG_wasm_max_mem_pages * WasmModule::kPageSize ||
@@ -346,10 +346,6 @@ Handle<JSArrayBuffer> GrowMemoryBuffer(Isolate* isolate,
346346
->AdjustAmountOfExternalAllocatedMemory(pages * WasmModule::kPageSize);
347347
Handle<Object> length_obj = isolate->factory()->NewNumberFromSize(new_size);
348348
old_buffer->set_byte_length(*length_obj);
349-
if (!old_buffer->is_external()) {
350-
isolate->heap()->TrackIncreasedArrayBufferSize(*old_buffer,
351-
size_increase);
352-
}
353349
return old_buffer;
354350
} else {
355351
Handle<JSArrayBuffer> new_buffer;

test/mjsunit/regress/wasm/regression-769637.js

Lines changed: 0 additions & 17 deletions
This file was deleted.

0 commit comments

Comments
 (0)