All of lore.kernel.org
 help / color / mirror / Atom feed
From: K Prateek Nayak <kprateek.nayak@amd.com>
To: Andrea Righi <arighi@nvidia.com>,
	John Stultz <jstultz@google.com>,
	"Juri Lelli" <juri.lelli@redhat.com>,
	Peter Zijlstra <peterz@infradead.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
	Valentin Schneider <valentin.schneider@arm.com>,
	Connor O'Brien <connoro@google.com>,
	"Ingo Molnar" <mingo@redhat.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	"Vincent Guittot" <vincent.guittot@linaro.org>,
	Valentin Schneider <vschneid@redhat.com>,
	Suleiman Souhlal <suleiman@google.com>,
	Metin Kaya <Metin.Kaya@arm.com>,
	Dietmar Eggemann <dietmar.eggemann@arm.com>,
	"Steven Rostedt" <rostedt@goodmis.org>,
	Zimuzo Ezeozue <zezeozue@google.com>,
	"Waiman Long" <longman@redhat.com>,
	Boqun Feng <boqun.feng@gmail.com>,
	"Paul E. McKenney" <paulmck@kernel.org>,
	Joel Fernandes <joelagnelf@nvidia.com>,
	"Qais Yousef" <qyousef@layalina.io>,
	Xuewen Yan <xuewen.yan94@gmail.com>,
	kuyo chang <kuyo.chang@mediatek.com>, hupu <hupu.gm@gmail.com>,
	Zhan Xusheng <zhanxusheng@xiaomi.com>,
	"zhidao su (Xiaomi)" <soolaugust@gmail.com>,
	Hui Su <sh_def@163.com>,
	"Shubhang Kaushik (Ampere)" <sh@gentwo.org>,
	<kernel-team@android.com>
Subject: Re: [PATCH v33 7/7] sched/proxy: Add deactivated (sleeping) owner handling to find_proxy_task()
Date: Mon, 26 Oct 2026 09:56:03 +0530	[thread overview]
Message-ID: <267d3f71-7f60-48d2-b8dc-bf87f403b94f@amd.com> (raw)
In-Reply-To: <atx1U_0FC-fazkV7@gpd4>

