Skip to content

Commit

Permalink
deps: V8: cherry-pick d0468de
Browse files Browse the repository at this point in the history
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 <bbudge@chromium.org>
    Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
    Reviewed-by: Michael Starzinger <mstarzinger@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#54930}

Refs: v8/v8@d0468de

PR-URL: #25827
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Beth Griggs <Bethany.Griggs@uk.ibm.com>
Reviewed-By: Yang Guo <yangguo@chromium.org>
  • Loading branch information
Milad Farazmand authored and BethGriggs committed Feb 5, 2019
1 parent 741c5ef commit 70322ea
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 12 deletions.
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.49',
'v8_embedder_string': '-node.50',

# 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

0 comments on commit 70322ea

Please sign in to comment.