Commit 010b7723 authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Peter Zijlstra
Browse files

rseq: Don't advertise time slice extensions if disabled



If time slice extensions have been disabled on the kernel command line,
then advertising them in RSEQ flags is wrong.

Adjust the conditionals to reflect reality, fixup the misleading comments
about the gap of these flags and the rseq::flags field.

Fixes: d6200245 ("rseq: Allow registering RSEQ with slice extension")
Signed-off-by: default avatarThomas Gleixner <tglx@kernel.org>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
Tested-by: default avatarDmitry Vyukov <dvyukov@google.com>
Link: https://patch.msgid.link/20260428224427.437059375%40kernel.org
Cc: stable@vger.kernel.org
parent e9766e6f
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ enum rseq_cs_flags_bit {
	RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT_BIT	= 0,
	RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL_BIT	= 1,
	RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT	= 2,
	/* (3) Intentional gap to put new bits into a separate byte */
	/* (3) Intentional gap to keep new bits separate */

	/* User read only feature flags */
	RSEQ_CS_FLAG_SLICE_EXT_AVAILABLE_BIT	= 4,
@@ -161,6 +161,9 @@ struct rseq {
	 *	- RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT
	 *	- RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL
	 *	- RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE
	 *
	 * It is now used for feature status advertisement by the kernel.
	 * See: enum rseq_cs_flags_bit for further information.
	 */
	__u32 flags;

+5 −4
Original line number Diff line number Diff line
@@ -462,11 +462,12 @@ SYSCALL_DEFINE4(rseq, struct rseq __user *, rseq, u32, rseq_len, int, flags, u32
		return -EFAULT;

	if (IS_ENABLED(CONFIG_RSEQ_SLICE_EXTENSION)) {
		if (rseq_slice_extension_enabled()) {
			rseqfl |= RSEQ_CS_FLAG_SLICE_EXT_AVAILABLE;
		if (rseq_slice_extension_enabled() &&
		    (flags & RSEQ_FLAG_SLICE_EXT_DEFAULT_ON))
			if (flags & RSEQ_FLAG_SLICE_EXT_DEFAULT_ON)
				rseqfl |= RSEQ_CS_FLAG_SLICE_EXT_ENABLED;
		}
	}

	scoped_user_write_access(rseq, efault) {
		/*