From a0ba36eb1bd061743a30a77488194c4ce56ad5e8 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Fri, 18 Sep 2026 17:01:26 -0700 Subject: [PATCH] SharedCodeBuffer: Skip VMA naming when JITSymbols are enabled For some reason `perf top` prefers VMA names over perf symbols. So disable them when any JIT symbol option is enabled. Breaks WTF tracking for those buffers but because it's debug, we kind of have to. --- .../Core/SharedCodeBufferManager.cpp | 19 ++++++++++++++++--- .../Interface/Core/SharedCodeBufferManager.h | 5 ++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/FEXCore/Source/Interface/Core/SharedCodeBufferManager.cpp b/FEXCore/Source/Interface/Core/SharedCodeBufferManager.cpp index d63ec3ef2..eee502364 100644 --- a/FEXCore/Source/Interface/Core/SharedCodeBufferManager.cpp +++ b/FEXCore/Source/Interface/Core/SharedCodeBufferManager.cpp @@ -16,7 +16,7 @@ static constexpr size_t INITIAL_CODE_SIZE = 1024 * 1024 * 16; // We don't want to move above 128MB atm because that means we will have to encode longer jumps static constexpr size_t MAX_CODE_SIZE = 1024 * 1024 * 128; -CodeBuffer::CodeBuffer(size_t Size) +CodeBuffer::CodeBuffer(size_t Size, bool ShouldBeNamed) : AllocatedSize(Size) { Ptr = static_cast(FEXCore::Allocator::VirtualAlloc(Size, true)); LOGMAN_THROW_A_FMT(!!Ptr, "Couldn't allocate code buffer"); @@ -28,7 +28,9 @@ CodeBuffer::CodeBuffer(size_t Size) LogMan::Msg::EFmt("Failed to mprotect last page of code buffer."); } - FEXCore::Allocator::VirtualName("FEXMemJIT", Ptr, Size); + if (ShouldBeNamed) { + FEXCore::Allocator::VirtualName("FEXMemJIT", Ptr, Size); + } // Huge-pages reduce the amount of iTLB misses dramatically when it works. FEXCore::Allocator::VirtualTHPControl(Ptr, Size, FEXCore::Allocator::THPControl::Enable); @@ -43,6 +45,17 @@ CodeBuffer::~CodeBuffer() { FEXCore::Allocator::VirtualFree(Ptr, AllocatedSize); } +SharedCodeBufferManager::SharedCodeBufferManager() { + FEX_CONFIG_OPT(GlobalJITNaming, GLOBALJITNAMING); + FEX_CONFIG_OPT(LibraryJITNaming, LIBRARYJITNAMING); + FEX_CONFIG_OPT(BlockJITNaming, BLOCKJITNAMING); + + // Only name the JIT buffers if perf JIT naming is disabled. + // `perf top` prefers VMA names over the JIT symbols file for some reason. + // Breaks memory tracking when naming is enabled, but it's a debug feature so it isn't expected to be enabled by default. + NameJITBuffers = !(GlobalJITNaming || LibraryJITNaming || BlockJITNaming); +} + fextl::shared_ptr SharedCodeBufferManager::AllocateNew(size_t Size) { #ifndef _WIN32 // MDWE (Memory-Deny-Write-Execute) is a new Linux 6.3 feature. @@ -66,7 +79,7 @@ fextl::shared_ptr SharedCodeBufferManager::AllocateNew(size_t Size) } #endif - auto Buffer = fextl::make_shared(Size); + auto Buffer = fextl::make_shared(Size, NameJITBuffers); Latest = Buffer; diff --git a/FEXCore/Source/Interface/Core/SharedCodeBufferManager.h b/FEXCore/Source/Interface/Core/SharedCodeBufferManager.h index c047eb847..be7de210b 100644 --- a/FEXCore/Source/Interface/Core/SharedCodeBufferManager.h +++ b/FEXCore/Source/Interface/Core/SharedCodeBufferManager.h @@ -23,7 +23,7 @@ namespace FEXCore::CPU { struct CodeBuffer { fextl::unique_ptr LookupCache; - CodeBuffer(size_t Size); + CodeBuffer(size_t Size, bool ShouldBeNamed); CodeBuffer(const CodeBuffer&) = delete; CodeBuffer& operator=(const CodeBuffer&) = delete; CodeBuffer(CodeBuffer&& oth) = delete; @@ -111,6 +111,7 @@ private: */ class SharedCodeBufferManager { public: + SharedCodeBufferManager(); virtual ~SharedCodeBufferManager() = default; // Get the CodeBuffer that was most recently allocated. @@ -131,5 +132,7 @@ private: fextl::shared_ptr Latest; fextl::shared_ptr AllocateNew(size_t Size); + + bool NameJITBuffers {true}; }; } // namespace FEXCore::CPU