diff options
Diffstat (limited to 'community/rtkit/sched_getscheduler_sched_setscheduler.patch')
-rw-r--r-- | community/rtkit/sched_getscheduler_sched_setscheduler.patch | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/community/rtkit/sched_getscheduler_sched_setscheduler.patch b/community/rtkit/sched_getscheduler_sched_setscheduler.patch new file mode 100644 index 00000000000..a09bd300f90 --- /dev/null +++ b/community/rtkit/sched_getscheduler_sched_setscheduler.patch @@ -0,0 +1,91 @@ +Provide thin stubs for the sched_getscheduler() and sched_getscheduler() +syscalls, as musl has dropped their implementation. The thin stubs are exactly +what glibc does and what rtkit expects. +--- rtkit-0.13.orig/rtkit-daemon.c ++++ rtkit-0.13/rtkit-daemon.c +@@ -32,6 +32,7 @@ + #include <sys/stat.h> + #include <string.h> + #include <sched.h> ++#include <syscall.h> + #include <sys/time.h> + #include <sys/resource.h> + #include <stdlib.h> +@@ -196,6 +197,14 @@ + static pthread_t canary_thread_id = 0, watchdog_thread_id = 0; + static volatile uint32_t refuse_until = 0; + ++static int _sched_setscheduler(pid_t pid, int sched, const struct sched_param *param) { ++ return syscall(SYS_sched_setscheduler, pid, sched, param); ++} ++ ++static int _sched_getscheduler(pid_t pid) { ++ return syscall(SYS_sched_getscheduler, pid); ++} ++ + static const char *get_proc_path(void) { + /* Useful for chroot environments */ + +@@ -439,7 +448,7 @@ + if (st != t->starttime) + return FALSE; + +- if ((r = sched_getscheduler(t->pid)) < 0) { ++ if ((r = _sched_getscheduler(t->pid)) < 0) { + + /* Maybe it died right now? */ + if (errno == ESRCH) +@@ -564,7 +573,7 @@ + memset(¶m, 0, sizeof(param)); + param.sched_priority = priority; + +- if (sched_setscheduler(0, sched_policy|SCHED_RESET_ON_FORK, ¶m) < 0) { ++ if (_sched_setscheduler(0, sched_policy|SCHED_RESET_ON_FORK, ¶m) < 0) { + r = -errno; + syslog(LOG_ERR, "Failed to make ourselves RT: %s\n", strerror(errno)); + goto finish; +@@ -581,7 +590,7 @@ + + memset(¶m, 0, sizeof(param)); + +- if (sched_setscheduler(0, SCHED_OTHER, ¶m) < 0) ++ if (_sched_setscheduler(0, SCHED_OTHER, ¶m) < 0) + syslog(LOG_WARNING, "Warning: Failed to reset scheduling to SCHED_OTHER: %s\n", strerror(errno)); + + if (setpriority(PRIO_PROCESS, 0, nice_level) < 0) +@@ -696,7 +705,7 @@ + memset(¶m, 0, sizeof(param)); + param.sched_priority = 0; + +- if (sched_setscheduler(tid, SCHED_OTHER, ¶m) < 0) { ++ if (_sched_setscheduler(tid, SCHED_OTHER, ¶m) < 0) { + if (errno != ESRCH) + syslog(LOG_WARNING, "Warning: Failed to reset scheduling to SCHED_OTHER for thread %llu: %s\n", (unsigned long long) tid, strerror(errno)); + r = -1; +@@ -748,7 +757,7 @@ + /* Ok, everything seems to be in order, now, let's do it */ + memset(¶m, 0, sizeof(param)); + param.sched_priority = (int) priority; +- if (sched_setscheduler(t->pid, sched_policy|SCHED_RESET_ON_FORK, ¶m) < 0) { ++ if (_sched_setscheduler(t->pid, sched_policy|SCHED_RESET_ON_FORK, ¶m) < 0) { + r = -errno; + syslog(LOG_ERR, "Failed to make thread %llu RT: %s\n", (unsigned long long) t->pid, strerror(errno)); + goto finish; +@@ -809,7 +818,7 @@ + /* Ok, everything seems to be in order, now, let's do it */ + memset(¶m, 0, sizeof(param)); + param.sched_priority = 0; +- if (sched_setscheduler(t->pid, SCHED_OTHER|SCHED_RESET_ON_FORK, ¶m) < 0) { ++ if (_sched_setscheduler(t->pid, SCHED_OTHER|SCHED_RESET_ON_FORK, ¶m) < 0) { + r = -errno; + syslog(LOG_ERR, "Failed to make process %llu SCHED_NORMAL: %s\n", (unsigned long long) t->pid, strerror(errno)); + goto finish; +@@ -943,7 +952,7 @@ + if (errno != 0 || !e || *e != 0) + continue; + +- if ((r = sched_getscheduler(tid)) < 0) { ++ if ((r = _sched_getscheduler(tid)) < 0) { + if (errno != ESRCH) + syslog(LOG_WARNING, "Warning: sched_getscheduler() failed: %s\n", strerror(errno)); + continue; |