[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <3ff33b45-a47e-4a7b-86d9-45f44794071b@infradead.org>
Date: Wed, 22 Oct 2025 10:28:23 -0700
From: Randy Dunlap <rdunlap@...radead.org>
To: Thomas Gleixner <tglx@...utronix.de>, LKML <linux-kernel@...r.kernel.org>
Cc: Peter Zijlstra <peterz@...radead.org>,
Mathieu Desnoyers <mathieu.desnoyers@...icios.com>,
"Paul E. McKenney" <paulmck@...nel.org>, Boqun Feng <boqun.feng@...il.com>,
Jonathan Corbet <corbet@....net>,
Prakash Sangappa <prakash.sangappa@...cle.com>,
Madadi Vineeth Reddy <vineethr@...ux.ibm.com>,
K Prateek Nayak <kprateek.nayak@....com>,
Steven Rostedt <rostedt@...dmis.org>,
Sebastian Andrzej Siewior <bigeasy@...utronix.de>,
Arnd Bergmann <arnd@...db.de>, linux-arch@...r.kernel.org
Subject: Re: [patch V2 02/12] rseq: Add fields and constants for time slice
extension
On 10/22/25 5:57 AM, Thomas Gleixner wrote:
> Aside of a Kconfig knob add the following items:
>
> - Two flag bits for the rseq user space ABI, which allow user space to
> query the availability and enablement without a syscall.
>
> - A new member to the user space ABI struct rseq, which is going to be
> used to communicate request and grant between kernel and user space.
>
> - A rseq state struct to hold the kernel state of this
>
> - Documentation of the new mechanism
>
> Signed-off-by: Thomas Gleixner <tglx@...utronix.de>
> Cc: Peter Zijlstra <peterz@...radead.org>
> Cc: Mathieu Desnoyers <mathieu.desnoyers@...icios.com>
> Cc: "Paul E. McKenney" <paulmck@...nel.org>
> Cc: Boqun Feng <boqun.feng@...il.com>
> Cc: Jonathan Corbet <corbet@....net>
> Cc: Prakash Sangappa <prakash.sangappa@...cle.com>
> Cc: Madadi Vineeth Reddy <vineethr@...ux.ibm.com>
> Cc: K Prateek Nayak <kprateek.nayak@....com>
> Cc: Steven Rostedt <rostedt@...dmis.org>
> Cc: Sebastian Andrzej Siewior <bigeasy@...utronix.de>
> ---
> V2: Fix Kconfig indentation, fix typos and expressions - Randy
> Make the control fields a struct and remove the atomicity requirement - Mathieu
> ---
> Documentation/userspace-api/index.rst | 1
> Documentation/userspace-api/rseq.rst | 118 ++++++++++++++++++++++++++++++++++
> include/linux/rseq_types.h | 26 +++++++
> include/uapi/linux/rseq.h | 38 ++++++++++
> init/Kconfig | 12 +++
> kernel/rseq.c | 7 ++
> 6 files changed, 202 insertions(+)
>
> --- /dev/null
> +++ b/Documentation/userspace-api/rseq.rst
> @@ -0,0 +1,118 @@
> +=====================
> +Restartable Sequences
> +=====================
> +
> +Restartable Sequences allow to register a per thread userspace memory area
> +to be used as an ABI between kernel and userspace for three purposes:
> +
> + * userspace restartable sequences
> +
> + * quick access to read the current CPU number, node ID from userspace
> +
> + * scheduler time slice extensions
> +
> +Restartable sequences (per-cpu atomics)
> +---------------------------------------
> +
> +Restartables sequences allow userspace to perform update operations on
Restartable
> +per-cpu data without requiring heavyweight atomic operations. The actual
> +ABI is unfortunately only available in the code and selftests.
> +
> +Quick access to CPU number, node ID
> +-----------------------------------
> +
> +Allows to implement per CPU data efficiently. Documentation is in code and
> +selftests. :(
> +
> +Scheduler time slice extensions
> +-------------------------------
> +
> +This allows a thread to request a time slice extension when it enters a
> +critical section to avoid contention on a resource when the thread is
> +scheduled out inside of the critical section.
> +
> +The prerequisites for this functionality are:
> +
> + * Enabled in Kconfig
> +
> + * Enabled at boot time (default is enabled)
> +
> + * A rseq userspace pointer has been registered for the thread
I would write: An rseq ...
but it depends on how someone treats (or speaks or thinks) "rseq."
I say/think of it as are-seq, so using "An" makes sense.
> +
> +The thread has to enable the functionality via prctl(2)::
> +
> + prctl(PR_RSEQ_SLICE_EXTENSION, PR_RSEQ_SLICE_EXTENSION_SET,
> + PR_RSEQ_SLICE_EXT_ENABLE, 0, 0);
> +
> +prctl() returns 0 on success and otherwise with the following error codes:
or
> +
> +========= ==============================================================
> +Errorcode Meaning
> +========= ==============================================================
> +EINVAL Functionality not available or invalid function arguments.
> + Note: arg4 and arg5 must be zero
> +ENOTSUPP Functionality was disabled on the kernel command line
> +ENXIO Available, but no rseq user struct registered
> +========= ==============================================================
[snip]> --- a/include/linux/rseq_types.h
> +++ b/include/linux/rseq_types.h
> @@ -73,12 +73,35 @@ struct rseq_ids {
> };
>
> /**
> + * union rseq_slice_state - Status information for rseq time slice extension
> + * @state: Compound to access the overall state
> + * @enabled: Time slice extension is enabled for the task
> + * @granted: Time slice extension was granted to the task
> + */
> +union rseq_slice_state {
> + u16 state;
> + struct {
> + u8 enabled;
> + u8 granted;
> + };
> +};
> +
> +/**
> + * struct rseq_slice - Status information for rseq time slice extension
> + * @state: Time slice extension state
> + */
> +struct rseq_slice {
> + union rseq_slice_state state;
> +};
> +
> +/**
> * struct rseq_data - Storage for all rseq related data
> * @usrptr: Pointer to the registered user space RSEQ memory
> * @len: Length of the RSEQ region
> * @sig: Signature of critial section abort IPs
critical
> * @event: Storage for event management
> * @ids: Storage for cached CPU ID and MM CID
> + * @slice: Storage for time slice extension data
> */
> struct rseq_data {
> struct rseq __user *usrptr;
> @@ -86,6 +109,9 @@ struct rseq_data {
> u32 sig;
> struct rseq_event event;
> struct rseq_ids ids;
> +#ifdef CONFIG_RSEQ_SLICE_EXTENSION
> + struct rseq_slice slice;
> +#endif
> };
>
> #else /* CONFIG_RSEQ */
--
~Randy
Powered by blists - more mailing lists