From 9295f7e4c7c54088a6b87bab628a0b6350fb14ba Mon Sep 17 00:00:00 2001 From: Yuxuan Shui Date: Sat, 24 Jun 2023 02:49:20 +0100 Subject: [PATCH 1/3] core: don't check RLIMIT_RTPRIO FreeBSD doesn't have RLIMIT_RTPRIO. So instead we skip this check and just always try to set our priority to the lowest SCHED_RR priority available. Fixes #1082 Signed-off-by: Yuxuan Shui --- src/picom.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/picom.c b/src/picom.c index 8a58fe5..9ddb49d 100644 --- a/src/picom.c +++ b/src/picom.c @@ -2577,11 +2577,8 @@ err: 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 priority = sched_get_priority_min(SCHED_RR); + int old_policy; int ret; struct sched_param param; @@ -2592,14 +2589,15 @@ void set_rr_scheduling(void) { return; } - param.sched_priority = (int)rlim.rlim_cur; - + param.sched_priority = priority; ret = pthread_setschedparam(pthread_self(), SCHED_RR, ¶m); if (ret != 0) { - log_info("Failed to set scheduling priority to %lu", rlim.rlim_cur); + log_info("Failed to set real-time scheduling priority to %d. Consider " + "giving picom the CAP_SYS_NICE capability", + priority); return; } - log_info("Set scheduling priority to %lu", rlim.rlim_cur); + log_info("Set real-time scheduling priority to %d", priority); } /** From e0c14f63c6b2691c2cf8adb2a8e83944f6531833 Mon Sep 17 00:00:00 2001 From: Yuxuan Shui Date: Sat, 24 Jun 2023 02:59:04 +0100 Subject: [PATCH 2/3] core: don't use pthread functions Don't use pthread_{set,get}schedparam, which requires -lpthread. Use sched_setscheduler/sched_getparam instead, which is provided by libc. Signed-off-by: Yuxuan Shui --- src/picom.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/picom.c b/src/picom.c index 9ddb49d..c07626b 100644 --- a/src/picom.c +++ b/src/picom.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -2579,18 +2580,17 @@ err: void set_rr_scheduling(void) { int priority = sched_get_priority_min(SCHED_RR); - int old_policy; int ret; struct sched_param param; - ret = pthread_getschedparam(pthread_self(), &old_policy, ¶m); + ret = sched_getparam(0, ¶m); if (ret != 0) { log_debug("Failed to get old scheduling priority"); return; } param.sched_priority = priority; - ret = pthread_setschedparam(pthread_self(), SCHED_RR, ¶m); + ret = sched_setscheduler(0, SCHED_RR, ¶m); if (ret != 0) { log_info("Failed to set real-time scheduling priority to %d. Consider " "giving picom the CAP_SYS_NICE capability", From f8cdc81635a0405693beb7c802119acbbc426968 Mon Sep 17 00:00:00 2001 From: Yuxuan Shui Date: Mon, 26 Jun 2023 13:25:53 +0100 Subject: [PATCH 3/3] core: add comment to set_rr_scheduling Signed-off-by: Yuxuan Shui --- src/picom.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/picom.c b/src/picom.c index c07626b..126922e 100644 --- a/src/picom.c +++ b/src/picom.c @@ -2577,6 +2577,14 @@ err: free(ps); return NULL; } + +/// Switch to real-time scheduling policy (SCHED_RR) if possible +/// +/// Make picom realtime to reduce latency, and make rendering times more predictable to +/// help pacing. +/// +/// This requires the user to set up permissions for the real-time scheduling. e.g. by +/// setting `ulimit -r`, or giving us the CAP_SYS_NICE capability. void set_rr_scheduling(void) { int priority = sched_get_priority_min(SCHED_RR);