From 8163aaf7de3c9617dc7019b44c42b03484484e59 Mon Sep 17 00:00:00 2001 From: hoholee12 Date: Sun, 23 Jul 2023 22:52:23 +0900 Subject: [PATCH] Linux: fix thread priority --- Utilities/Thread.cpp | 27 ++++++++++++++++--------- rpcs3/Emu/Cell/PPUThread.cpp | 10 +++++++-- rpcs3/Emu/Cell/SPURecompiler.cpp | 2 ++ rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp | 4 ++++ rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp | 4 ++++ 5 files changed, 35 insertions(+), 12 deletions(-) diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index 1fa5c301fd..3a06ae8417 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -3029,19 +3029,26 @@ void thread_ctrl::set_native_priority(int priority) sig_log.error("SetThreadPriority() failed: %s", fmt::win_error{GetLastError(), nullptr}); } #else - int policy; - struct sched_param param; - - pthread_getschedparam(pthread_self(), &policy, ¶m); - + // available niceness for nonroot: 0~19 + int linuxprio = 0; + id_t threadpid = gettid(); + if (priority > 0) - param.sched_priority = sched_get_priority_max(policy); - if (priority < 0) - param.sched_priority = sched_get_priority_min(policy); + linuxprio = 0; + else if (priority < 0) + linuxprio = 19; - if (int err = pthread_setschedparam(pthread_self(), policy, ¶m)) + // nonroot cannot increase niceness value + if (getpriority(PRIO_PROCESS, threadpid) < linuxprio) { - sig_log.error("pthread_setschedparam() failed: %d", err); + if (int err = setpriority(PRIO_PROCESS, threadpid, linuxprio)) + { + sig_log.error("setpriority(%d, %d) failed: %d", threadpid, linuxprio, err); + } + else + { + sig_log.success("setpriority(%d, %d) successful.", threadpid, linuxprio); + } } #endif } diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index b86cde77b9..eb92f8e6f4 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -3413,8 +3413,10 @@ extern void ppu_precompile(std::vector& dir_queue, std::vector& dir_queue, std::vectorget().index), thread_count, [&]() { - // Set low priority - thread_ctrl::scoped_priority low_prio(-1); +#ifdef _WIN32 + // Set low priority + thread_ctrl::scoped_priority low_prio(-1); +#endif #ifdef __APPLE__ pthread_jit_write_protect_np(false); diff --git a/rpcs3/Emu/Cell/SPURecompiler.cpp b/rpcs3/Emu/Cell/SPURecompiler.cpp index 211805cc4d..76ae5c0470 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.cpp +++ b/rpcs3/Emu/Cell/SPURecompiler.cpp @@ -660,8 +660,10 @@ void spu_cache::initialize() #ifdef __APPLE__ pthread_jit_write_protect_np(false); #endif +#ifdef _WIN32 // Set low priority thread_ctrl::scoped_priority low_prio(-1); +#endif // Initialize compiler instances for parallel compilation std::unique_ptr compiler; diff --git a/rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp b/rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp index ff20beb17f..6852214dbd 100644 --- a/rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp +++ b/rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp @@ -38,6 +38,10 @@ namespace gl void pipe_compiler::operator()() { +#ifndef _WIN32 + // Set low priority + thread_ctrl::scoped_priority low_prio(-1); +#endif while (thread_ctrl::state() != thread_state::aborting) { for (auto&& job : m_work_queue.pop_all()) diff --git a/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp b/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp index f83d564393..9e2f95277e 100644 --- a/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp +++ b/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp @@ -32,6 +32,10 @@ namespace vk void pipe_compiler::operator()() { +#ifndef _WIN32 + // Set low priority + thread_ctrl::scoped_priority low_prio(-1); +#endif while (thread_ctrl::state() != thread_state::aborting) { for (auto&& job : m_work_queue.pop_all())