[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20260113114718.GA831050@noisy.programming.kicks-ass.net>
Date: Tue, 13 Jan 2026 12:47:18 +0100
From: Peter Zijlstra <peterz@...radead.org>
To: Pierre Gondois <pierre.gondois@....com>
Cc: K Prateek Nayak <kprateek.nayak@....com>, tj@...nel.org,
linux-kernel@...r.kernel.org, mingo@...nel.org,
juri.lelli@...hat.com, vincent.guittot@...aro.org,
dietmar.eggemann@....com, rostedt@...dmis.org, bsegall@...gle.com,
mgorman@...e.de, vschneid@...hat.com, longman@...hat.com,
hannes@...xchg.org, mkoutny@...e.com, void@...ifault.com,
arighi@...dia.com, changwoo@...lia.com, cgroups@...r.kernel.org,
sched-ext@...ts.linux.dev, liuwenfang@...or.com, tglx@...utronix.de,
Christian Loehle <christian.loehle@....com>
Subject: Re: [PATCH 05/12] sched: Move sched_class::prio_changed() into the
change pattern
On Tue, Jan 13, 2026 at 11:45:43AM +0100, Pierre Gondois wrote:
> Hello Prateek,
>
> On 1/13/26 05:12, K Prateek Nayak wrote:
> > Hello Pierre,
> >
> > On 1/13/2026 2:14 AM, Pierre Gondois wrote:
> > > Hello Peter,
> > >
> > > It seems this patch:
> > > 6455ad5346c9 ("sched: Move sched_class::prio_changed() into the change pattern")
> > > is triggering the following warning:
> > > rq_pin_lock()
> > > \-WARN_ON_ONCE(rq->balance_callback && rq->balance_callback != &balance_push_callback);
> > Can you check if the following solution helps your case too:
> > https://lore.kernel.org/all/20260106104113.GX3707891@noisy.programming.kicks-ass.net/
> >
> I can still see the issue.
> It seems the task deadline is also updated in:
> sched_change_end()
> \-enqueue_task_dl()
> \-enqueue_dl_entity()
> \-setup_new_dl_entity()
> \-replenish_dl_new_period()
> if the task's period finished.
>
> So in sched_change_end(), the task priority (i.e. p->dl.deadline) is
> updated.
> This results in having an old_deadline earlier than the new p->dl.deadline.
> Thus the rq->balance_callback:
>
> prio_changed_dl() {
> ...
> if (dl_time_before(old_deadline, p->dl.deadline))
> deadline_queue_pull_task(rq);
> ...
> }
Hum... so this one is a little more tricky.
So the normal rules are that DEQUEUE_SAVE + ENQUEUE_RESTORE should be as
invariant as possible.
But what I think happens here is that at the point of dequeue we are
effectively ready to throttle/replenish, but we don't.
Then at enqueue, we do. The replenish changes the deadline and we're up
a creek.
Let me think about this for a bit...
Powered by blists - more mailing lists