lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20260207084550.GU1282955@noisy.programming.kicks-ass.net>
Date: Sat, 7 Feb 2026 09:45:50 +0100
From: Peter Zijlstra <peterz@...radead.org>
To: Juri Lelli <juri.lelli@...hat.com>
Cc: Ingo Molnar <mingo@...hat.com>,
	Vincent Guittot <vincent.guittot@...aro.org>,
	Dietmar Eggemann <dietmar.eggemann@....com>,
	Steven Rostedt <rostedt@...dmis.org>,
	Ben Segall <bsegall@...gle.com>, Mel Gorman <mgorman@...e.de>,
	Valentin Schneider <vschneid@...hat.com>,
	Philip Auld <pauld@...hat.com>,
	Gabriele Monaco <gmonaco@...hat.com>, linux-kernel@...r.kernel.org,
	Bruno Goncalves <bgoncalv@...hat.com>
Subject: Re: [PATCH] sched/deadline: Fix missing ENQUEUE_REPLENISH during PI
 de-boosting

On Fri, Feb 06, 2026 at 02:25:52PM +0100, Juri Lelli wrote:

> @@ -284,6 +285,33 @@ static bool check_same_owner(struct task_struct *p)
>  		uid_eq(cred->euid, pcred->uid));
>  }
>  
> +#ifdef CONFIG_RT_MUTEXES
> +static void __setscheduler_dl(struct task_struct *p,
> +			      struct sched_change_ctx *scope)
> +{
> +	struct task_struct *pi_task = rt_mutex_get_top_task(p);
> +
> +	/*
> +	 * In case a former DEADLINE task (either proper or boosted) gets
> +	 * setscheduled to a lower priority class, check if it neeeds to
> +	 * inherit parameters from a potential pi_task. In that case make
> +	 * sure replenishment happens with the next enqueue.
> +	 */
> +	if (!dl_prio(p->normal_prio) &&
> +	    (pi_task && dl_prio(pi_task->prio))) {
> +		p->dl.pi_se = pi_task->dl.pi_se;
> +
> +		if (scope && scope->queued)
> +			scope->flags |= ENQUEUE_REPLENISH;
> +	}
> +}
> +#else /* !CONFIG_RT_MUTEXES */
> +static void __setscheduler_dl(struct task_struct *p,
> +			      struct sched_change_ctx *scope)
> +{
> +}
> +#endif /* !CONFIG_RT_MUTEXES */
> +
>  #ifdef CONFIG_UCLAMP_TASK
>  
>  static int uclamp_validate(struct task_struct *p,
> @@ -657,6 +685,7 @@ int __sched_setscheduler(struct task_struct *p,
>  			p->prio = newprio;
>  		}
>  		__setscheduler_uclamp(p, attr);
> +		__setscheduler_dl(p, scope);
>  
>  		if (scope->queued) {
>  			/*
> 

Urgh... :-)

So normally it would be __setscheduler_params(), but that funks out
because !dl_policy() -- after all, we're demoting the boosted task to be
!DL.

So then we need to fix up things to the effective priority.

Should this not be inside the !KEEP_PARAMS thing? Something like so?

(afaict nothing clears dl_se::pi_se except rt_mutex_setprio() so that
should still be valid here -- so we don't need to go find it again)


diff --git a/kernel/sched/syscalls.c b/kernel/sched/syscalls.c
index 6f10db3646e7..ccd2be806e13 100644
--- a/kernel/sched/syscalls.c
+++ b/kernel/sched/syscalls.c
@@ -655,6 +655,10 @@ int __sched_setscheduler(struct task_struct *p,
 			__setscheduler_params(p, attr);
 			p->sched_class = next_class;
 			p->prio = newprio;
+#ifdef CONFIG_RT_MUTEXES
+			if (dl_prio(newprio) && !dl_policy(policy) && p->dl.pi_se)
+				scope->flags |= ENQUEUE_REPLENISH;
+#endif
 		}
 		__setscheduler_uclamp(p, attr);
 


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