On 10/24/2026 2:37 PM, Andrea Righi wrote:
>> +static void do_activate_blocked_waiter(struct rq *target_rq, struct task_struct *p, int en_flags)
>> +{
>> +	struct rq_flags rf;
>> +	int target_cpu = cpu_of(target_rq);
>> +
>> +	scoped_guard (raw_spinlock_irqsave, &p->pi_lock) {
>> +		/* If task is no longer blocked, don't activate */
>> +		if (!p->is_blocked)
>> +			return;
>> +
>> +		/* Avoid racing with ttwu */
>> +		if (READ_ONCE(p->__state) == TASK_WAKING)
>> +			return;
>> +
>> +		if (READ_ONCE(p->on_rq)) {
>> +			/*
>> +			 * We raced with a non mutex handoff activation of p.
>> +			 * That activation will also take care of activating
>> +			 * all of the tasks after p in the blocked_head list,
>> +			 * so we're done here.
>> +			 */
>> +			return;
>> +		}
> 
> Is a racing activation the only possible case here? When
> proxy_enqueue_on_owner() calls block_task() on a fair task that isn't
> eligible, DELAY_DEQUEUE keeps it on_rq with se.sched_delayed set. In
> that case p simply won't donate until it's woken by the mutex, so
> nothing nasty shoudl happen, but maybe it's worth updating the comment
> to describe this case as well?
> 
>> +		if (task_on_cpu(task_rq(p), p)) {
>> +			/*
>> +			 * Its possible this activation is very late, and
>> +			 * we already were woken up and are running on a
>> +			 * different cpu. If that task blocked, it could be
>> +			 * dequeued (so on_rq == 0), but still on_cpu.
>> +			 * Bail in this case, as we definitely don't want to
>> +			 * activate a task when its on_cpu elsewhere.
>> +			 */
>> +			return;
>> +		}
>> +
>> +		scoped_guard (raw_spinlock, &p->blocked_lock) {
>> +			/*
>> +			 * Again, if activation is delayed, it's possible the
>> +			 * task has been woken and is no longer blocked_on,
>> +			 * but went back to sleep, so double check blocked_on
>> +			 * before activating onto the owner's rq
>> +			 */
>> +			if (!task_is_blocked(p))
>> +				return;
>> +		}
>> +
>> +		/*
>> +		 * Have to make sure we handle nr_iowait adjustment before
>> +		 * we call proxy_set_task_cpu() to ensure we are adjusting
>> +		 * the same runqueue we left (where block_task()
>> +		 * incremented nr_iowait).
>> +		 */
>> +		if (p->in_iowait) {
>> +			delayacct_blkio_end(p);
>> +			atomic_dec(&task_rq(p)->nr_iowait);
>> +		}
>> +
>> +		if (task_cpu(p) != target_cpu) {
>> +			en_flags |= ENQUEUE_MIGRATED;
>> +			psi_ttwu_dequeue(p);
>> +			proxy_set_task_cpu(p, target_cpu);
>> +		}
> 
> Can this break SCHED_DEADLINE bw accounting?
> 
> p is sleeping here (not TASK_WAKING, not TASK_ON_RQ_MIGRATING), so
> __set_task_cpu() skips migrate_task_rq_dl(): the old rq never does
> sub_rq_bw(), while ENQUEUE_MIGRATED makes the new rq do add_rq_bw(), so
> this_bw is leaked on the old rq. And if p is still dl_non_contending,
> task_contending() on the new rq just cancels the inactive timer, leaving
> running_bw on the old rq forever and making it underflow on the new rq
> the next time p blocks.
> 
> set_task_cpu() doesn't help, because migrate_task_rq_dl() bails out
> unless TASK_WAKING, so I'm not sure how to fix this case...

I wonder why "p->dl.dl_non_contending" is not sufficient to know if
there exists residual bandwidth on prev CPU. Seems to have been like
that since commit 209a0cbda7a0 ("sched/deadline: Improve the tracking
of active utilization").

Only time task is non-contending is if it goes away with DEQUEUE_SLEEP
or switched_from_dl() with dl_runtime.

The latter doesn't need migrating the timer as the timer will either
be cancelled if the task switches back to deadline, or will expire
where it was queued - set_task_cpu() has no effect in this case.

Only other case that marks "dl_non_contending" is sleep + wakeup and
for that "p->dl.non_contending" should be sufficient. I don't think
we ever do a set_task_cpu() for a blocked task other than wakeup do
we?

Juri, Peter, are we missing something subtle here?

> 
>> +		rq_lock_irqsave(target_rq, &rf);
>> +		/*
>> +		 * proxy_enqueue_on_owner() called block_task() which
>> +		 * increments nr_uninterruptible, so we need to reverse
>> +		 * that when we activate the blocked waiter
>> +		 */
>> +		if (p->sched_contributes_to_load)
>> +			target_rq->nr_uninterruptible--;
>> +		update_rq_clock(target_rq);
>> +		activate_task(target_rq, p, en_flags);
>> +		resched_curr(target_rq);
>> +		rq_unlock_irqrestore(target_rq, &rf);
>> +	}
>> +}

-- 
Thanks and Regards,
Prateek


  reply	other threads:[~2026-10-26  4:26 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-23 22:04 [PATCH v33 0/7] Sleeping Owner Handling for Proxy Execution (v33) John Stultz
2026-10-23 22:04 ` [PATCH v33 1/7] sched/psi: Preserve sleep-persistent PSI flags on off-CPU sleeping dequeues John Stultz
2026-10-24 11:44   ` Peter Zijlstra
2026-10-26  5:00     ` K Prateek Nayak
2026-10-26  4:32   ` K Prateek Nayak
2026-10-26  5:16   ` Zhan Xusheng
2026-10-29 22:02   ` Tejun Heo
2026-10-23 22:04 ` [PATCH v33 2/7] sched/core: Use the scheduling context for remote ticks John Stultz
2026-10-24 13:44   ` Kayra Cizmeci
2026-10-23 22:04 ` [PATCH v33 3/7] sched/core: Activate blocked donor when no owner is found John Stultz
2026-10-24  8:33   ` Andrea Righi
2026-10-26  3:02     ` K Prateek Nayak
2026-10-23 22:04 ` [PATCH v33 4/7] sched/proxy: Set TASK_RUNNING when shortcuting return migration John Stultz
2026-10-24  8:36   ` Andrea Righi
2026-10-26  3:09     ` K Prateek Nayak
2026-10-23 22:04 ` [PATCH v33 5/7] sched/proxy: Break cyclic proxy chains by deactivating blocked tasks John Stultz
2026-10-24 21:19   ` Kayra Cizmeci
2026-10-23 22:04 ` [PATCH v33 6/7] sched/proxy: Detect cycles in proxy walks earlier John Stultz
2026-10-24 15:34   ` Kayra Cizmeci
2026-10-23 22:04 ` [PATCH v33 7/7] sched/proxy: Add deactivated (sleeping) owner handling to find_proxy_task() John Stultz
2026-10-24  9:07   ` Andrea Righi
2026-10-26  4:26     ` K Prateek Nayak [this message]
2026-10-27 16:22       ` Juri Lelli
2026-10-28  3:36         ` K Prateek Nayak
2026-10-28 10:01           ` Juri Lelli
2026-10-28 10:11             ` K Prateek Nayak
2026-10-28 10:36               ` Juri Lelli
2026-10-29  3:27                 ` K Prateek Nayak
2026-10-26  7:40   ` K Prateek Nayak
2026-10-26 19:59   ` Kayra Cizmeci

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=267d3f71-7f60-48d2-b8dc-bf87f403b94f@amd.com \
    --to=kprateek.nayak@amd.com \
    --cc=Metin.Kaya@arm.com \
    --cc=arighi@nvidia.com \
    --cc=boqun.feng@gmail.com \
    --cc=connoro@google.com \
    --cc=dietmar.eggemann@arm.com \
    --cc=hupu.gm@gmail.com \
    --cc=joelagnelf@nvidia.com \
    --cc=jstultz@google.com \
    --cc=juri.lelli@redhat.com \
    --cc=kernel-team@android.com \
    --cc=kuyo.chang@mediatek.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=longman@redhat.com \
    --cc=mingo@redhat.com \
    --cc=paulmck@kernel.org \
    --cc=peterz@infradead.org \
    --cc=qyousef@layalina.io \
    --cc=rostedt@goodmis.org \
    --cc=sh@gentwo.org \
    --cc=sh_def@163.com \
    --cc=soolaugust@gmail.com \
    --cc=suleiman@google.com \
    --cc=tglx@linutronix.de \
    --cc=valentin.schneider@arm.com \
    --cc=vincent.guittot@linaro.org \
    --cc=vschneid@redhat.com \
    --cc=xuewen.yan94@gmail.com \
    --cc=zezeozue@google.com \
    --cc=zhanxusheng@xiaomi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.