Commit 7a49c94c authored by Michael Lippautz's avatar Michael Lippautz Committed by Commit Bot

[heap] Make page promotion tests more robust against fragmentation

Bug: chromium:738865
Change-Id: If710b60d33eea94bff7b621910006c2d941a7670
Reviewed-on: https://chromium-review.googlesource.com/571900Reviewed-by: 's avatarUlan Degenbaev <ulan@chromium.org>
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#46697}
parent 033d44f0
...@@ -9,14 +9,13 @@ ...@@ -9,14 +9,13 @@
// FIXME(mstarzinger, marja): This is weird, but required because of the missing // FIXME(mstarzinger, marja): This is weird, but required because of the missing
// (disallowed) include: src/factory.h -> src/objects-inl.h // (disallowed) include: src/factory.h -> src/objects-inl.h
#include "src/objects-inl.h" #include "src/objects-inl.h"
// FIXME(mstarzinger, marja): This is weird, but required because of the missing
// (disallowed) include: src/feedback-vector.h ->
// src/feedback-vector-inl.h
#include "src/feedback-vector-inl.h"
#include "test/cctest/cctest.h" #include "test/cctest/cctest.h"
#include "test/cctest/heap/heap-tester.h" #include "test/cctest/heap/heap-tester.h"
#include "test/cctest/heap/heap-utils.h" #include "test/cctest/heap/heap-utils.h"
namespace v8 {
namespace internal {
namespace { namespace {
v8::Isolate* NewIsolateForPagePromotion(int min_semi_space_size = 8, v8::Isolate* NewIsolateForPagePromotion(int min_semi_space_size = 8,
...@@ -24,26 +23,31 @@ v8::Isolate* NewIsolateForPagePromotion(int min_semi_space_size = 8, ...@@ -24,26 +23,31 @@ v8::Isolate* NewIsolateForPagePromotion(int min_semi_space_size = 8,
// Parallel evacuation messes with fragmentation in a way that objects that // Parallel evacuation messes with fragmentation in a way that objects that
// should be copied in semi space are promoted to old space because of // should be copied in semi space are promoted to old space because of
// fragmentation. // fragmentation.
i::FLAG_parallel_compaction = false; FLAG_parallel_compaction = false;
i::FLAG_page_promotion = true; FLAG_page_promotion = true;
i::FLAG_page_promotion_threshold = 0; // % FLAG_page_promotion_threshold = 0;
i::FLAG_min_semi_space_size = min_semi_space_size; FLAG_min_semi_space_size = min_semi_space_size;
// We cannot optimize for size as we require a new space with more than one // We cannot optimize for size as we require a new space with more than one
// page. // page.
i::FLAG_optimize_for_size = false; FLAG_optimize_for_size = false;
// Set max_semi_space_size because it could've been initialized by an // Set max_semi_space_size because it could've been initialized by an
// implication of optimize_for_size. // implication of optimize_for_size.
i::FLAG_max_semi_space_size = max_semi_space_size; FLAG_max_semi_space_size = max_semi_space_size;
v8::Isolate::CreateParams create_params; v8::Isolate::CreateParams create_params;
create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
v8::Isolate* isolate = v8::Isolate::New(create_params); v8::Isolate* isolate = v8::Isolate::New(create_params);
return isolate; return isolate;
} }
} // namespace Page* FindLastPageInNewSpace(std::vector<Handle<FixedArray>>& handles) {
for (auto rit = handles.rbegin(); rit != handles.rend(); ++rit) {
Page* candidate = Page::FromAddress((*rit)->address());
if (candidate->InNewSpace()) return candidate;
}
return nullptr;
}
namespace v8 { } // namespace
namespace internal {
UNINITIALIZED_TEST(PagePromotion_NewToOld) { UNINITIALIZED_TEST(PagePromotion_NewToOld) {
if (!i::FLAG_incremental_marking) return; if (!i::FLAG_incremental_marking) return;
...@@ -61,10 +65,8 @@ UNINITIALIZED_TEST(PagePromotion_NewToOld) { ...@@ -61,10 +65,8 @@ UNINITIALIZED_TEST(PagePromotion_NewToOld) {
heap::SimulateFullSpace(heap->new_space(), &handles); heap::SimulateFullSpace(heap->new_space(), &handles);
heap->CollectGarbage(NEW_SPACE, i::GarbageCollectionReason::kTesting); heap->CollectGarbage(NEW_SPACE, i::GarbageCollectionReason::kTesting);
CHECK_GT(handles.size(), 0u); CHECK_GT(handles.size(), 0u);
// Last object in handles should definitely be on a page that does not Page* const to_be_promoted_page = FindLastPageInNewSpace(handles);
// contain the age mark, thus qualifying for moving. CHECK_NOT_NULL(to_be_promoted_page);
Handle<FixedArray> last_object = handles.back();
Page* to_be_promoted_page = Page::FromAddress(last_object->address());
CHECK(!to_be_promoted_page->Contains(heap->new_space()->age_mark())); CHECK(!to_be_promoted_page->Contains(heap->new_space()->age_mark()));
// To perform a sanity check on live bytes we need to mark the heap. // To perform a sanity check on live bytes we need to mark the heap.
heap::SimulateIncrementalMarking(heap, true); heap::SimulateIncrementalMarking(heap, true);
......
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