27 const MemoryRegion& memory_region) {
29 CHECK_EQ(0u, memory_region.size() % allocator.CommitPageSize());
30 return allocator.SetPermissions(memory_region.base(), memory_region.size(),
35 const MemoryRegion& memory_region) {
37 CHECK_EQ(0u, memory_region.size() % allocator.CommitPageSize());
38 return allocator.DiscardSystemPages(memory_region.base(),
39 memory_region.size());
42std::optional<MemoryRegion> ReserveMemoryRegion(
PageAllocator& allocator,
43 size_t allocation_size) {
45 allocator.AllocatePages(
nullptr, allocation_size,
kPageSize,
50 const MemoryRegion reserved_region(
static_cast<Address>(region_memory),
52 DCHECK_EQ(reserved_region.base() + allocation_size, reserved_region.end());
53 return reserved_region;
57 const MemoryRegion& reserved_region) {
60 allocator.FreePages(reserved_region.base(), reserved_region.size());
63std::unique_ptr<PageMemoryRegion> CreateNormalPageMemoryRegion(
66 const auto region = ReserveMemoryRegion(allocator,
kPageSize);
67 if (!region)
return {};
68 auto result = std::unique_ptr<PageMemoryRegion>(
69 new PageMemoryRegion(allocator, *region));
73std::unique_ptr<PageMemoryRegion> CreateLargePageMemoryRegion(
75 const auto region = ReserveMemoryRegion(
76 allocator,
RoundUp(length, allocator.AllocatePageSize()));
77 if (!region)
return {};
78 auto result = std::unique_ptr<PageMemoryRegion>(
79 new PageMemoryRegion(allocator, *region));
87 :
allocator_(allocator), reserved_region_(reserved_region) {}
103 const auto result =
set_.emplace(region->region().base(), region);
110 const auto size =
set_.erase(region->region().base());
121 const size_t size = pmr->
region().size();
123 std::memset(
base, 0, size);
129 if (
pool_.empty())
return nullptr;
150 if (errno == ENOMEM) {
164 size_t total_size = 0;
165 for (
auto& entry :
pool_) {
166 if (entry.is_decommitted || entry.is_discarded) {
169 total_size += entry.region->region().size();
175 for (
auto& entry :
pool_) {
177 void*
base = entry.region->region().base();
178 size_t size = entry.region->region().size();
182 if (entry.is_decommitted) {
186 entry.is_decommitted =
true;
188 if (entry.is_discarded) {
191 CHECK(TryDiscard(page_allocator, entry.region->region()));
192 entry.is_discarded =
true;
199 : normal_page_allocator_(normal_page_allocator),
200 large_page_allocator_(large_page_allocator) {}
207 const auto region = cached->region();
211 return region.base();
217 const auto memory_region = pmr->region();
221 return memory_region.base();
240 const auto memory_region = pmr->region();
244 return memory_region.base();
#define ASAN_UNPOISON_MEMORY_REGION(start, size)
RegisterAllocator * allocator_
void Add(PageMemoryRegion *)
std::vector< PooledPageMemoryRegion > pool_
bool decommit_pooled_pages_
size_t PooledMemory() const
void ReleasePooledPages(PageAllocator &allocator)
PageMemoryRegion * Take()
Address TryAllocateNormalPageMemory()
PageAllocator & normal_page_allocator_
void FreeNormalPageMemory(Address writeable_base)
std::unordered_map< PageMemoryRegion *, std::unique_ptr< PageMemoryRegion > > normal_page_memory_regions_
void FreeLargePageMemory(Address writeable_base)
void ReleasePooledPages()
PageMemoryRegionTree page_memory_region_tree_
Address TryAllocateLargePageMemory(size_t size)
std::unordered_map< PageMemoryRegion *, std::unique_ptr< PageMemoryRegion > > large_page_memory_regions_
PageBackend(PageAllocator &normal_page_allocator, PageAllocator &large_page_allocator)
PageAllocator & large_page_allocator_
NormalPageMemoryPool page_pool_
std::map< ConstAddress, PageMemoryRegion * > set_
void Remove(PageMemoryRegion *)
void Add(PageMemoryRegion *)
PageMemoryRegion * Lookup(ConstAddress) const
PageAllocator & allocator() const
PageMemoryRegion(PageAllocator &, MemoryRegion)
void UnprotectForTesting()
PageAllocator & allocator_
const MemoryRegion region() const
virtual bool DecommitPages(void *address, size_t size)=0
virtual bool RecommitPages(void *address, size_t length, Permission permissions)
virtual bool SetPermissions(void *address, size_t length, Permission permissions)=0
ZoneVector< RpoNumber > & result
V8_INLINE void CheckMemoryIsZero(const void *address, size_t size)
constexpr size_t kPageSize
FatalOutOfMemoryHandler & GetGlobalOOMHandler()
v8::PageAllocator PageAllocator
#define DCHECK_NOT_NULL(val)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_NE(v1, v2)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
constexpr T RoundUp(T x, intptr_t m)
PageMemoryRegion * region
#define V8_LIKELY(condition)
#define V8_WARN_UNUSED_RESULT