mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-03-12 08:58:20 +03:00
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/ (cherry picked from commit 016e9d8d08ce66f5e81b42e0a0db398afc17336a) (cherry picked from commit fb7ec285c98d9eeaa69d1efda3e450e6f7207e57) (cherry picked from commit 02e50f7a4b53e56b051889b982fa43118c577493) (cherry picked from commit fc96019babd5658b140ea2f45bfda5fd101434c7)
This commit is contained in:
parent
00adef7226
commit
f8cf25286c
@ -533,6 +533,7 @@ decl_headers = '''
|
||||
#include <uchar.h>
|
||||
#include <sys/mount.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sched.h>
|
||||
'''
|
||||
|
||||
foreach decl : ['char16_t',
|
||||
@ -540,6 +541,7 @@ foreach decl : ['char16_t',
|
||||
'struct mount_attr',
|
||||
'struct statx',
|
||||
'struct dirent64',
|
||||
'struct sched_attr',
|
||||
]
|
||||
|
||||
# We get -1 if the size cannot be determined
|
||||
@ -585,6 +587,7 @@ foreach ident : [
|
||||
#include <unistd.h>'''], # no known header declares pivot_root
|
||||
['ioprio_get', '''#include <sched.h>'''], # no known header declares ioprio_get
|
||||
['ioprio_set', '''#include <sched.h>'''], # no known header declares ioprio_set
|
||||
['sched_setattr', '''#include <sched.h>'''], # no known header declares sched_setattr
|
||||
['name_to_handle_at', '''#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>'''],
|
||||
|
@ -1,6 +1,7 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
#pragma once
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <sched.h>
|
||||
|
||||
#ifndef CLONE_NEWCGROUP
|
||||
@ -24,3 +25,20 @@
|
||||
#ifndef TASK_COMM_LEN
|
||||
#define 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"
|
||||
|
||||
@ -613,3 +614,19 @@ static inline ssize_t missing_getdents64(int fd, void *buffer, size_t length) {
|
||||
|
||||
# define getdents64 missing_getdents64
|
||||
#endif
|
||||
|
||||
/* ======================================================================= */
|
||||
|
||||
#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
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <linux/sched.h>
|
||||
#include <poll.h>
|
||||
#include <sys/eventfd.h>
|
||||
#include <sys/file.h>
|
||||
@ -74,6 +75,7 @@
|
||||
#include "memory-util.h"
|
||||
#include "missing_fs.h"
|
||||
#include "missing_ioprio.h"
|
||||
#include "missing_sched.h"
|
||||
#include "mkdir-label.h"
|
||||
#include "mount-util.h"
|
||||
#include "mountpoint-util.h"
|
||||
@ -4585,15 +4587,14 @@ static int exec_child(
|
||||
}
|
||||
|
||||
if (context->cpu_sched_set) {
|
||||
struct sched_param param = {
|
||||
struct sched_attr attr = {
|
||||
.size = sizeof(attr),
|
||||
.sched_policy = context->cpu_sched_policy,
|
||||
.sched_priority = context->cpu_sched_priority,
|
||||
.sched_flags = context->cpu_sched_reset_on_fork ? SCHED_FLAG_RESET_ON_FORK : 0,
|
||||
};
|
||||
|
||||
r = sched_setscheduler(0,
|
||||
context->cpu_sched_policy |
|
||||
(context->cpu_sched_reset_on_fork ?
|
||||
SCHED_RESET_ON_FORK : 0),
|
||||
¶m);
|
||||
r = sched_setattr(/* pid= */ 0, &attr, /* flags= */ 0);
|
||||
if (r < 0) {
|
||||
*exit_status = EXIT_SETSCHEDULER;
|
||||
return log_unit_error_errno(unit, errno, "Failed to set up CPU scheduling: %m");
|
||||
|
Loading…
x
Reference in New Issue
Block a user