From 6d3052c5dd818e5c5e985f62e5276cf4aadafa8c Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Fri, 22 Apr 2022 20:57:22 +0300 Subject: [PATCH] Optimization: disable atomic_wait_engine notify callback for SPU Disable placebo callback calls in notify_all. Don't use callback at all if TSX. Based on kd-11 findings. --- rpcs3/Emu/CPU/CPUThread.cpp | 2 +- rpcs3/util/atomic.cpp | 10 ---------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index 7600b316aa..762c7895b8 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -446,7 +446,7 @@ void cpu_thread::operator()() // Register thread in g_cpu_array s_cpu_counter++; - atomic_wait_engine::set_notify_callback([](const void*, u64 progress) + atomic_wait_engine::set_notify_callback(g_use_rtm || id_type() != 1 /* PPU */ ? nullptr : +[](const void*, u64 progress) { static thread_local bool wait_set = false; diff --git a/rpcs3/util/atomic.cpp b/rpcs3/util/atomic.cpp index bbc775a443..bd9936cec3 100644 --- a/rpcs3/util/atomic.cpp +++ b/rpcs3/util/atomic.cpp @@ -1310,14 +1310,10 @@ void atomic_wait_engine::notify_one(const void* data, u32 size, u128 mask) if (s_tls_notify_cb) s_tls_notify_cb(data, 0); - u64 progress = 0; - root_info::slot_search(iptr, mask, [&](u32 cond_id) { if (alert_sema(cond_id, size, mask)) { - if (s_tls_notify_cb) - s_tls_notify_cb(data, ++progress); return true; } @@ -1335,8 +1331,6 @@ SAFE_BUFFERS(void) atomic_wait_engine::notify_all(const void* data, u32 size, u1 if (s_tls_notify_cb) s_tls_notify_cb(data, 0); - u64 progress = 0; - // Array count for batch notification u32 count = 0; @@ -1378,8 +1372,6 @@ SAFE_BUFFERS(void) atomic_wait_engine::notify_all(const void* data, u32 size, u1 { if (s_cond_list[cond_id].try_alert_native()) { - if (s_tls_notify_cb) - s_tls_notify_cb(data, ++progress); *(std::end(cond_ids) - i - 1) = ~cond_id; } } @@ -1394,8 +1386,6 @@ SAFE_BUFFERS(void) atomic_wait_engine::notify_all(const void* data, u32 size, u1 if (cond_id <= u16{umax}) { s_cond_list[cond_id].alert_native(); - if (s_tls_notify_cb) - s_tls_notify_cb(data, ++progress); *(std::end(cond_ids) - i - 1) = ~cond_id; } }