From nobody Sun Feb 8 23:25:46 2026 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 359493385B8; Wed, 29 Oct 2025 13:22:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744145; cv=none; b=fik0fRnIIsO8WsRza3KYkd9OjKNcpBmDhc9TkoBQQ40uDsWV7vQZmvsXyFZfH2F7c4pfwQcG7rp639l4L0cI4d2HuLgBMiptpej0LXiYCSLbu6xH1GoXvjPpd9jpG9RcD90GaO+autNRD3P7QKQP41iqCYRrKPtmf+j0HkdSwKU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744145; c=relaxed/simple; bh=gOP5BANFd3VpHuJ2BZmP5TNHjlKbJsxngF4HViEgVoQ=; h=Message-ID:From:To:Cc:Subject:References:MIME-Version: Content-Type:Date; b=O0+2/mKaCuGVD8Mq+QdvIb8t5f74QSvdWRkSTHexzhaNW9tOuNbmKoKU+Juxp1DPQDCKdjVqttVgHhAE6h1iZQq5T5nYdeqNPg7I8E/UZFaADoKR+nuii+ma2EYuAhsJTruw2mUQ/raSgTbAIHgkzEzQM6bP5PvsFmDvvXoVwmQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=YiuD1HB8; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=eWPZ4cji; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="YiuD1HB8"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="eWPZ4cji" Message-ID: <20251029130403.733465222@linutronix.de> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1761744141; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: references:references; bh=rjEMKljcpOIHWP0e5qtd2vFNbhxhiAfQeDZfSIblhQI=; b=YiuD1HB8sfhtc24u1Lgjpj70Kx3338g6fq5JJ5tlUPniq3wPNndk86iCIBItFOh0dDu9eY pJm5C4tpCBKH/v5L1+MOYIiO+0atSFqvLu86LJeYFChyEsxyQEbQBJvwNmCSIRFbalhV+5 hYWTfA7Wd/ckoFKjZUBbxJUlIUwVGyGQjZDv8312guz7MfOq6A8muDKSTWeruIU/jSUCN9 oTA1KCgN9VPAa46VVoaAklkYcLiKMSvui5svjf5zQQrIB9MyEUrkml5/hQlF1ci1KUP5z+ BqxkBR3OZTx0HsbmJ3KlGIzmb42Ns+B9KzNHQ5icP/WO62nHNR6ktAvS2xxCrw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1761744141; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: references:references; bh=rjEMKljcpOIHWP0e5qtd2vFNbhxhiAfQeDZfSIblhQI=; b=eWPZ4cjieUs1YoRoTJdV1m6evYF9OcQUoc6spY6K6H4yPU1Y3P3qBRvJtlrqbKvEDLTPlj iL6sCWO5bCgKxkAw== From: Thomas Gleixner To: LKML Cc: Peter Zijlstra , Mathieu Desnoyers , "Paul E. McKenney" , Boqun Feng , Jonathan Corbet , Prakash Sangappa , Madadi Vineeth Reddy , K Prateek Nayak , Steven Rostedt , Sebastian Andrzej Siewior , Arnd Bergmann , linux-arch@vger.kernel.org Subject: [patch V3 05/12] rseq: Add prctl() to enable time slice extensions References: <20251029125514.496134233@linutronix.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Date: Wed, 29 Oct 2025 14:22:20 +0100 (CET) Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Implement a prctl() so that tasks can enable the time slice extension mechanism. This fails, when time slice extensions are disabled at compile time or on the kernel command line and when no rseq pointer is registered in the kernel. That allows to implement a single trivial check in the exit to user mode hotpath, to decide whether the whole mechanism needs to be invoked. Signed-off-by: Thomas Gleixner Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: "Paul E. McKenney" Cc: Boqun Feng --- V3: Use -ENOTSUPP for the stub inline - Sebastian --- include/linux/rseq.h | 9 +++++++ include/uapi/linux/prctl.h | 10 ++++++++ kernel/rseq.c | 52 ++++++++++++++++++++++++++++++++++++++++= +++++ kernel/sys.c | 6 +++++ 4 files changed, 77 insertions(+) --- a/include/linux/rseq.h +++ b/include/linux/rseq.h @@ -164,4 +164,13 @@ void rseq_syscall(struct pt_regs *regs); static inline void rseq_syscall(struct pt_regs *regs) { } #endif /* !CONFIG_DEBUG_RSEQ */ =20 +#ifdef CONFIG_RSEQ_SLICE_EXTENSION +int rseq_slice_extension_prctl(unsigned long arg2, unsigned long arg3); +#else /* CONFIG_RSEQ_SLICE_EXTENSION */ +static inline int rseq_slice_extension_prctl(unsigned long arg2, unsigned = long arg3) +{ + return -ENOTSUPP; +} +#endif /* !CONFIG_RSEQ_SLICE_EXTENSION */ + #endif /* _LINUX_RSEQ_H */ --- a/include/uapi/linux/prctl.h +++ b/include/uapi/linux/prctl.h @@ -386,4 +386,14 @@ struct prctl_mm_map { # define PR_FUTEX_HASH_SET_SLOTS 1 # define PR_FUTEX_HASH_GET_SLOTS 2 =20 +/* RSEQ time slice extensions */ +#define PR_RSEQ_SLICE_EXTENSION 79 +# define PR_RSEQ_SLICE_EXTENSION_GET 1 +# define PR_RSEQ_SLICE_EXTENSION_SET 2 +/* + * Bits for RSEQ_SLICE_EXTENSION_GET/SET + * PR_RSEQ_SLICE_EXT_ENABLE: Enable + */ +# define PR_RSEQ_SLICE_EXT_ENABLE 0x01 + #endif /* _LINUX_PRCTL_H */ --- a/kernel/rseq.c +++ b/kernel/rseq.c @@ -71,6 +71,7 @@ #define RSEQ_BUILD_SLOW_PATH =20 #include +#include #include #include #include @@ -500,6 +501,57 @@ SYSCALL_DEFINE4(rseq, struct rseq __user #ifdef CONFIG_RSEQ_SLICE_EXTENSION DEFINE_STATIC_KEY_TRUE(rseq_slice_extension_key); =20 +int rseq_slice_extension_prctl(unsigned long arg2, unsigned long arg3) +{ + switch (arg2) { + case PR_RSEQ_SLICE_EXTENSION_GET: + if (arg3) + return -EINVAL; + return current->rseq.slice.state.enabled ? PR_RSEQ_SLICE_EXT_ENABLE : 0; + + case PR_RSEQ_SLICE_EXTENSION_SET: { + u32 rflags, valid =3D RSEQ_CS_FLAG_SLICE_EXT_AVAILABLE; + bool enable =3D !!(arg3 & PR_RSEQ_SLICE_EXT_ENABLE); + + if (arg3 & ~PR_RSEQ_SLICE_EXT_ENABLE) + return -EINVAL; + if (!rseq_slice_extension_enabled()) + return -ENOTSUPP; + if (!current->rseq.usrptr) + return -ENXIO; + + /* No change? */ + if (enable =3D=3D !!current->rseq.slice.state.enabled) + return 0; + + if (get_user(rflags, ¤t->rseq.usrptr->flags)) + goto die; + + if (current->rseq.slice.state.enabled) + valid |=3D RSEQ_CS_FLAG_SLICE_EXT_ENABLED; + + if ((rflags & valid) !=3D valid) + goto die; + + rflags &=3D ~RSEQ_CS_FLAG_SLICE_EXT_ENABLED; + rflags |=3D RSEQ_CS_FLAG_SLICE_EXT_AVAILABLE; + if (enable) + rflags |=3D RSEQ_CS_FLAG_SLICE_EXT_ENABLED; + + if (put_user(rflags, ¤t->rseq.usrptr->flags)) + goto die; + + current->rseq.slice.state.enabled =3D enable; + return 0; + } + default: + return -EINVAL; + } +die: + force_sig(SIGSEGV); + return -EFAULT; +} + static int __init rseq_slice_cmdline(char *str) { bool on; --- a/kernel/sys.c +++ b/kernel/sys.c @@ -53,6 +53,7 @@ #include #include #include +#include =20 #include #include @@ -2868,6 +2869,11 @@ SYSCALL_DEFINE5(prctl, int, option, unsi case PR_FUTEX_HASH: error =3D futex_hash_prctl(arg2, arg3, arg4); break; + case PR_RSEQ_SLICE_EXTENSION: + if (arg4 || arg5) + return -EINVAL; + error =3D rseq_slice_extension_prctl(arg2, arg3); + break; default: trace_task_prctl_unknown(option, arg2, arg3, arg4, arg5); error =3D -EINVAL;