Commit ff4ae37e authored by Ulan Degenbaev's avatar Ulan Degenbaev Committed by Commit Bot

[ptr-compr] Make memory reservation for new isolate more robust

IsolateAllocator::InitReservation can fail with OOM if multiple V8
isolates are created simultaneously and race to reserve the same
memory region.

Now the function falls back to using overreserved region as the
last resort.

Bug: v8:9588
Change-Id: I9731e04181382f0c1401b2a78f3eba63a445bfc9
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1758315
Auto-Submit: Ulan Degenbaev <ulan@chromium.org>
Reviewed-by: 's avatarIgor Sheludko <ishell@chromium.org>
Reviewed-by: 's avatarSantiago Aboy Solanes <solanes@chromium.org>
Commit-Queue: Santiago Aboy Solanes <solanes@chromium.org>
Cr-Commit-Position: refs/heads/master@{#63243}
parent 2cccb464
...@@ -47,7 +47,7 @@ Address IsolateAllocator::InitReservation() { ...@@ -47,7 +47,7 @@ Address IsolateAllocator::InitReservation() {
size_t reservation_size = kPtrComprHeapReservationSize; size_t reservation_size = kPtrComprHeapReservationSize;
size_t base_alignment = kPtrComprIsolateRootAlignment; size_t base_alignment = kPtrComprIsolateRootAlignment;
const int kMaxAttempts = 3; const int kMaxAttempts = 4;
for (int attempt = 0; attempt < kMaxAttempts; ++attempt) { for (int attempt = 0; attempt < kMaxAttempts; ++attempt) {
Address hint = RoundDown(reinterpret_cast<Address>( Address hint = RoundDown(reinterpret_cast<Address>(
platform_page_allocator->GetRandomMmapAddr()), platform_page_allocator->GetRandomMmapAddr()),
...@@ -72,16 +72,25 @@ Address IsolateAllocator::InitReservation() { ...@@ -72,16 +72,25 @@ Address IsolateAllocator::InitReservation() {
// Fuchsia does not respect given hints so as a workaround we will use // Fuchsia does not respect given hints so as a workaround we will use
// overreserved address space region instead of trying to re-reserve // overreserved address space region instead of trying to re-reserve
// a subregion. // a subregion.
bool overreserve = true;
#else
// For the last attempt use the overreserved region to avoid an OOM crash.
// This case can happen if there are many isolates being created in
// parallel that race for reserving the regions.
bool overreserve = (attempt == kMaxAttempts - 1);
#endif
if (overreserve) {
if (padded_reservation.InVM(address, reservation_size)) { if (padded_reservation.InVM(address, reservation_size)) {
reservation_ = std::move(padded_reservation); reservation_ = std::move(padded_reservation);
return address; return address;
} }
#else } else {
// Now free the padded reservation and immediately try to reserve an exact // Now free the padded reservation and immediately try to reserve an exact
// region at aligned address. We have to do this dancing because the // region at aligned address. We have to do this dancing because the
// reservation address requirement is more complex than just a certain // reservation address requirement is more complex than just a certain
// alignment and not all operating systems support freeing parts of reserved // alignment and not all operating systems support freeing parts of
// address space regions. // reserved address space regions.
padded_reservation.Free(); padded_reservation.Free();
VirtualMemory reservation(platform_page_allocator, reservation_size, VirtualMemory reservation(platform_page_allocator, reservation_size,
...@@ -100,7 +109,7 @@ Address IsolateAllocator::InitReservation() { ...@@ -100,7 +109,7 @@ Address IsolateAllocator::InitReservation() {
CHECK_EQ(reservation_.size(), reservation_size); CHECK_EQ(reservation_.size(), reservation_size);
return aligned_address; return aligned_address;
} }
#endif }
} }
V8::FatalProcessOutOfMemory(nullptr, V8::FatalProcessOutOfMemory(nullptr,
"Failed to reserve memory for new V8 Isolate"); "Failed to reserve memory for new V8 Isolate");
......
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