Add mm_cid and numa node id to rseq ABI header
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 25 Apr 2023 15:22:41 +0000 (11:22 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 25 Apr 2023 22:38:08 +0000 (18:38 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I6def7df36e25d47027b3274cf325ce1beb841b75

include/rseq/rseq-abi.h

index 17ae68eb4b4182506481c7e3f35ac3dd6c34d704..e3eb8c76d8e7d6364d7f3c047f870eec9ca8a090 100644 (file)
@@ -1,5 +1,7 @@
 /* SPDX-License-Identifier: GPL-2.0-or-later WITH Linux-syscall-note */
 /* SPDX-FileCopyrightText: 2015-2022 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> */
+#ifndef _RSEQ_ABI_H
+#define _RSEQ_ABI_H
 
 /*
  * rseq/rseq-abi.h
@@ -7,14 +9,11 @@
  * Restartable sequences system call API
  */
 
-#ifndef _RSEQ_ABI_H
-#define _RSEQ_ABI_H
-
 #include <linux/types.h>
 #include <asm/byteorder.h>
 
 enum rseq_abi_cpu_id_state {
-       RSEQ_ABI_CPU_ID_UNINITIALIZED                   = -1,
+       RSEQ_ABI_CPU_ID_UNINITIALIZED           = -1,
        RSEQ_ABI_CPU_ID_REGISTRATION_FAILED             = -2,
 };
 
@@ -54,10 +53,10 @@ struct rseq_abi_cs {
 } __attribute__((aligned(4 * sizeof(__u64))));
 
 /*
- * struct rseq_abi is aligned on 4 * 8 bytes to ensure it is always
+ * struct rseq is aligned on 4 * 8 bytes to ensure it is always
  * contained within a single cache-line.
  *
- * A single struct rseq_abi per thread is allowed.
+ * A single struct rseq per thread is allowed.
  */
 struct rseq_abi {
        /*
@@ -78,7 +77,7 @@ struct rseq_abi {
         * Read by user-space with single-copy atomicity semantics. This
         * field should only be read by the thread which registered this
         * data structure. Aligned on 32-bit. Values
-        * RSEQ_CPU_ID_UNINITIALIZED and RSEQ_CPU_ID_REGISTRATION_FAILED
+        * RSEQ_ABI_CPU_ID_UNINITIALIZED and RSEQ_ABI_CPU_ID_REGISTRATION_FAILED
         * have a special semantic: the former means "rseq uninitialized",
         * and latter means "rseq initialization failed". This value is
         * meant to be read within rseq critical sections and compared
@@ -92,7 +91,7 @@ struct rseq_abi {
         * Restartable sequences rseq_cs field.
         *
         * Contains NULL when no critical section is active for the current
-        * thread, or holds a pointer to the currently active struct rseq_cs.
+        * thread, or holds a pointer to the currently active struct rseq_abi_cs.
         *
         * Updated by user-space, which sets the address of the currently
         * active rseq_cs at the beginning of assembly instruction sequence
@@ -100,32 +99,16 @@ struct rseq_abi {
         * instruction sequence block, as well as when the kernel detects that
         * it is preempting or delivering a signal outside of the range
         * targeted by the rseq_cs. Also needs to be set to NULL by user-space
-        * before reclaiming memory that contains the targeted struct rseq_cs.
+        * before reclaiming memory that contains the targeted struct rseq_abi_cs.
         *
         * Read and set by the kernel. Set by user-space with single-copy
         * atomicity semantics. This field should only be updated by the
         * thread which registered this data structure. Aligned on 64-bit.
+        *
+        * 32-bit architectures should update the low order bits of the
+        * rseq_cs field, leaving the high order bits initialized to 0.
         */
-       union {
-               __u64 ptr64;
-
-               /*
-                * The "arch" field provides architecture accessor for
-                * the ptr field based on architecture pointer size and
-                * endianness.
-                */
-               struct {
-#ifdef __LP64__
-                       __u64 ptr;
-#elif defined(__BYTE_ORDER) ? (__BYTE_ORDER == __BIG_ENDIAN) : defined(__BIG_ENDIAN)
-                       __u32 padding;          /* Initialized to zero. */
-                       __u32 ptr;
-#else
-                       __u32 ptr;
-                       __u32 padding;          /* Initialized to zero. */
-#endif
-               } arch;
-       } rseq_cs;
+       __u64 rseq_cs;
 
        /*
         * Restartable sequences flags field.
@@ -146,6 +129,28 @@ struct rseq_abi {
         *     this thread.
         */
        __u32 flags;
+
+       /*
+        * Restartable sequences node_id field. Updated by the kernel. Read by
+        * user-space with single-copy atomicity semantics. This field should
+        * only be read by the thread which registered this data structure.
+        * Aligned on 32-bit. Contains the current NUMA node ID.
+        */
+       __u32 node_id;
+
+       /*
+        * Restartable sequences mm_cid field. Updated by the kernel. Read by
+        * user-space with single-copy atomicity semantics. This field should
+        * only be read by the thread which registered this data structure.
+        * Aligned on 32-bit. Contains the current thread's concurrency ID
+        * (allocated uniquely within a memory map).
+        */
+       __u32 mm_cid;
+
+       /*
+        * Flexible array member at end of structure, after last feature field.
+        */
+       char end[];
 } __attribute__((aligned(4 * sizeof(__u64))));
 
 /*
This page took 0.028365 seconds and 4 git commands to generate.