diff --git a/meson.build b/meson.build index 1c64547628..30609f8515 100644 --- a/meson.build +++ b/meson.build @@ -501,6 +501,8 @@ foreach ident : [ #include '''], ['pivot_root', '''#include #include '''], # no known header declares pivot_root + ['ioprio_get', '''#include '''], # no known header declares ioprio_get + ['ioprio_set', '''#include '''], # no known header declares ioprio_set ['name_to_handle_at', '''#include #include #include '''], diff --git a/src/basic/ioprio.h b/src/basic/ioprio.h deleted file mode 100644 index 3fb168dafe..0000000000 --- a/src/basic/ioprio.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef IOPRIO_H -#define IOPRIO_H - -/* This is minimal version of Linux' linux/ioprio.h header file, which - * is licensed GPL2 */ - -#include -#include - -/* - * Gives us 8 prio classes with 13-bits of data for each class - */ -#define IOPRIO_BITS 16 -#define IOPRIO_N_CLASSES 8 -#define IOPRIO_CLASS_SHIFT 13 -#define IOPRIO_PRIO_MASK ((1UL << IOPRIO_CLASS_SHIFT) - 1) - -#define IOPRIO_PRIO_CLASS(mask) ((mask) >> IOPRIO_CLASS_SHIFT) -#define IOPRIO_PRIO_DATA(mask) ((mask) & IOPRIO_PRIO_MASK) -#define IOPRIO_PRIO_VALUE(class, data) (((class) << IOPRIO_CLASS_SHIFT) | data) - -#define ioprio_valid(mask) (IOPRIO_PRIO_CLASS((mask)) != IOPRIO_CLASS_NONE) - -/* - * These are the io priority groups as implemented by CFQ. RT is the realtime - * class, it always gets premium service. BE is the best-effort scheduling - * class, the default for any process. IDLE is the idle scheduling class, it - * is only served when no one else is using the disk. - */ -enum { - IOPRIO_CLASS_NONE, - IOPRIO_CLASS_RT, - IOPRIO_CLASS_BE, - IOPRIO_CLASS_IDLE, -}; - -/* - * 8 best effort priority levels are supported - */ -#define IOPRIO_BE_NR (8) - -enum { - IOPRIO_WHO_PROCESS = 1, - IOPRIO_WHO_PGRP, - IOPRIO_WHO_USER, -}; - -static inline int ioprio_set(int which, int who, int ioprio) { - return syscall(__NR_ioprio_set, which, who, ioprio); -} - -static inline int ioprio_get(int which, int who) { - return syscall(__NR_ioprio_get, which, who); -} - -#endif diff --git a/src/basic/limits-util.c b/src/basic/limits-util.c index 9f8e26d46a..78e7cb39ee 100644 --- a/src/basic/limits-util.c +++ b/src/basic/limits-util.c @@ -1,5 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include + #include "alloc-util.h" #include "cgroup-util.h" #include "limits-util.h" diff --git a/src/basic/meson.build b/src/basic/meson.build index 8fe53b2093..137609f86e 100644 --- a/src/basic/meson.build +++ b/src/basic/meson.build @@ -72,7 +72,6 @@ basic_sources = files(''' in-addr-util.h io-util.c io-util.h - ioprio.h khash.c khash.h limits-util.c @@ -131,6 +130,7 @@ basic_sources = files(''' missing_fcntl.h missing_fs.h missing_input.h + missing_ioprio.h missing_keyctl.h missing_magic.h missing_mman.h diff --git a/src/basic/missing_ioprio.h b/src/basic/missing_ioprio.h new file mode 100644 index 0000000000..9cbd17279f --- /dev/null +++ b/src/basic/missing_ioprio.h @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include + +/* Match values uses by the kernel internally, as no public header seems to exist. */ + +#ifndef IOPRIO_N_CLASSES +# define IOPRIO_N_CLASSES 8 +#endif + +#ifndef IOPRIO_BE_NR +# define IOPRIO_BE_NR 8 +#endif + +#ifndef IOPRIO_CLASS_NONE +# define IOPRIO_CLASS_NONE 0 +#endif +#ifndef IOPRIO_CLASS_RT +# define IOPRIO_CLASS_RT 1 +#endif +#ifndef IOPRIO_CLASS_BE +# define IOPRIO_CLASS_BE 2 +#endif +#ifndef IOPRIO_CLASS_IDLE +# define IOPRIO_CLASS_IDLE 3 +#endif + +#ifndef IOPRIO_WHO_PROCESS +# define IOPRIO_WHO_PROCESS 1 +#endif +#ifndef IOPRIO_WHO_PGRP +# define IOPRIO_WHO_PGRP 2 +#endif +#ifndef IOPRIO_WHO_USER +# define IOPRIO_WHO_USER 3 +#endif + +#ifndef IOPRIO_BITS +# define IOPRIO_BITS 16 +#endif +#ifndef IOPRIO_N_CLASSES +# define IOPRIO_N_CLASSES 8 +#endif +#ifndef IOPRIO_CLASS_SHIFT +# define IOPRIO_CLASS_SHIFT 13 +#endif + +static inline int ioprio_prio_class(int value) { + return value >> IOPRIO_CLASS_SHIFT; +} + +static inline int ioprio_prio_data(int value) { + return value & ((1 << IOPRIO_CLASS_SHIFT) - 1); +} + +static inline int ioprio_prio_value(int class, int data) { + return (class << IOPRIO_CLASS_SHIFT) | data; +} diff --git a/src/basic/missing_syscall.h b/src/basic/missing_syscall.h index 9e3a165857..57dae77b53 100644 --- a/src/basic/missing_syscall.h +++ b/src/basic/missing_syscall.h @@ -41,6 +41,26 @@ static inline int missing_pivot_root(const char *new_root, const char *put_old) /* ======================================================================= */ +#if !HAVE_IOPRIO_GET +static inline int missing_ioprio_get(int which, int who) { + return syscall(__NR_ioprio_get, which, who); +} + +# define ioprio_get missing_ioprio_get +#endif + +/* ======================================================================= */ + +#if !HAVE_IOPRIO_SET +static inline int missing_ioprio_set(int which, int who, int ioprio) { + return syscall(__NR_ioprio_set, which, who, ioprio); +} + +# define ioprio_set missing_ioprio_set +#endif + +/* ======================================================================= */ + #if !HAVE_MEMFD_CREATE static inline int missing_memfd_create(const char *name, unsigned int flags) { # ifdef __NR_memfd_create diff --git a/src/basic/process-util.c b/src/basic/process-util.c index 5855ac3d57..c424f62ef3 100644 --- a/src/basic/process-util.c +++ b/src/basic/process-util.c @@ -27,7 +27,6 @@ #include "fd-util.h" #include "fileio.h" #include "fs-util.h" -#include "ioprio.h" #include "locale-util.h" #include "log.h" #include "macro.h" diff --git a/src/basic/process-util.h b/src/basic/process-util.h index c953649502..551b236c01 100644 --- a/src/basic/process-util.h +++ b/src/basic/process-util.h @@ -13,8 +13,8 @@ #include "alloc-util.h" #include "format-util.h" -#include "ioprio.h" #include "macro.h" +#include "missing_ioprio.h" #include "time-util.h" #define procfs_file_alloca(pid, field) \ diff --git a/src/basic/procfs-util.c b/src/basic/procfs-util.c index 9234ccaf85..f076ad097e 100644 --- a/src/basic/procfs-util.c +++ b/src/basic/procfs-util.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include +#include #include "alloc-util.h" #include "def.h" diff --git a/src/core/dbus-execute.c b/src/core/dbus-execute.c index 5ea97b9194..13a64809e0 100644 --- a/src/core/dbus-execute.c +++ b/src/core/dbus-execute.c @@ -24,8 +24,8 @@ #include "fileio.h" #include "hexdecoct.h" #include "io-util.h" -#include "ioprio.h" #include "journal-file.h" +#include "missing_ioprio.h" #include "mountpoint-util.h" #include "namespace.h" #include "parse-util.h" @@ -55,8 +55,8 @@ static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_protect_system, protect_system, static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_personality, personality, unsigned long); static BUS_DEFINE_PROPERTY_GET(property_get_ioprio, "i", ExecContext, exec_context_get_effective_ioprio); static BUS_DEFINE_PROPERTY_GET(property_get_mount_apivfs, "b", ExecContext, exec_context_get_effective_mount_apivfs); -static BUS_DEFINE_PROPERTY_GET2(property_get_ioprio_class, "i", ExecContext, exec_context_get_effective_ioprio, IOPRIO_PRIO_CLASS); -static BUS_DEFINE_PROPERTY_GET2(property_get_ioprio_priority, "i", ExecContext, exec_context_get_effective_ioprio, IOPRIO_PRIO_DATA); +static BUS_DEFINE_PROPERTY_GET2(property_get_ioprio_class, "i", ExecContext, exec_context_get_effective_ioprio, ioprio_prio_class); +static BUS_DEFINE_PROPERTY_GET2(property_get_ioprio_priority, "i", ExecContext, exec_context_get_effective_ioprio, ioprio_prio_data); static BUS_DEFINE_PROPERTY_GET_GLOBAL(property_get_empty_string, "s", NULL); static BUS_DEFINE_PROPERTY_GET_REF(property_get_syslog_level, "i", int, LOG_PRI); static BUS_DEFINE_PROPERTY_GET_REF(property_get_syslog_facility, "i", int, LOG_FAC); @@ -2637,7 +2637,7 @@ int bus_exec_context_set_transient_property( if (r < 0) return r; - c->ioprio = IOPRIO_PRIO_VALUE(q, IOPRIO_PRIO_DATA(c->ioprio)); + c->ioprio = ioprio_prio_value(q, ioprio_prio_data(c->ioprio)); c->ioprio_set = true; unit_write_settingf(u, flags, name, "IOSchedulingClass=%s", s); @@ -2656,7 +2656,7 @@ int bus_exec_context_set_transient_property( return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid IO scheduling priority: %i", p); if (!UNIT_WRITE_FLAGS_NOOP(flags)) { - c->ioprio = IOPRIO_PRIO_VALUE(IOPRIO_PRIO_CLASS(c->ioprio), p); + c->ioprio = ioprio_prio_value(ioprio_prio_class(c->ioprio), p); c->ioprio_set = true; unit_write_settingf(u, flags, name, "IOSchedulingPriority=%i", p); diff --git a/src/core/execute.c b/src/core/execute.c index c1fad61554..007aab7b05 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -62,7 +62,6 @@ #include "glob-util.h" #include "hexdecoct.h" #include "io-util.h" -#include "ioprio.h" #include "label.h" #include "log.h" #include "macro.h" @@ -70,6 +69,7 @@ #include "manager-dump.h" #include "memory-util.h" #include "missing_fs.h" +#include "missing_ioprio.h" #include "mkdir.h" #include "mount-util.h" #include "mountpoint-util.h" @@ -4865,7 +4865,7 @@ void exec_context_init(ExecContext *c) { assert(c); c->umask = 0022; - c->ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, 0); + c->ioprio = ioprio_prio_value(IOPRIO_CLASS_BE, 0); c->cpu_sched_policy = SCHED_OTHER; c->syslog_priority = LOG_DAEMON|LOG_INFO; c->syslog_level_prefix = true; @@ -5427,11 +5427,11 @@ void exec_context_dump(const ExecContext *c, FILE* f, const char *prefix) { if (c->ioprio_set) { _cleanup_free_ char *class_str = NULL; - r = ioprio_class_to_string_alloc(IOPRIO_PRIO_CLASS(c->ioprio), &class_str); + r = ioprio_class_to_string_alloc(ioprio_prio_class(c->ioprio), &class_str); if (r >= 0) fprintf(f, "%sIOSchedulingClass: %s\n", prefix, class_str); - fprintf(f, "%sIOPriority: %lu\n", prefix, IOPRIO_PRIO_DATA(c->ioprio)); + fprintf(f, "%sIOPriority: %d\n", prefix, ioprio_prio_data(c->ioprio)); } if (c->cpu_sched_set) { @@ -5784,7 +5784,7 @@ int exec_context_get_effective_ioprio(const ExecContext *c) { p = ioprio_get(IOPRIO_WHO_PROCESS, 0); if (p < 0) - return IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, 4); + return ioprio_prio_value(IOPRIO_CLASS_BE, 4); return p; } diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c index 220f11f825..4f74f44c7d 100644 --- a/src/core/load-fragment.c +++ b/src/core/load-fragment.c @@ -39,12 +39,12 @@ #include "fs-util.h" #include "hexdecoct.h" #include "io-util.h" -#include "ioprio.h" #include "ip-protocol-list.h" #include "journal-file.h" #include "limits-util.h" #include "load-fragment.h" #include "log.h" +#include "missing_ioprio.h" #include "mountpoint-util.h" #include "nulstr-util.h" #include "parse-socket-bind-item.h" @@ -1266,7 +1266,7 @@ int config_parse_exec_io_class(const char *unit, if (isempty(rvalue)) { c->ioprio_set = false; - c->ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, 0); + c->ioprio = ioprio_prio_value(IOPRIO_CLASS_BE, 0); return 0; } @@ -1276,7 +1276,7 @@ int config_parse_exec_io_class(const char *unit, return 0; } - c->ioprio = IOPRIO_PRIO_VALUE(x, IOPRIO_PRIO_DATA(c->ioprio)); + c->ioprio = ioprio_prio_value(x, ioprio_prio_data(c->ioprio)); c->ioprio_set = true; return 0; @@ -1303,7 +1303,7 @@ int config_parse_exec_io_priority(const char *unit, if (isempty(rvalue)) { c->ioprio_set = false; - c->ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, 0); + c->ioprio = ioprio_prio_value(IOPRIO_CLASS_BE, 0); return 0; } @@ -1313,7 +1313,7 @@ int config_parse_exec_io_priority(const char *unit, return 0; } - c->ioprio = IOPRIO_PRIO_VALUE(IOPRIO_PRIO_CLASS(c->ioprio), i); + c->ioprio = ioprio_prio_value(ioprio_prio_class(c->ioprio), i); c->ioprio_set = true; return 0; diff --git a/src/creds/creds.c b/src/creds/creds.c index f880a79a82..3d2841c07d 100644 --- a/src/creds/creds.c +++ b/src/creds/creds.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include +#include #include "creds-util.h" #include "dirent-util.h" diff --git a/src/journal-remote/journal-upload.c b/src/journal-remote/journal-upload.c index 1456c9115f..1f756b4368 100644 --- a/src/journal-remote/journal-upload.c +++ b/src/journal-remote/journal-upload.c @@ -5,6 +5,7 @@ #include #include #include +#include #include "sd-daemon.h" diff --git a/src/machine/operation.c b/src/machine/operation.c index 42432f1f7f..4110fcf21e 100644 --- a/src/machine/operation.c +++ b/src/machine/operation.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include +#include #include "alloc-util.h" #include "fd-util.h" diff --git a/src/portable/portabled-operation.c b/src/portable/portabled-operation.c index 6f06367d20..e4b737ae8c 100644 --- a/src/portable/portabled-operation.c +++ b/src/portable/portabled-operation.c @@ -1,5 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include + #include "alloc-util.h" #include "fd-util.h" #include "portabled-operation.h" diff --git a/src/shared/calendarspec.c b/src/shared/calendarspec.c index bf24d8d5bb..71256de8e1 100644 --- a/src/shared/calendarspec.c +++ b/src/shared/calendarspec.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "alloc-util.h" #include "calendarspec.h" diff --git a/src/shared/mkfs-util.c b/src/shared/mkfs-util.c index 88a3edec55..924afdfd93 100644 --- a/src/shared/mkfs-util.c +++ b/src/shared/mkfs-util.c @@ -1,5 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include + #include "id128-util.h" #include "mkfs-util.h" #include "path-util.h" diff --git a/src/systemctl/systemctl-start-special.c b/src/systemctl/systemctl-start-special.c index 56068d25f5..6ece700a9b 100644 --- a/src/systemctl/systemctl-start-special.c +++ b/src/systemctl/systemctl-start-special.c @@ -1,5 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include + #include "bootspec.h" #include "bus-error.h" #include "bus-locator.h" diff --git a/src/test/test-data-fd-util.c b/src/test/test-data-fd-util.c index 22a57b5155..8a506ae75e 100644 --- a/src/test/test-data-fd-util.c +++ b/src/test/test-data-fd-util.c @@ -3,6 +3,7 @@ #include #include #include +#include #include "data-fd-util.h" #include "fd-util.h"