From 72c794025973a56d491a2a275960bf7be55ab009 Mon Sep 17 00:00:00 2001 From: DH Date: Sun, 6 Aug 2023 17:18:40 +0300 Subject: [PATCH] [bridge] implement lazy cache lock --- hw/amdgpu/bridge/include/amdgpu/bridge/bridge.hpp | 2 ++ rpcsx-os/main.cpp | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/hw/amdgpu/bridge/include/amdgpu/bridge/bridge.hpp b/hw/amdgpu/bridge/include/amdgpu/bridge/bridge.hpp index e8e8852b6..8e8642981 100644 --- a/hw/amdgpu/bridge/include/amdgpu/bridge/bridge.hpp +++ b/hw/amdgpu/bridge/include/amdgpu/bridge/bridge.hpp @@ -45,6 +45,7 @@ enum { kPageWriteWatch = 1 << 0, kPageReadWriteLock = 1 << 1, kPageInvalidated = 1 << 2, + kPageLazyLock = 1 << 3 }; static constexpr auto kHostPageSize = 0x1000; @@ -71,6 +72,7 @@ struct BridgeHeader { // orbis::shared_mutex cacheCommandMtx; // orbis::shared_cv cacheCommandCv; std::atomic cacheCommands[4]; + std::atomic gpuCacheCommand; std::atomic cachePages[0x100'0000'0000 / kHostPageSize]; volatile std::uint64_t pull; diff --git a/rpcsx-os/main.cpp b/rpcsx-os/main.cpp index f69cb679e..89b8c5402 100644 --- a/rpcsx-os/main.cpp +++ b/rpcsx-os/main.cpp @@ -66,6 +66,18 @@ handle_signal(int sig, siginfo_t *info, void *ucontext) { auto flags = bridge->cachePages[page].load(std::memory_order::relaxed); if ((flags & amdgpu::bridge::kPageReadWriteLock) != 0) { + if ((flags & amdgpu::bridge::kPageLazyLock) != 0) { + if (std::uint32_t gpuCommand = 0; + !bridge->gpuCacheCommand.compare_exchange_weak(gpuCommand, + page)) { + continue; + } + + while (!bridge->cachePages[page].compare_exchange_weak( + flags, flags & ~amdgpu::bridge::kPageLazyLock, + std::memory_order::relaxed)) { + } + } continue; }