]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
include: import kernel headers for several struct and enum definitions
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 19 Jun 2025 20:40:29 +0000 (05:40 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 24 Jun 2025 15:50:06 +0000 (00:50 +0900)
- mempolicy.h for MPOL_DEFAULT and friends,
- sched/types.h for struct sched_attr,
- xattr.h for struct xattr_args.

meson.build
src/basic/include/linux/mempolicy.h [new file with mode: 0644]
src/basic/include/linux/sched/types.h [new file with mode: 0644]
src/basic/include/linux/xattr.h [new file with mode: 0644]
src/basic/include/sys/xattr.h [new file with mode: 0644]
src/basic/missing_sched.h
src/basic/missing_syscall.h

index a468cf1ea1b5da22c073163e14413f4d6872c4cc..0c2cb66fc32efa90c553c63dca77d531b30731ea 100644 (file)
@@ -575,14 +575,6 @@ long_max = cc.compute_int(
 assert(long_max > 100000)
 conf.set_quoted('LONG_MAX_STR', '@0@'.format(long_max))
 
-foreach ident : [
-        ['struct sched_attr', '''#include <sched.h>'''],        # since glibc-2.41
-]
-        # We get -1 if the size cannot be determined
-        have = cc.sizeof(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE') > 0
-        conf.set10('HAVE_' + ident[0].underscorify().to_upper(), have)
-endforeach
-
 foreach ident : [
         ['set_mempolicy',     '''#include <sys/syscall.h>'''],  # declared at numaif.h provided by libnuma, which we do not use
         ['get_mempolicy',     '''#include <sys/syscall.h>'''],  # declared at numaif.h provided by libnuma, which we do not use
diff --git a/src/basic/include/linux/mempolicy.h b/src/basic/include/linux/mempolicy.h
new file mode 100644 (file)
index 0000000..47a3ce5
--- /dev/null
@@ -0,0 +1,76 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+/*
+ * NUMA memory policies for Linux.
+ * Copyright 2003,2004 Andi Kleen SuSE Labs
+ */
+#ifndef _LINUX_MEMPOLICY_H
+#define _LINUX_MEMPOLICY_H
+
+#include <linux/errno.h>
+
+
+/*
+ * Both the MPOL_* mempolicy mode and the MPOL_F_* optional mode flags are
+ * passed by the user to either set_mempolicy() or mbind() in an 'int' actual.
+ * The MPOL_MODE_FLAGS macro determines the legal set of optional mode flags.
+ */
+
+/* Policies */
+enum {
+       MPOL_DEFAULT,
+       MPOL_PREFERRED,
+       MPOL_BIND,
+       MPOL_INTERLEAVE,
+       MPOL_LOCAL,
+       MPOL_PREFERRED_MANY,
+       MPOL_WEIGHTED_INTERLEAVE,
+       MPOL_MAX,       /* always last member of enum */
+};
+
+/* Flags for set_mempolicy */
+#define MPOL_F_STATIC_NODES    (1 << 15)
+#define MPOL_F_RELATIVE_NODES  (1 << 14)
+#define MPOL_F_NUMA_BALANCING  (1 << 13) /* Optimize with NUMA balancing if possible */
+
+/*
+ * MPOL_MODE_FLAGS is the union of all possible optional mode flags passed to
+ * either set_mempolicy() or mbind().
+ */
+#define MPOL_MODE_FLAGS                                                        \
+       (MPOL_F_STATIC_NODES | MPOL_F_RELATIVE_NODES | MPOL_F_NUMA_BALANCING)
+
+/* Flags for get_mempolicy */
+#define MPOL_F_NODE    (1<<0)  /* return next IL mode instead of node mask */
+#define MPOL_F_ADDR    (1<<1)  /* look up vma using address */
+#define MPOL_F_MEMS_ALLOWED (1<<2) /* return allowed memories */
+
+/* Flags for mbind */
+#define MPOL_MF_STRICT (1<<0)  /* Verify existing pages in the mapping */
+#define MPOL_MF_MOVE    (1<<1) /* Move pages owned by this process to conform
+                                  to policy */
+#define MPOL_MF_MOVE_ALL (1<<2)        /* Move every page to conform to policy */
+#define MPOL_MF_LAZY    (1<<3) /* UNSUPPORTED FLAG: Lazy migrate on fault */
+#define MPOL_MF_INTERNAL (1<<4)        /* Internal flags start here */
+
+#define MPOL_MF_VALID  (MPOL_MF_STRICT   |     \
+                        MPOL_MF_MOVE     |     \
+                        MPOL_MF_MOVE_ALL)
+
+/*
+ * Internal flags that share the struct mempolicy flags word with
+ * "mode flags".  These flags are allocated from bit 0 up, as they
+ * are never OR'ed into the mode in mempolicy API arguments.
+ */
+#define MPOL_F_SHARED  (1 << 0)        /* identify shared policies */
+#define MPOL_F_MOF     (1 << 3) /* this policy wants migrate on fault */
+#define MPOL_F_MORON   (1 << 4) /* Migrate On protnone Reference On Node */
+
+/*
+ * These bit locations are exposed in the vm.zone_reclaim_mode sysctl
+ * ABI.  New bits are OK, but existing bits can never change.
+ */
+#define RECLAIM_ZONE   (1<<0)  /* Run shrink_inactive_list on the zone */
+#define RECLAIM_WRITE  (1<<1)  /* Writeout pages during reclaim */
+#define RECLAIM_UNMAP  (1<<2)  /* Unmap pages during reclaim */
+
+#endif /* _LINUX_MEMPOLICY_H */
diff --git a/src/basic/include/linux/sched/types.h b/src/basic/include/linux/sched/types.h
new file mode 100644 (file)
index 0000000..90606bc
--- /dev/null
@@ -0,0 +1,121 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+#ifndef _LINUX_SCHED_TYPES_H
+#define _LINUX_SCHED_TYPES_H
+
+#include <linux/types.h>
+
+#define SCHED_ATTR_SIZE_VER0   48      /* sizeof first published struct */
+#define SCHED_ATTR_SIZE_VER1   56      /* add: util_{min,max} */
+
+/*
+ * Extended scheduling parameters data structure.
+ *
+ * This is needed because the original struct sched_param can not be
+ * altered without introducing ABI issues with legacy applications
+ * (e.g., in sched_getparam()).
+ *
+ * However, the possibility of specifying more than just a priority for
+ * the tasks may be useful for a wide variety of application fields, e.g.,
+ * multimedia, streaming, automation and control, and many others.
+ *
+ * This variant (sched_attr) allows to define additional attributes to
+ * improve the scheduler knowledge about task requirements.
+ *
+ * Scheduling Class Attributes
+ * ===========================
+ *
+ * A subset of sched_attr attributes specifies the
+ * scheduling policy and relative POSIX attributes:
+ *
+ *  @size              size of the structure, for fwd/bwd compat.
+ *
+ *  @sched_policy      task's scheduling policy
+ *  @sched_nice                task's nice value      (SCHED_NORMAL/BATCH)
+ *  @sched_priority    task's static priority (SCHED_FIFO/RR)
+ *
+ * Certain more advanced scheduling features can be controlled by a
+ * predefined set of flags via the attribute:
+ *
+ *  @sched_flags       for customizing the scheduler behaviour
+ *
+ * Sporadic Time-Constrained Task Attributes
+ * =========================================
+ *
+ * A subset of sched_attr attributes allows to describe a so-called
+ * sporadic time-constrained task.
+ *
+ * In such a model a task is specified by:
+ *  - the activation period or minimum instance inter-arrival time;
+ *  - the maximum (or average, depending on the actual scheduling
+ *    discipline) computation time of all instances, a.k.a. runtime;
+ *  - the deadline (relative to the actual activation time) of each
+ *    instance.
+ * Very briefly, a periodic (sporadic) task asks for the execution of
+ * some specific computation --which is typically called an instance--
+ * (at most) every period. Moreover, each instance typically lasts no more
+ * than the runtime and must be completed by time instant t equal to
+ * the instance activation time + the deadline.
+ *
+ * This is reflected by the following fields of the sched_attr structure:
+ *
+ *  @sched_deadline    representative of the task's deadline in nanoseconds
+ *  @sched_runtime     representative of the task's runtime in nanoseconds
+ *  @sched_period      representative of the task's period in nanoseconds
+ *
+ * Given this task model, there are a multiplicity of scheduling algorithms
+ * and policies, that can be used to ensure all the tasks will make their
+ * timing constraints.
+ *
+ * As of now, the SCHED_DEADLINE policy (sched_dl scheduling class) is the
+ * only user of this new interface. More information about the algorithm
+ * available in the scheduling class file or in Documentation/.
+ *
+ * Task Utilization Attributes
+ * ===========================
+ *
+ * A subset of sched_attr attributes allows to specify the utilization
+ * expected for a task. These attributes allow to inform the scheduler about
+ * the utilization boundaries within which it should schedule the task. These
+ * boundaries are valuable hints to support scheduler decisions on both task
+ * placement and frequency selection.
+ *
+ *  @sched_util_min    represents the minimum utilization
+ *  @sched_util_max    represents the maximum utilization
+ *
+ * Utilization is a value in the range [0..SCHED_CAPACITY_SCALE]. It
+ * represents the percentage of CPU time used by a task when running at the
+ * maximum frequency on the highest capacity CPU of the system. For example, a
+ * 20% utilization task is a task running for 2ms every 10ms at maximum
+ * frequency.
+ *
+ * A task with a min utilization value bigger than 0 is more likely scheduled
+ * on a CPU with a capacity big enough to fit the specified value.
+ * A task with a max utilization value smaller than 1024 is more likely
+ * scheduled on a CPU with no more capacity than the specified value.
+ *
+ * A task utilization boundary can be reset by setting the attribute to -1.
+ */
+struct sched_attr {
+       __u32 size;
+
+       __u32 sched_policy;
+       __u64 sched_flags;
+
+       /* SCHED_NORMAL, SCHED_BATCH */
+       __s32 sched_nice;
+
+       /* SCHED_FIFO, SCHED_RR */
+       __u32 sched_priority;
+
+       /* SCHED_DEADLINE */
+       __u64 sched_runtime;
+       __u64 sched_deadline;
+       __u64 sched_period;
+
+       /* Utilization hints */
+       __u32 sched_util_min;
+       __u32 sched_util_max;
+
+};
+
+#endif /* _LINUX_SCHED_TYPES_H */
diff --git a/src/basic/include/linux/xattr.h b/src/basic/include/linux/xattr.h
new file mode 100644 (file)
index 0000000..d1f0d30
--- /dev/null
@@ -0,0 +1,96 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+/*
+  File: linux/xattr.h
+
+  Extended attributes handling.
+
+  Copyright (C) 2001 by Andreas Gruenbacher <a.gruenbacher@computer.org>
+  Copyright (c) 2001-2002 Silicon Graphics, Inc.  All Rights Reserved.
+  Copyright (c) 2004 Red Hat, Inc., James Morris <jmorris@redhat.com>
+  Copyright (c) 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+*/
+
+#include <linux/libc-compat.h>
+#include <linux/types.h>
+
+#ifndef _LINUX_XATTR_H
+#define _LINUX_XATTR_H
+
+#if __UAPI_DEF_XATTR
+#define __USE_KERNEL_XATTR_DEFS
+
+#define XATTR_CREATE   0x1     /* set value, fail if attr already exists */
+#define XATTR_REPLACE  0x2     /* set value, fail if attr does not exist */
+
+struct xattr_args {
+       __aligned_u64 value;
+       __u32 size;
+       __u32 flags;
+};
+#endif
+
+/* Namespaces */
+#define XATTR_OS2_PREFIX "os2."
+#define XATTR_OS2_PREFIX_LEN (sizeof(XATTR_OS2_PREFIX) - 1)
+
+#define XATTR_MAC_OSX_PREFIX "osx."
+#define XATTR_MAC_OSX_PREFIX_LEN (sizeof(XATTR_MAC_OSX_PREFIX) - 1)
+
+#define XATTR_BTRFS_PREFIX "btrfs."
+#define XATTR_BTRFS_PREFIX_LEN (sizeof(XATTR_BTRFS_PREFIX) - 1)
+
+#define XATTR_HURD_PREFIX "gnu."
+#define XATTR_HURD_PREFIX_LEN (sizeof(XATTR_HURD_PREFIX) - 1)
+
+#define XATTR_SECURITY_PREFIX  "security."
+#define XATTR_SECURITY_PREFIX_LEN (sizeof(XATTR_SECURITY_PREFIX) - 1)
+
+#define XATTR_SYSTEM_PREFIX "system."
+#define XATTR_SYSTEM_PREFIX_LEN (sizeof(XATTR_SYSTEM_PREFIX) - 1)
+
+#define XATTR_TRUSTED_PREFIX "trusted."
+#define XATTR_TRUSTED_PREFIX_LEN (sizeof(XATTR_TRUSTED_PREFIX) - 1)
+
+#define XATTR_USER_PREFIX "user."
+#define XATTR_USER_PREFIX_LEN (sizeof(XATTR_USER_PREFIX) - 1)
+
+/* Security namespace */
+#define XATTR_EVM_SUFFIX "evm"
+#define XATTR_NAME_EVM XATTR_SECURITY_PREFIX XATTR_EVM_SUFFIX
+
+#define XATTR_IMA_SUFFIX "ima"
+#define XATTR_NAME_IMA XATTR_SECURITY_PREFIX XATTR_IMA_SUFFIX
+
+#define XATTR_SELINUX_SUFFIX "selinux"
+#define XATTR_NAME_SELINUX XATTR_SECURITY_PREFIX XATTR_SELINUX_SUFFIX
+
+#define XATTR_SMACK_SUFFIX "SMACK64"
+#define XATTR_SMACK_IPIN "SMACK64IPIN"
+#define XATTR_SMACK_IPOUT "SMACK64IPOUT"
+#define XATTR_SMACK_EXEC "SMACK64EXEC"
+#define XATTR_SMACK_TRANSMUTE "SMACK64TRANSMUTE"
+#define XATTR_SMACK_MMAP "SMACK64MMAP"
+#define XATTR_NAME_SMACK XATTR_SECURITY_PREFIX XATTR_SMACK_SUFFIX
+#define XATTR_NAME_SMACKIPIN   XATTR_SECURITY_PREFIX XATTR_SMACK_IPIN
+#define XATTR_NAME_SMACKIPOUT  XATTR_SECURITY_PREFIX XATTR_SMACK_IPOUT
+#define XATTR_NAME_SMACKEXEC   XATTR_SECURITY_PREFIX XATTR_SMACK_EXEC
+#define XATTR_NAME_SMACKTRANSMUTE XATTR_SECURITY_PREFIX XATTR_SMACK_TRANSMUTE
+#define XATTR_NAME_SMACKMMAP XATTR_SECURITY_PREFIX XATTR_SMACK_MMAP
+
+#define XATTR_APPARMOR_SUFFIX "apparmor"
+#define XATTR_NAME_APPARMOR XATTR_SECURITY_PREFIX XATTR_APPARMOR_SUFFIX
+
+#define XATTR_CAPS_SUFFIX "capability"
+#define XATTR_NAME_CAPS XATTR_SECURITY_PREFIX XATTR_CAPS_SUFFIX
+
+#define XATTR_BPF_LSM_SUFFIX "bpf."
+#define XATTR_NAME_BPF_LSM (XATTR_SECURITY_PREFIX XATTR_BPF_LSM_SUFFIX)
+#define XATTR_NAME_BPF_LSM_LEN (sizeof(XATTR_NAME_BPF_LSM) - 1)
+
+#define XATTR_POSIX_ACL_ACCESS  "posix_acl_access"
+#define XATTR_NAME_POSIX_ACL_ACCESS XATTR_SYSTEM_PREFIX XATTR_POSIX_ACL_ACCESS
+#define XATTR_POSIX_ACL_DEFAULT  "posix_acl_default"
+#define XATTR_NAME_POSIX_ACL_DEFAULT XATTR_SYSTEM_PREFIX XATTR_POSIX_ACL_DEFAULT
+
+
+#endif /* _LINUX_XATTR_H */
diff --git a/src/basic/include/sys/xattr.h b/src/basic/include/sys/xattr.h
new file mode 100644 (file)
index 0000000..9653483
--- /dev/null
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+
+/* To make struct xattr_args defined, which is used by setxattrat(). Note, the kernel header must be
+ * included before the glibc header, otherwise the struct will not be defined. */
+#include <linux/xattr.h>
+
+#include_next <sys/xattr.h>
index d759ed38514b651287db44c8fa66236b76455785..c14162be59af9a6df7d234a50f4054183e155e80 100644 (file)
@@ -1,7 +1,10 @@
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
 #pragma once
 
-#include <linux/types.h>
+/* sched.h includes linux/sched/types.h since glibc-2.41 (21571ca0d70302909cf72707b2a7736cf12190a0),
+ * to make struct sched_attr being defined.
+ * Note, this must be included before sched.h, otherwise the headers conflict with each other. */
+#include <linux/sched/types.h>
 #include <sched.h>       /* IWYU pragma: export */
 
 #include "forward.h"
@@ -31,20 +34,3 @@ 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
index b02f0135aeeee6cf2fd35e325e4c830b73b7600a..ec62602989dfbfca1fe76b5d0eea748b68adb470 100644 (file)
@@ -3,8 +3,10 @@
 
 /* Missing glibc definitions to access certain kernel APIs */
 
+#include <linux/mempolicy.h>
 #include <signal.h>
 #include <sys/syscall.h>
+#include <sys/xattr.h>
 #include <unistd.h>
 
 #ifdef ARCH_MIPS
@@ -108,14 +110,6 @@ static inline int missing_bpf(int cmd, union bpf_attr *attr, size_t size) {
 /* ======================================================================= */
 
 #if !HAVE_SET_MEMPOLICY
-enum {
-        MPOL_DEFAULT,
-        MPOL_PREFERRED,
-        MPOL_BIND,
-        MPOL_INTERLEAVE,
-        MPOL_LOCAL,
-};
-
 static inline long missing_set_mempolicy(int mode, const unsigned long *nodemask,
                            unsigned long maxnode) {
         return syscall(__NR_set_mempolicy, mode, nodemask, maxnode);
@@ -236,12 +230,6 @@ static inline int missing_quotactl_fd(int fd, int cmd, int id, void *addr) {
 
 #if !HAVE_SETXATTRAT
 /* since kernel v6.13 (6140be90ec70c39fa844741ca3cc807dd0866394) */
-struct xattr_args {
-        _align_(8) uint64_t value;
-        uint32_t size;
-        uint32_t flags;
-};
-
 static inline int missing_setxattrat(int fd, const char *path, int at_flags, const char *name, const struct xattr_args *args, size_t size) {
         return syscall(__NR_setxattrat, fd, path, at_flags, name, args, size);
 }