From 8163aaf7de3c9617dc7019b44c42b03484484e59 Mon Sep 17 00:00:00 2001 From: hoholee12 Date: Sun, 23 Jul 2023 22:52:23 +0900 Subject: [PATCH 1/9] 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()) From e5c1fea20a9f100591fc90f29c1429992bd0720b Mon Sep 17 00:00:00 2001 From: hoholee12 Date: Mon, 24 Jul 2023 00:26:13 +0900 Subject: [PATCH 2/9] oops --- rpcs3/Emu/CPU/CPUThread.cpp | 2 ++ rpcs3/Emu/Cell/PPUThread.cpp | 10 ++-------- rpcs3/Emu/Cell/SPURecompiler.cpp | 2 -- rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp | 6 ++---- rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp | 6 ++---- 5 files changed, 8 insertions(+), 18 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index d0cf1e100e..5384413847 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -479,6 +479,8 @@ namespace cpu_counter void cpu_thread::operator()() { + thread_ctrl::scoped_priority stock_prio(0); + const auto old_prefix = g_tls_log_prefix; g_tls_this_thread = this; diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index eb92f8e6f4..b86cde77b9 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -3413,10 +3413,8 @@ extern void ppu_precompile(std::vector& dir_queue, std::vector& dir_queue, std::vectorget().index), thread_count, [&]() { -#ifdef _WIN32 - // Set low priority - thread_ctrl::scoped_priority low_prio(-1); -#endif + // Set low priority + thread_ctrl::scoped_priority low_prio(-1); #ifdef __APPLE__ pthread_jit_write_protect_np(false); diff --git a/rpcs3/Emu/Cell/SPURecompiler.cpp b/rpcs3/Emu/Cell/SPURecompiler.cpp index 76ae5c0470..211805cc4d 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.cpp +++ b/rpcs3/Emu/Cell/SPURecompiler.cpp @@ -660,10 +660,8 @@ 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 6852214dbd..19dc24f81d 100644 --- a/rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp +++ b/rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp @@ -38,10 +38,8 @@ namespace gl void pipe_compiler::operator()() { -#ifndef _WIN32 - // Set low priority - thread_ctrl::scoped_priority low_prio(-1); -#endif + thread_ctrl::scoped_priority stock_prio(0); + 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 9e2f95277e..c34efeb7ae 100644 --- a/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp +++ b/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp @@ -32,10 +32,8 @@ namespace vk void pipe_compiler::operator()() { -#ifndef _WIN32 - // Set low priority - thread_ctrl::scoped_priority low_prio(-1); -#endif + thread_ctrl::scoped_priority stock_prio(0); + while (thread_ctrl::state() != thread_state::aborting) { for (auto&& job : m_work_queue.pop_all()) From cf785e2ad6c8ce57cc3517f3fbc6a9e4812ea063 Mon Sep 17 00:00:00 2001 From: hoholee12 Date: Mon, 24 Jul 2023 00:27:36 +0900 Subject: [PATCH 3/9] oops --- Utilities/Thread.cpp | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index 3a06ae8417..20c2761e96 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -3028,9 +3028,9 @@ void thread_ctrl::set_native_priority(int priority) { sig_log.error("SetThreadPriority() failed: %s", fmt::win_error{GetLastError(), nullptr}); } -#else +#elif defined(__linux__) // available niceness for nonroot: 0~19 - int linuxprio = 0; + int linuxprio = 9; id_t threadpid = gettid(); if (priority > 0) @@ -3045,10 +3045,21 @@ void thread_ctrl::set_native_priority(int priority) { sig_log.error("setpriority(%d, %d) failed: %d", threadpid, linuxprio, err); } - else - { - sig_log.success("setpriority(%d, %d) successful.", threadpid, linuxprio); - } + } +#else + int policy; + struct sched_param param; + + pthread_getschedparam(pthread_self(), &policy, ¶m); + + if (priority > 0) + param.sched_priority = sched_get_priority_max(policy); + if (priority < 0) + param.sched_priority = sched_get_priority_min(policy); + + if (int err = pthread_setschedparam(pthread_self(), policy, ¶m)) + { + sig_log.error("pthread_setschedparam() failed: %d", err); } #endif } From 3d1f52765229c47255063f7426b75a737ed446fd Mon Sep 17 00:00:00 2001 From: hoholee12 Date: Mon, 24 Jul 2023 23:26:47 +0900 Subject: [PATCH 4/9] FIx Cirrus Linux build not compiling --- Utilities/Thread.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index 20c2761e96..7d5db6effb 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -48,6 +48,8 @@ DYNAMIC_IMPORT_RENAME("Kernel32.dll", SetThreadDescriptionImport, "SetThreadDesc #ifdef __linux__ #include #include +#include +#define gettid() syscall(SYS_gettid) #endif #if defined(__APPLE__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) From db4c960a3b3bf288ce92414df707c1afc2154ce2 Mon Sep 17 00:00:00 2001 From: hoholee12 Date: Tue, 25 Jul 2023 15:52:59 +0900 Subject: [PATCH 5/9] Root user gets proper privilege --- rpcs3/Emu/CPU/CPUThread.cpp | 2 -- rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp | 4 +--- rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp | 2 -- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index 74f3f1e0bc..dd26620ab1 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -479,8 +479,6 @@ namespace cpu_counter void cpu_thread::operator()() { - thread_ctrl::scoped_priority stock_prio(0); - const auto old_prefix = g_tls_log_prefix; g_tls_this_thread = this; diff --git a/rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp b/rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp index 19dc24f81d..62576fc8ac 100644 --- a/rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp +++ b/rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp @@ -37,9 +37,7 @@ namespace gl } void pipe_compiler::operator()() - { - thread_ctrl::scoped_priority stock_prio(0); - + { 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 c34efeb7ae..f83d564393 100644 --- a/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp +++ b/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp @@ -32,8 +32,6 @@ namespace vk void pipe_compiler::operator()() { - thread_ctrl::scoped_priority stock_prio(0); - while (thread_ctrl::state() != thread_state::aborting) { for (auto&& job : m_work_queue.pop_all()) From 445bae198bf32086ab91df34e96c3267b0379b4b Mon Sep 17 00:00:00 2001 From: hoholee12 Date: Tue, 25 Jul 2023 15:53:40 +0900 Subject: [PATCH 6/9] Root user gets proper privilege --- Utilities/Thread.cpp | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index bbcf093e08..18042d2b61 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -3032,16 +3032,31 @@ void thread_ctrl::set_native_priority(int priority) } #elif defined(__linux__) // available niceness for nonroot: 0~19 - int linuxprio = 9; + // available niceness for root: -20~19 + + int linuxprio = 0; id_t threadpid = gettid(); - - if (priority > 0) + uid_t euid = geteuid(); + + if (euid == 0) + { linuxprio = 0; - else if (priority < 0) - linuxprio = 19; + if (priority > 0) + linuxprio = -6; + else if (priority < 0) + linuxprio = 6; + } + else + { + linuxprio = 6; + if (priority > 0) + linuxprio = 0; + else if (priority < 0) + linuxprio = 12; + } // nonroot cannot increase niceness value - if (getpriority(PRIO_PROCESS, threadpid) < linuxprio) + if ((getpriority(PRIO_PROCESS, threadpid) < linuxprio) || (euid == 0)) { if (int err = setpriority(PRIO_PROCESS, threadpid, linuxprio)) { From b9257cf0a3fca063b4f50bd3afd9db2c108aa018 Mon Sep 17 00:00:00 2001 From: hoholee12 Date: Tue, 25 Jul 2023 15:55:46 +0900 Subject: [PATCH 7/9] remove spaces --- rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp b/rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp index 62576fc8ac..ff20beb17f 100644 --- a/rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp +++ b/rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp @@ -37,7 +37,7 @@ namespace gl } void pipe_compiler::operator()() - { + { while (thread_ctrl::state() != thread_state::aborting) { for (auto&& job : m_work_queue.pop_all()) From 430085710859b8fb12c05261889e9b779b0dd242 Mon Sep 17 00:00:00 2001 From: hoholee12 Date: Tue, 25 Jul 2023 18:03:45 +0900 Subject: [PATCH 8/9] remove nonroot --- Utilities/Thread.cpp | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index 18042d2b61..47a1388f9d 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -3031,9 +3031,7 @@ void thread_ctrl::set_native_priority(int priority) sig_log.error("SetThreadPriority() failed: %s", fmt::win_error{GetLastError(), nullptr}); } #elif defined(__linux__) - // available niceness for nonroot: 0~19 // available niceness for root: -20~19 - int linuxprio = 0; id_t threadpid = gettid(); uid_t euid = geteuid(); @@ -3045,19 +3043,7 @@ void thread_ctrl::set_native_priority(int priority) linuxprio = -6; else if (priority < 0) linuxprio = 6; - } - else - { - linuxprio = 6; - if (priority > 0) - linuxprio = 0; - else if (priority < 0) - linuxprio = 12; - } - // nonroot cannot increase niceness value - if ((getpriority(PRIO_PROCESS, threadpid) < linuxprio) || (euid == 0)) - { if (int err = setpriority(PRIO_PROCESS, threadpid, linuxprio)) { sig_log.error("setpriority(%d, %d) failed: %d", threadpid, linuxprio, err); From 0ce786cd7807ed235069c6dc98ac3e5a94878b4e Mon Sep 17 00:00:00 2001 From: hoholee12 Date: Tue, 25 Jul 2023 20:21:16 +0900 Subject: [PATCH 9/9] fix --- Utilities/Thread.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index 47a1388f9d..6332b25d2f 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -3032,13 +3032,12 @@ void thread_ctrl::set_native_priority(int priority) } #elif defined(__linux__) // available niceness for root: -20~19 - int linuxprio = 0; id_t threadpid = gettid(); uid_t euid = geteuid(); if (euid == 0) { - linuxprio = 0; + int linuxprio = 0; if (priority > 0) linuxprio = -6; else if (priority < 0)