[PATCH v3 2/2] fork: fix default_timer_slack_ns inheritance from RT parent
From: Guanyou.Chen
Date: Fri May 22 2026 - 09:18:30 EST
Per prctl(2), "Timer slack is not applied to threads that are scheduled
under a real-time scheduling policy." This means RT tasks' timer_slack_ns
is forcibly 0 - not a user-chosen value but a "not applicable" state.
When copy_process() sets the child's default_timer_slack_ns from the
parent's timer_slack_ns, it inherits this forced 0 for RT parents. This
corrupts the child's reset target, making prctl(PR_SET_TIMERSLACK, 0)
and sched_setscheduler() back to NORMAL unable to restore a meaningful
default.
Fix this by using default_timer_slack_ns (which preserves the pre-RT
value) when the parent is RT/DL. For non-RT parents, timer_slack_ns is
a meaningful user value and the existing behavior is preserved.
Fixes: ed4fb6d7ef68 ("hrtimer: Use and report correct timerslack values for realtime tasks")
Reported-by: Qiaoting.Lin <linqiaoting@xxxxxxxxxx>
Signed-off-by: Guanyou.Chen <chenguanyou@xxxxxxxxxx>
Signed-off-by: Chunhui.Li <chunhui.li@xxxxxxxxxxxx>
---
kernel/fork.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/kernel/fork.c b/kernel/fork.c
index 65113a304518..bc4df18bfd90 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -23,6 +23,7 @@
#include <linux/sched/task_stack.h>
#include <linux/sched/cputime.h>
#include <linux/sched/ext.h>
+#include <linux/sched/rt.h>
#include <linux/seq_file.h>
#include <linux/rtmutex.h>
#include <linux/init.h>
@@ -2133,7 +2134,10 @@ __latent_entropy struct task_struct *copy_process(
retval = -EAGAIN;
#endif
- p->default_timer_slack_ns = current->timer_slack_ns;
+ if (rt_or_dl_task_policy(current))
+ p->default_timer_slack_ns = current->default_timer_slack_ns;
+ else
+ p->default_timer_slack_ns = current->timer_slack_ns;
#ifdef CONFIG_PSI
p->psi_flags = 0;
--
2.34.1