From 8588b2b11acf390ba7bbcea33c7de8c882f6c903 Mon Sep 17 00:00:00 2001 From: Eladash <18193363+elad335@users.noreply.github.com> Date: Wed, 27 Mar 2024 10:36:00 +0200 Subject: [PATCH] vm: Fix writer lock leak --- rpcs3/Emu/Cell/PPUThread.cpp | 34 +++++++++++++++++++--------------- rpcs3/Emu/Cell/SPUThread.cpp | 5 ----- rpcs3/Emu/Memory/vm.cpp | 6 +++--- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index fb2f1dc666..6fcf32c454 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -3376,25 +3376,29 @@ static bool ppu_store_reservation(ppu_thread& ppu, u32 addr, u64 reg_value) //auto& cline_data = vm::_ref(addr); data += 0; - rsx::reservation_lock rsx_lock(addr, 128); - - auto& super_data = *vm::get_super_ptr(addr); - const bool success = [&]() + auto range_lock = vm::alloc_range_lock(); { - // Full lock (heavyweight) - // TODO: vm::check_addr - vm::writer_lock lock(addr); + rsx::reservation_lock rsx_lock(addr, 128); - if (cmp_rdata(ppu.rdata, super_data)) + auto& super_data = *vm::get_super_ptr(addr); + const bool success = [&]() { - data.release(new_data); - res += 64; - return true; - } + // Full lock (heavyweight) + // TODO: vm::check_addr + vm::writer_lock lock(addr, range_lock); - res -= 64; - return false; - }(); + if (cmp_rdata(ppu.rdata, super_data)) + { + data.release(new_data); + res += 64; + return true; + } + + res -= 64; + return false; + }(); + } + vm::free_range_lock(range_lock); return success; } diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index f9d9ab3906..1f02b7b2c5 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -448,11 +448,6 @@ namespace vm { if (range_lock) { - if (!*range_lock) - { - return; - } - g_range_lock_bits[1] &= ~(1ull << (range_lock - g_range_lock_set)); range_lock->release(0); return; diff --git a/rpcs3/Emu/Memory/vm.cpp b/rpcs3/Emu/Memory/vm.cpp index eb16be6123..429b947763 100644 --- a/rpcs3/Emu/Memory/vm.cpp +++ b/rpcs3/Emu/Memory/vm.cpp @@ -473,13 +473,13 @@ namespace vm } } - bool to_prepare_memory = addr >= 0x10000; + bool to_prepare_memory = true; for (u64 i = 0;; i++) { auto& bits = get_range_lock_bits(true); - if (!range_lock || addr < 0x10000) + if (!range_lock) { if (!bits && bits.compare_and_swap_test(0, u64{umax})) { @@ -521,7 +521,7 @@ namespace vm } } - if (addr >= 0x10000) + if (range_lock) { perf_meter<"SUSPEND"_u64> perf0;