core/exec-invoke: use sched_setattr instead of sched_setscheduler
The kernel's sched_setattr interface allows for more control over a processes scheduling attributes as the previously used sched_setscheduler interface. Using sched_setattr is also the prerequisite for support of utilization clamping (UCLAMP [1], see #26705) and allows to set sched_runtime. The latter, sched_runtime, will probably become a relevant scheduling parameter of the EEVDF scheduler [2, 3], and therefore will not only apply to processes scheduled via SCHED_DEADLINE, but also for processes scheduled via SCHED_OTHER/SCHED_BATCH (i.e., most processes). 1: https://docs.kernel.org/next/scheduler/sched-util-clamp.html 2: https://lwn.net/Articles/969062/ 3: https://lwn.net/ml/linux-kernel/20240405110010.934104715@infradead.org/
This commit is contained in:
committed by
Luca Boccassi
parent
0828c6a2bf
commit
016e9d8d08
@@ -1,6 +1,7 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
#pragma once
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <sched.h>
|
||||
|
||||
#include "macro.h"
|
||||
@@ -35,3 +36,20 @@ assert_cc(PF_KTHREAD == 0x00200000);
|
||||
#else
|
||||
assert_cc(TASK_COMM_LEN == 16);
|
||||
#endif
|
||||
|
||||
#if !HAVE_STRUCT_SCHED_ATTR
|
||||
struct sched_attr {
|
||||
__u32 size; /* Size of this structure */
|
||||
__u32 sched_policy; /* Policy (SCHED_*) */
|
||||
__u64 sched_flags; /* Flags */
|
||||
__s32 sched_nice; /* Nice value (SCHED_OTHER,
|
||||
SCHED_BATCH) */
|
||||
__u32 sched_priority; /* Static priority (SCHED_FIFO,
|
||||
SCHED_RR) */
|
||||
/* Remaining fields are for SCHED_DEADLINE
|
||||
and potentially soon for SCHED_OTHER/SCHED_BATCH */
|
||||
__u64 sched_runtime;
|
||||
__u64 sched_deadline;
|
||||
__u64 sched_period;
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#include "macro.h"
|
||||
#include "missing_keyctl.h"
|
||||
#include "missing_sched.h"
|
||||
#include "missing_stat.h"
|
||||
#include "missing_syscall_def.h"
|
||||
|
||||
@@ -667,6 +668,22 @@ static inline ssize_t missing_getdents64(int fd, void *buffer, size_t length) {
|
||||
|
||||
/* ======================================================================= */
|
||||
|
||||
#if !HAVE_SCHED_SETATTR
|
||||
|
||||
static inline ssize_t missing_sched_setattr(pid_t pid, struct sched_attr *attr, unsigned int flags) {
|
||||
# if defined __NR_sched_setattr
|
||||
return syscall(__NR_sched_setattr, pid, attr, flags);
|
||||
# else
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
# endif
|
||||
}
|
||||
|
||||
# define sched_setattr missing_sched_setattr
|
||||
#endif
|
||||
|
||||
/* ======================================================================= */
|
||||
|
||||
/* glibc does not provide clone() on ia64, only clone2(). Not only that, but it also doesn't provide a
|
||||
* prototype, only the symbol in the shared library (it provides a prototype for clone(), but not the
|
||||
* symbol in the shared library). */
|
||||
|
||||
Reference in New Issue
Block a user