From 7d9692360b2eaa2068a465819905f3322f9d57fa Mon Sep 17 00:00:00 2001 From: Yuxuan Shui Date: Sat, 10 Jun 2023 14:18:25 +0100 Subject: [PATCH] core: use SCHED_RR scheduling Make picom realtime to reduce latency, and make rendering times more predictable to help pacing. Signed-off-by: Yuxuan Shui --- src/picom.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/picom.c b/src/picom.c index 36c8a34a..d6b52b58 100644 --- a/src/picom.c +++ b/src/picom.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -2553,6 +2554,31 @@ err: free(ps); return NULL; } +void set_rr_scheduling(void) { + struct rlimit rlim; + if (getrlimit(RLIMIT_RTPRIO, &rlim) != 0) { + log_warn("Failed to get RLIMIT_RTPRIO, not setting real-time priority"); + return; + } + int old_policy; + int ret; + struct sched_param param; + + ret = pthread_getschedparam(pthread_self(), &old_policy, ¶m); + if (ret != 0) { + log_debug("Failed to get old scheduling priority"); + return; + } + + param.sched_priority = (int)rlim.rlim_cur; + + ret = pthread_setschedparam(pthread_self(), SCHED_RR, ¶m); + if (ret != 0) { + log_info("Failed to set scheduling priority to %lu", rlim.rlim_cur); + return; + } + log_info("Set scheduling priority to %lu", rlim.rlim_cur); +} /** * Destroy a session. @@ -2760,6 +2786,7 @@ static void session_destroy(session_t *ps) { * @param ps current session */ static void session_run(session_t *ps) { + set_rr_scheduling(); // In benchmark mode, we want draw_timer handler to always be active if (ps->o.benchmark) { ev_timer_set(&ps->draw_timer, 0, 0);