[vm, gc] Also label committed regions of the compressed heap on Linux and Fuchsia. TEST=/proc/pid/maps on sufficiently new kernel Bug: https://github.com/dart-lang/sdk/issues/64873 Cq-Include-Trybots: luci.dart.try:vm-aot-android-debug-x64c-try,vm-aot-win-debug-x64c-try,vm-aot-linux-debug-x64c-try Change-Id: I9b1cfa19547912c3d359aa13958d253130efd64c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/576200 Reviewed-by: Alexander Markov <alexmarkov@google.com> Commit-Queue: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/vm/heap/page.cc b/runtime/vm/heap/page.cc index 3ec4946..12e07a4 100644 --- a/runtime/vm/heap/page.cc +++ b/runtime/vm/heap/page.cc
@@ -74,7 +74,7 @@ if (memory == nullptr) { if (compressed) { #if defined(DART_COMPRESSED_POINTERS) - memory = cage->Allocate(size, kPageSize); + memory = cage->Allocate(size, kPageSize, name); #else UNREACHABLE(); #endif
diff --git a/runtime/vm/virtual_memory.h b/runtime/vm/virtual_memory.h index 29e181c..e90b9c5 100644 --- a/runtime/vm/virtual_memory.h +++ b/runtime/vm/virtual_memory.h
@@ -167,7 +167,7 @@ static bool FreeSubSegment(void* address, intptr_t size); static VirtualMemory* Reserve(intptr_t size, intptr_t alignment); - static void Commit(void* address, intptr_t size); + static void Commit(void* address, intptr_t size, const char* name); static void Decommit(void* address, intptr_t size); #if defined(DART_ENABLE_RX_WORKAROUNDS)
diff --git a/runtime/vm/virtual_memory_compressed.cc b/runtime/vm/virtual_memory_compressed.cc index 857e1e4..393fb9e 100644 --- a/runtime/vm/virtual_memory_compressed.cc +++ b/runtime/vm/virtual_memory_compressed.cc
@@ -55,7 +55,9 @@ zx_vmar_destroy(outer_vmar_); } -VirtualMemory* Cage::Allocate(intptr_t size, intptr_t alignment) { +VirtualMemory* Cage::Allocate(intptr_t size, + intptr_t alignment, + const char* name) { const zx_vm_option_t align_flag = Utils::ShiftForPowerOfTwo(alignment) << ZX_VM_ALIGN_BASE; ASSERT((ZX_VM_ALIGN_1KB <= align_flag) && (align_flag <= ZX_VM_ALIGN_4GB)); @@ -69,6 +71,10 @@ zx_status_get_string(status)); } + if (name != nullptr) { + zx_object_set_property(vmo, ZX_PROP_NAME, name, strlen(name)); + } + const zx_vm_option_t region_options = ZX_VM_PERM_READ | ZX_VM_PERM_WRITE | align_flag; uword base; @@ -177,7 +183,9 @@ return reinterpret_cast<void*>(base_); } -VirtualMemory* Cage::Allocate(intptr_t size, intptr_t alignment) { +VirtualMemory* Cage::Allocate(intptr_t size, + intptr_t alignment, + const char* name) { ASSERT(alignment <= kCompressedHeapAlignment); const intptr_t allocated_size = Utils::RoundUp(size, kCompressedPageSize); uword pages = allocated_size / kCompressedPageSize; @@ -227,7 +235,7 @@ uword address = base_ + page_id * kCompressedPageSize; ASSERT(Utils::IsAligned(address, kCompressedPageSize)); MemoryRegion region(reinterpret_cast<void*>(address), allocated_size); - VirtualMemory::Commit(region.pointer(), region.size()); + VirtualMemory::Commit(region.pointer(), region.size(), name); return new VirtualMemory(region, region, this); }
diff --git a/runtime/vm/virtual_memory_compressed.h b/runtime/vm/virtual_memory_compressed.h index 5533844..e62b494 100644 --- a/runtime/vm/virtual_memory_compressed.h +++ b/runtime/vm/virtual_memory_compressed.h
@@ -36,7 +36,7 @@ Cage(); ~Cage(); - VirtualMemory* Allocate(intptr_t size, intptr_t alignment); + VirtualMemory* Allocate(intptr_t size, intptr_t alignment, const char* name); void Free(void* address, intptr_t size); void* GetRegion();
diff --git a/runtime/vm/virtual_memory_posix.cc b/runtime/vm/virtual_memory_posix.cc index 81b9386..c91def1 100644 --- a/runtime/vm/virtual_memory_posix.cc +++ b/runtime/vm/virtual_memory_posix.cc
@@ -720,7 +720,7 @@ return new VirtualMemory(region, region); } -void VirtualMemory::Commit(void* address, intptr_t size) { +void VirtualMemory::Commit(void* address, intptr_t size, const char* name) { ASSERT(Utils::IsAligned(address, PageSize())); ASSERT(Utils::IsAligned(size, PageSize())); void* result = mmap(address, size, PROT_READ | PROT_WRITE, @@ -732,6 +732,9 @@ FATAL("Failed to commit: %d (%s)", error, Utils::StrError(error, error_buf, kBufferSize)); } +#if defined(DART_HOST_OS_ANDROID) || defined(DART_HOST_OS_LINUX) + prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, address, size, name); +#endif } void VirtualMemory::Decommit(void* address, intptr_t size) { @@ -747,6 +750,9 @@ FATAL("Failed to decommit: %d (%s)", error, Utils::StrError(error, error_buf, kBufferSize)); } +#if defined(DART_HOST_OS_ANDROID) || defined(DART_HOST_OS_LINUX) + prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, address, size, nullptr); +#endif } VirtualMemory::~VirtualMemory() {
diff --git a/runtime/vm/virtual_memory_win.cc b/runtime/vm/virtual_memory_win.cc index 86cb61c..b738858 100644 --- a/runtime/vm/virtual_memory_win.cc +++ b/runtime/vm/virtual_memory_win.cc
@@ -127,7 +127,7 @@ return new VirtualMemory(region, reserved); } -void VirtualMemory::Commit(void* address, intptr_t size) { +void VirtualMemory::Commit(void* address, intptr_t size, const char* name) { ASSERT(Utils::IsAligned(address, PageSize())); ASSERT(Utils::IsAligned(size, PageSize())); void* result = VirtualAlloc(address, size, MEM_COMMIT, PAGE_READWRITE);