mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: K Prateek Nayak <kprateek.nayak@amd.com>
Cc: John Stultz <jstultz@google.com>,
	LKML <linux-kernel@vger.kernel.org>,
	Juri Lelli <juri.lelli@redhat.com>,
	Valentin Schneider <valentin.schneider@arm.com>,
	Connor O'Brien <connoro@google.com>,
	Joel Fernandes <joelagnelf@nvidia.com>,
	Qais Yousef <qyousef@layalina.io>, Ingo Molnar <mingo@redhat.com>,
	Vincent Guittot <vincent.guittot@linaro.org>,
	Dietmar Eggemann <dietmar.eggemann@arm.com>,
	Valentin Schneider <vschneid@redhat.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Ben Segall <bsegall@google.com>,
	Zimuzo Ezeozue <zezeozue@google.com>,
	Will Deacon <will@kernel.org>, Waiman Long <longman@redhat.com>,
	Boqun Feng <boqun.feng@gmail.com>,
	"Paul E. McKenney" <paulmck@kernel.org>,
	Metin Kaya <Metin.Kaya@arm.com>,
	Xuewen Yan <xuewen.yan94@gmail.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Daniel Lezcano <daniel.lezcano@linaro.org>,
	Suleiman Souhlal <suleiman@google.com>,
	kuyo chang <kuyo.chang@mediatek.com>, hupu <hupu.gm@gmail.com>,
	kernel-team@android.com
Subject: Re: [PATCH v29 7/9] sched: Add blocked_donor link to task for smarter mutex handoffs
Date: Fri, 22 May 2026 11:50:16 +0200	[thread overview]
Message-ID: <20260522095016.GD3102624@noisy.programming.kicks-ass.net> (raw)
In-Reply-To: <d77aba2e-d9e5-469b-ae50-9984ad07d503@amd.com>

On Tue, May 19, 2026 at 09:16:58PM +0530, K Prateek Nayak wrote:

> >> @@ -1001,6 +1001,12 @@ static noinline void __sched __mutex_unlock_slowpath(struct mutex *lock, unsigne
> >>  		MUTEX_WARN_ON(__owner_task(owner) != current);
> >>  		MUTEX_WARN_ON(owner & MUTEX_FLAG_PICKUP);
> >>  
> >> +		if (sched_proxy_exec() && current->blocked_donor) {
> >> +			/* force handoff if we have a blocked_donor */
> >> +			owner = MUTEX_FLAG_HANDOFF;
> >> +			break;
> >> +		}
> >> +
> >>  		if (owner & MUTEX_FLAG_HANDOFF)
> >>  			break;
> >>  
> > 
> > AFAICT this is racy since we don't have preemption disabled.
> > 
> > So we can observe ->blocked_donor (A) set, or (B) unset.
> > If (A) we can schedule() right after this (and before taking
> > ->wait_lock) and it can be unset when we resume running this task. Or
> > (B), the exact opposite.
> > 
> > Now, (A) is harmless, because if ->blocked_donor becomes NULL, the
> > hand off code falls back to picking the first on the wait list and
> > things just get on.
> > 
> > *However*, (B) might be a problem, because then we will not have the
> > HANDOFF bit set even though there is in fact a donor we need to hand off
> > to.
> 
> I don't think it is that big of a problem: __mutex_unlock_slowpath()
> sees current->blocked_donor as NULL but just before it can do:
> 
>     atomic_long_try_cmpxchg_release(&lock->owner, &owner, __owner_flags(owner))
> 
> it is preempted and comes back with a ->blocked_donor.
> 
> Once we grab the wait_lock, we realize there is a ->blocked_donor link
> and we wake it up instead of first waiter which goes and grabs the
> lock once it hits mutex_trylock() for !owner case.
> 
> If a concurrent mutex_lock() races with this sequence, the
> ->blocked_donor that was woken up sees the new owner and goes to proxy
> that.
> 
> With guard(preempt)(), we see a stable ->blocked_donor as NULL, and we
> wake up the first waiter after clearing the "owner" from lock->owner.
> 
> If a concurrent mutex_lock() races, it still grabs the mutex and now
> it is just the first waiter that realizes it has to go proxy the task
> that stole the lock.
> 
> One wasted wakeup is incurred in both cases but it seems like no
> biggie. Maybe I don't understand the subtleties but stabilizing it
> against preemption is definitely a good move since it saves this
> debate :-)

