Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
deps: V8: cherry-pick d0468de
Original commit message:

    [heap] Fix StoreBuffer setup.

    - Solves a problem for PPC in a configuration where commit page size
      is 64K. https://chromium-review.googlesource.com/c/v8/v8/+/1149515
    - Uses existing VM allocation code to get properly aligned memory.
    - Makes sure the size for SetPermissions is a multiple of system page
      size.

    Bug:chromium:756050

    Change-Id: Ib3799ab7a3bb44b0091c234234c1cc47938379c2
    Reviewed-on: https://chromium-review.googlesource.com/1161210
    Commit-Queue: Bill Budge <[email protected]>
    Reviewed-by: Michael Lippautz <[email protected]>
    Reviewed-by: Michael Starzinger <[email protected]>
    Cr-Commit-Position: refs/heads/master@{#54930}

Refs: v8/v8@d0468de
  • Loading branch information
Milad Farazmand committed Feb 5, 2019
commit 8dec9e248cfbe50168fa9ee35d8137c8b1a7433c
2 changes: 1 addition & 1 deletion common.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@

# Reset this number to 0 on major V8 upgrades.
# Increment by one for each non-official patch applied to deps/v8.
'v8_embedder_string': '-node.12',
'v8_embedder_string': '-node.13',

# Enable disassembler for `--print-code` v8 options
'v8_enable_disassembler': 1,
Expand Down
28 changes: 17 additions & 11 deletions deps/v8/src/heap/store-buffer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -30,22 +30,28 @@ StoreBuffer::StoreBuffer(Heap* heap)
}

void StoreBuffer::SetUp() {
// Allocate 3x the buffer size, so that we can start the new store buffer
// aligned to 2x the size. This lets us use a bit test to detect the end of
// the area.
const size_t requested_size = kStoreBufferSize * kStoreBuffers;
// Allocate buffer memory aligned at least to kStoreBufferSize. This lets us
// use a bit test to detect the ends of the buffers.
const size_t alignment =
std::max<size_t>(kStoreBufferSize, AllocatePageSize());
void* hint = AlignedAddress(heap_->GetRandomMmapAddr(), alignment);
VirtualMemory reservation;
if (!AllocVirtualMemory(kStoreBufferSize * 3, heap_->GetRandomMmapAddr(),
&reservation)) {
if (!AlignedAllocVirtualMemory(requested_size, alignment, hint,
&reservation)) {
heap_->FatalProcessOutOfMemory("StoreBuffer::SetUp");
}

Address start = reservation.address();
start_[0] = reinterpret_cast<Address*>(::RoundUp(start, kStoreBufferSize));
const size_t allocated_size = reservation.size();

start_[0] = reinterpret_cast<Address*>(start);
limit_[0] = start_[0] + (kStoreBufferSize / kPointerSize);
start_[1] = limit_[0];
limit_[1] = start_[1] + (kStoreBufferSize / kPointerSize);

Address* vm_limit = reinterpret_cast<Address*>(start + reservation.size());

// Sanity check the buffers.
Address* vm_limit = reinterpret_cast<Address*>(start + allocated_size);
USE(vm_limit);
for (int i = 0; i < kStoreBuffers; i++) {
DCHECK(reinterpret_cast<Address>(start_[i]) >= reservation.address());
Expand All @@ -55,8 +61,9 @@ void StoreBuffer::SetUp() {
DCHECK_EQ(0, reinterpret_cast<Address>(limit_[i]) & kStoreBufferMask);
}

if (!reservation.SetPermissions(reinterpret_cast<Address>(start_[0]),
kStoreBufferSize * kStoreBuffers,
// Set RW permissions only on the pages we use.
const size_t used_size = RoundUp(requested_size, CommitPageSize());
if (!reservation.SetPermissions(start, used_size,
PageAllocator::kReadWrite)) {
heap_->FatalProcessOutOfMemory("StoreBuffer::SetUp");
}
Expand All @@ -65,7 +72,6 @@ void StoreBuffer::SetUp() {
virtual_memory_.TakeControl(&reservation);
}


void StoreBuffer::TearDown() {
if (virtual_memory_.IsReserved()) virtual_memory_.Free();
top_ = nullptr;
Expand Down