From ee3f4a3dfcd1932df5eb8d7d05784238d00951c9 Mon Sep 17 00:00:00 2001 From: Qais Yousef Date: Tue, 13 Oct 2020 16:03:35 +0100 Subject: [PATCH] Move sched_attr struct and syscall definitions into header file So that we can re-use them in other files. Signed-off-by: Qais Yousef --- schedutils/chrt.c | 77 +------------------------------- schedutils/sched_attr.h | 97 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 76 deletions(-) create mode 100644 schedutils/sched_attr.h diff --git a/schedutils/chrt.c b/schedutils/chrt.c index 3a1608013..052ad7a1b 100644 --- a/schedutils/chrt.c +++ b/schedutils/chrt.c @@ -34,83 +34,8 @@ #include "closestream.h" #include "strutils.h" #include "procutils.h" +#include "sched_attr.h" -/* the SCHED_BATCH is supported since Linux 2.6.16 - * -- temporary workaround for people with old glibc headers - */ -#if defined (__linux__) && !defined(SCHED_BATCH) -# define SCHED_BATCH 3 -#endif - -/* the SCHED_IDLE is supported since Linux 2.6.23 - * commit id 0e6aca43e08a62a48d6770e9a159dbec167bf4c6 - * -- temporary workaround for people with old glibc headers - */ -#if defined (__linux__) && !defined(SCHED_IDLE) -# define SCHED_IDLE 5 -#endif - -/* flag by sched_getscheduler() */ -#if defined(__linux__) && !defined(SCHED_RESET_ON_FORK) -# define SCHED_RESET_ON_FORK 0x40000000 -#endif - -/* flag by sched_getattr() */ -#if defined(__linux__) && !defined(SCHED_FLAG_RESET_ON_FORK) -# define SCHED_FLAG_RESET_ON_FORK 0x01 -#endif - -#if defined (__linux__) -# include -#endif - -/* usable kernel-headers, but old glibc-headers */ -#if defined (__linux__) && !defined(SYS_sched_setattr) && defined(__NR_sched_setattr) -# define SYS_sched_setattr __NR_sched_setattr -#endif - -#if defined (__linux__) && !defined(SYS_sched_getattr) && defined(__NR_sched_getattr) -# define SYS_sched_getattr __NR_sched_getattr -#endif - -#if defined (__linux__) && !defined(HAVE_SCHED_SETATTR) && defined(SYS_sched_setattr) -# define HAVE_SCHED_SETATTR - -struct sched_attr { - uint32_t size; - uint32_t sched_policy; - uint64_t sched_flags; - - /* SCHED_NORMAL, SCHED_BATCH */ - int32_t sched_nice; - - /* SCHED_FIFO, SCHED_RR */ - uint32_t sched_priority; - - /* SCHED_DEADLINE (nsec) */ - uint64_t sched_runtime; - uint64_t sched_deadline; - uint64_t sched_period; -}; - -static int sched_setattr(pid_t pid, const struct sched_attr *attr, unsigned int flags) -{ - return syscall(SYS_sched_setattr, pid, attr, flags); -} - -static int sched_getattr(pid_t pid, struct sched_attr *attr, unsigned int size, unsigned int flags) -{ - return syscall(SYS_sched_getattr, pid, attr, size, flags); -} -#endif - -/* the SCHED_DEADLINE is supported since Linux 3.14 - * commit id aab03e05e8f7e26f51dee792beddcb5cca9215a5 - * -- sched_setattr() is required for this policy! - */ -#if defined (__linux__) && !defined(SCHED_DEADLINE) && defined(HAVE_SCHED_SETATTR) -# define SCHED_DEADLINE 6 -#endif /* control struct */ struct chrt_ctl { diff --git a/schedutils/sched_attr.h b/schedutils/sched_attr.h new file mode 100644 index 000000000..b39d37b5d --- /dev/null +++ b/schedutils/sched_attr.h @@ -0,0 +1,97 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 2, as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Copyright (C) 2004 Robert Love + */ +#ifndef UTIL_LINUX_SCHED_ATTR_H +#define UTIL_LINUX_SCHED_ATTR_H + +/* the SCHED_BATCH is supported since Linux 2.6.16 + * -- temporary workaround for people with old glibc headers + */ +#if defined (__linux__) && !defined(SCHED_BATCH) +# define SCHED_BATCH 3 +#endif + +/* the SCHED_IDLE is supported since Linux 2.6.23 + * commit id 0e6aca43e08a62a48d6770e9a159dbec167bf4c6 + * -- temporary workaround for people with old glibc headers + */ +#if defined (__linux__) && !defined(SCHED_IDLE) +# define SCHED_IDLE 5 +#endif + +/* flag by sched_getscheduler() */ +#if defined(__linux__) && !defined(SCHED_RESET_ON_FORK) +# define SCHED_RESET_ON_FORK 0x40000000 +#endif + +/* flag by sched_getattr() */ +#if defined(__linux__) && !defined(SCHED_FLAG_RESET_ON_FORK) +# define SCHED_FLAG_RESET_ON_FORK 0x01 +#endif + +#if defined (__linux__) +# include +#endif + +/* usable kernel-headers, but old glibc-headers */ +#if defined (__linux__) && !defined(SYS_sched_setattr) && defined(__NR_sched_setattr) +# define SYS_sched_setattr __NR_sched_setattr +#endif + +#if defined (__linux__) && !defined(SYS_sched_getattr) && defined(__NR_sched_getattr) +# define SYS_sched_getattr __NR_sched_getattr +#endif + +#if defined (__linux__) && !defined(HAVE_SCHED_SETATTR) && defined(SYS_sched_setattr) +# define HAVE_SCHED_SETATTR + +struct sched_attr { + uint32_t size; + uint32_t sched_policy; + uint64_t sched_flags; + + /* SCHED_NORMAL, SCHED_BATCH */ + int32_t sched_nice; + + /* SCHED_FIFO, SCHED_RR */ + uint32_t sched_priority; + + /* SCHED_DEADLINE (nsec) */ + uint64_t sched_runtime; + uint64_t sched_deadline; + uint64_t sched_period; +}; + +static int sched_setattr(pid_t pid, const struct sched_attr *attr, unsigned int flags) +{ + return syscall(SYS_sched_setattr, pid, attr, flags); +} + +static int sched_getattr(pid_t pid, struct sched_attr *attr, unsigned int size, unsigned int flags) +{ + return syscall(SYS_sched_getattr, pid, attr, size, flags); +} +#endif + +/* the SCHED_DEADLINE is supported since Linux 3.14 + * commit id aab03e05e8f7e26f51dee792beddcb5cca9215a5 + * -- sched_setattr() is required for this policy! + */ +#if defined (__linux__) && !defined(SCHED_DEADLINE) && defined(HAVE_SCHED_SETATTR) +# define SCHED_DEADLINE 6 +#endif + +#endif /* UTIL_LINUX_SCHED_ATTR_H */