The preemption can happen after the cmpxchg loop completes and before we
take the wake_lock.

> > @@ -1063,7 +1071,8 @@ static noinline void __sched __mutex_unl
> >  		__mutex_handoff(lock, next);
> >  
> >  	raw_spin_unlock(&current->blocked_lock);
> > -	raw_spin_unlock_irqrestore_wake(&lock->wait_lock, flags, &wake_q);
> > +	raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
> > +	wake_up_q(&wake_q);
> 
> In that case, can't we simplify this to:
> 
>     if (next)
>         wake_up_process(next);
> 
> and save on the wake_q enqueue dequeue overheads?

Sorta, it still needs the get/put_task_struct() dance on.

  parent reply	other threads:[~2026-05-22  9:50 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-12  2:56 [PATCH v29 0/9] Optimized Donor Migration for Proxy Execution John Stultz
2026-05-12  2:56 ` [PATCH v29 1/9] sched: Rework pick_next_task() and prev_balance() to avoid stale prev references John Stultz
2026-05-19 10:32   ` Peter Zijlstra
2026-05-20  2:45     ` John Stultz
2026-05-20  9:43       ` Peter Zijlstra
2026-06-04 18:45   ` [tip: sched/core] sched: Rework " tip-bot2 for John Stultz
2026-05-12  2:56 ` [PATCH v29 2/9] sched: deadline: Add some helper variables to cleanup deadline logic John Stultz
2026-06-04 18:45   ` [tip: sched/core] " tip-bot2 for John Stultz
2026-05-12  2:56 ` [PATCH v29 3/9] sched: deadline: Add dl_rq->curr pointer to address issues with Proxy Exec John Stultz
2026-06-04 18:45   ` [tip: sched/core] " tip-bot2 for John Stultz
2026-05-12  2:56 ` [PATCH v29 4/9] sched: Rework block_task so it can be directly called John Stultz
2026-06-04 18:45   ` [tip: sched/core] " tip-bot2 for John Stultz
2026-05-12  2:56 ` [PATCH v29 5/9] sched: Have try_to_wake_up() handle return-migration for PROXY_WAKING case John Stultz
2026-05-22 11:30   ` Peter Zijlstra
2026-05-22 11:35     ` Peter Zijlstra
2026-06-04 18:45   ` [tip: sched/core] " tip-bot2 for John Stultz
2026-05-12  2:56 ` [PATCH v29 6/9] sched: Add is_blocked task flag John Stultz
2026-06-04 18:45   ` [tip: sched/core] " tip-bot2 for John Stultz
2026-05-12  2:56 ` [PATCH v29 7/9] sched: Add blocked_donor link to task for smarter mutex handoffs John Stultz
2026-05-19 14:32   ` Peter Zijlstra
2026-05-19 14:46     ` Peter Zijlstra
2026-05-19 15:46     ` K Prateek Nayak
2026-05-20 18:10       ` John Stultz
2026-05-22  9:50       ` Peter Zijlstra [this message]
2026-05-20 18:09     ` John Stultz
2026-06-04 18:45   ` [tip: sched/core] " tip-bot2 for Peter Zijlstra
2026-05-12  2:56 ` [PATCH v29 8/9] sched: Break out core of attach_tasks() helper into sched.h John Stultz
2026-05-12  2:56 ` [PATCH v29 9/9] sched: Migrate whole chain in proxy_migrate_task() John Stultz

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=20260522095016.GD3102624@noisy.programming.kicks-ass.net \
    --to=peterz@infradead.org \
    --cc=Metin.Kaya@arm.com \
    --cc=boqun.feng@gmail.com \
    --cc=bsegall@google.com \
    --cc=connoro@google.com \
    --cc=daniel.lezcano@linaro.org \
    --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=kprateek.nayak@amd.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=qyousef@layalina.io \
    --cc=rostedt@goodmis.org \
    --cc=suleiman@google.com \
    --cc=tglx@linutronix.de \
    --cc=valentin.schneider@arm.com \
    --cc=vincent.guittot@linaro.org \
    --cc=vschneid@redhat.com \
    --cc=will@kernel.org \
    --cc=xuewen.yan94@gmail.com \
    --cc=zezeozue@google.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome