[PATCH 1/3] sched/core: Skip the shadow stack end check when SCS is disabled
From: Chris Down
Date: Tue Oct 27 2026 - 02:37:29 EST
With CONFIG_DYNAMIC_SCS, shadow call stacks are only used when the boot
CPU lacks pointer authentication. scs_release() already checks
scs_is_enabled() before it looks at the shadow stack since commit
9beccca09840 ("scs: add support for dynamic shadow call stacks"), but
schedule_debug() does not.
With CONFIG_SCHED_STACK_END_CHECK=y it therefore checks init_task's
unused shadow stack on every context switch. That is harmless right now,
but the check is redundant and costs a load from an unrelated cache line
in __schedule().
So, let's guard on scs_is_enabled(). It is a static branch, and it folds
to true when CONFIG_DYNAMIC_SCS is not set.
Signed-off-by: Chris Down <chris@xxxxxxxxxxxxxx>
---
kernel/sched/core.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index d7c3b43158de..fc269fd10192 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -6152,7 +6152,7 @@ static inline void schedule_debug(struct task_struct *prev, bool preempt)
if (task_stack_end_corrupted(prev))
panic("corrupted stack end detected inside scheduler\n");
- if (task_scs_end_corrupted(prev))
+ if (scs_is_enabled() && task_scs_end_corrupted(prev))
panic("corrupted shadow stack detected inside scheduler\n");
#endif
--
2.54.0