From ace62311f860c811edde3f7cb921885e3a9f0c26 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 16 Jan 2026 08:46:20 +0000 Subject: [PATCH] extra buffer precautions to not exhaust DMem, format better + perf history nerf --- CMakeLists.txt | 10 ++++++--- src/common/fiber.cpp | 3 --- src/common/virtual_buffer.cpp | 40 +++++++++++------------------------ src/core/perf_stats.h | 4 ++++ 4 files changed, 23 insertions(+), 34 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b8daf74ce2..dfb862cdc5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -261,9 +261,13 @@ endif() option(ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${DEFAULT_ENABLE_OPENSSL}) -set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL OFF) -if (EXT_DEFAULT OR PLATFORM_SUN) - set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL ON) +if (ENABLE_OPENSSL) + set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL OFF) + if (EXT_DEFAULT OR PLATFORM_SUN) + set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL ON) + endif() +else() + set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL OFF) endif() cmake_dependent_option(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" ${DEFAULT_YUZU_USE_BUNDLED_OPENSSL} "ENABLE_OPENSSL" OFF) diff --git a/src/common/fiber.cpp b/src/common/fiber.cpp index 1b201c47af..69eca732eb 100644 --- a/src/common/fiber.cpp +++ b/src/common/fiber.cpp @@ -33,9 +33,6 @@ struct Fiber::FiberImpl { boost::context::detail::fcontext_t context{}; boost::context::detail::fcontext_t rewind_context{}; - boost::context::detail::fcontext_t context{}; - boost::context::detail::fcontext_t rewind_context{}; - std::mutex guard; std::function entry_point; std::function rewind_point; diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index 407bf2e157..5b9764d236 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -111,15 +111,15 @@ static void SwapHandler(int sig, void* raw_context) { if (auto const it = std::ranges::find_if(swap_regions, [addr = mctx.mc_addr](auto const& e) { return uintptr_t(addr) >= uintptr_t(e.first) && uintptr_t(addr) < uintptr_t(e.first) + e.second; }); it != swap_regions.end()) { - size_t const page_size = 4096 * 8; + size_t const page_size = 4096 * 4; //16K size_t const page_mask = ~(page_size - 1); // should replace the existing mapping... ugh void* aligned_addr = reinterpret_cast(uintptr_t(mctx.mc_addr) & page_mask); void* res = mmap(aligned_addr, page_size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); if (res == MAP_FAILED) { - LOG_ERROR(HW_Memory, "FAIL mapped addr {},{} @ {}:{}", mctx.mc_addr, aligned_addr, it->first, it->second); + LOG_ERROR(HW_Memory, "{},{} @ {}:{}", mctx.mc_addr, aligned_addr, it->first, it->second); } else { - LOG_INFO(HW_Memory, "OK mapped addr {},{} @ {}:{}", mctx.mc_addr, aligned_addr, it->first, it->second); + LOG_TRACE(HW_Memory, "{},{} @ {}:{}", mctx.mc_addr, aligned_addr, it->first, it->second); } } else { LOG_ERROR(HW_Memory, "fault in addr {:#x} at {:#x}", mctx.mc_addr, mctx.mc_rip); // print caller address @@ -133,36 +133,20 @@ void InitSwap() noexcept { void InitSwap() noexcept {} #endif -static const char *swapfile_names[] { - "/data/eden/games/swap0.bin", - "/data/eden/games/swap1.bin", - "/data/eden/games/swap2.bin", - "/data/eden/games/swap3.bin", - "/data/eden/games/swap4.bin" -}; -static size_t swapfile_count = 0; - void* AllocateMemoryPages(std::size_t size) noexcept { #ifdef _WIN32 void* addr = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); ASSERT(addr != nullptr); #elif defined(__OPENORBIS__) - void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); - if (addr == MAP_FAILED) { - LOG_WARNING(HW_Memory, "failed to mmap({} bytes) using swapfile {}", size, swapfile_names[swapfile_count]); - // int fd = open(swapfile_names[swapfile_count], O_TRUNC | O_RDWR | O_CREAT, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH); - // ASSERT(fd > 0); - // ftruncate(fd, size); - // addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); - // ASSERT(addr != MAP_FAILED); - // ++swapfile_count; - - addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_VOID | MAP_PRIVATE, -1, 0); - ASSERT(addr != MAP_FAILED); - swap_regions.emplace_back(addr, size); - } else { - LOG_INFO(HW_Memory, "mmap {} bytes", size); - } + // void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); + // if (addr == MAP_FAILED) { + LOG_WARNING(HW_Memory, "Using VoidMem for {}B area", size); + void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_VOID | MAP_PRIVATE, -1, 0); + ASSERT(addr != MAP_FAILED); + swap_regions.emplace_back(addr, size); + // } else { + // LOG_INFO(HW_Memory, "mmap {} bytes", size); + // } #else void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); ASSERT(addr != MAP_FAILED); diff --git a/src/core/perf_stats.h b/src/core/perf_stats.h index dd6becc02d..92910a959f 100644 --- a/src/core/perf_stats.h +++ b/src/core/perf_stats.h @@ -60,7 +60,11 @@ private: std::size_t current_index{0}; /// Stores an hour of historical frametime data useful for processing and tracking performance /// regressions with code changes. +#ifdef __OPENORBIS__ + std::array perf_history{}; +#else std::array perf_history{}; +#endif /// Point when the cumulative counters were reset Clock::time_point reset_point = Clock::now();