SPU: Exclude reservation_check address receptacle from writer_lock

This commit is contained in:
Elad 2025-10-31 15:49:16 +02:00
parent ddecade935
commit 1250e428a7
2 changed files with 9 additions and 2 deletions

View file

@ -4842,7 +4842,7 @@ bool spu_thread::reservation_check(u32 addr, const decltype(rdata)& data) const
// Ensure data is allocated (HACK: would raise LR event if not) // Ensure data is allocated (HACK: would raise LR event if not)
// Set range_lock first optimistically // Set range_lock first optimistically
range_lock->store(u64{128} << 32 | addr); range_lock->store(u64{128} << 32 | addr | vm::range_readable);
u64 lock_val = *std::prev(std::end(vm::g_range_lock_set)); u64 lock_val = *std::prev(std::end(vm::g_range_lock_set));
u64 old_lock = 0; u64 old_lock = 0;
@ -4923,7 +4923,7 @@ bool spu_thread::reservation_check(u32 addr, u32 hash, atomic_t<u64, 64>* range_
// Ensure data is allocated (HACK: would raise LR event if not) // Ensure data is allocated (HACK: would raise LR event if not)
// Set range_lock first optimistically // Set range_lock first optimistically
range_lock->store(u64{128} << 32 | addr); range_lock->store(u64{128} << 32 | addr | vm::range_readable);
u64 lock_val = *std::prev(std::end(vm::g_range_lock_set)); u64 lock_val = *std::prev(std::end(vm::g_range_lock_set));
u64 old_lock = 0; u64 old_lock = 0;

View file

@ -547,6 +547,13 @@ namespace vm
{ {
to_clear = for_all_range_locks(to_clear & ~get_range_lock_bits(true), [&](u64 addr2, u32 size2) to_clear = for_all_range_locks(to_clear & ~get_range_lock_bits(true), [&](u64 addr2, u32 size2)
{ {
constexpr u32 range_size_loc = vm::range_pos - 32;
if ((size2 >> range_size_loc) == (vm::range_readable >> vm::range_pos))
{
return 0;
}
// Split and check every 64K page separately // Split and check every 64K page separately
for (u64 hi = addr2 >> 16, max = (addr2 + size2 - 1) >> 16; hi <= max; hi++) for (u64 hi = addr2 >> 16, max = (addr2 + size2 - 1) >> 16; hi <= max; hi++)
{ {