[PATCH v32 0/2] Sleeping Owner Handling for Proxy Execution (v32)
From: John Stultz
Date: Mon Sep 21 2026 - 22:41:56 EST
Hey All,
Just wanted to send out this next iteration of Proxy Execution:
Sleeping Owner Handling.
As always, I'm trying to submit this larger work in smallish
digestible pieces. A quick overview of the journey so far:
1) prep patches
2) single rq proxying
3) simple donor migration
4) optimized donor migration
5) sleeping owner handling <- We are here!
6) chain level balancing
7) proxy rwsems
8) ...
Peter kindly picked up most of the simpler patches I had
submitted in the last iteration, so this mainly leaves the
sleeping owner handling patch, which addresses what to do when a
task is blocked on a mutex whose owner is sleeping. Since there
is nothing we can do to boost the sleeping owner at that point,
we instead deactivate and queue the waiter on a list attached to
the owner. Then when the owner wakes up, we will activate the
waiters on the same runqueue, so they can then boost the owner
to run.
But since the simple sounding things hide subtlety, this ends up
being a pretty complex bit of logic. You can effectively get
trees of waiters, and it's possible to have tasks in the middle
of the tree be woken up. Then handling wakeups as they cascade
down the tree properly is also a bit complex, as there are extra
lists to manage the recursive style work without actually
recursing.
Atul Kumar Pant, K Prateek and Peter and all provided feedback
on the last set that I’ve tried to work into this one.
Additionally, K Prateek sent out his own take on this change
here, which is very interesting:
https://lore.kernel.org/lkml/20260826062901.2137-1-kprateek.nayak@xxxxxxx/
There are definite benefits to his approach, but the patch
series needs a bit more polish and it feels a bit more subtle to
understand. So I figured I’d iterate again on my approach and
send it out.
Peter: Hopefully you can provide some input as to which approach
you’d prefer?
I did include one of K Prateek's fixes from his approach in this
series, as it looks like it should go upstream regardless.
I'd love to get further feedback on any place where these
patches are confusing, or could use additional clarifications.
New in v32 of this set:
* Rebased on current -tip/sched/core
* Added K Prateek’s “Activate blocked donor when no owner is
found” patch
* Add fix suggested by Atul Kumar Pant to double check is_blocked
in do_activate_blocked_waiter()
* Integrated a number of style/formatting changes to utilize
guard() sent by Peter
* Fixed potential race in proxy_remove_from_sleeping_owner()
with owner changing, as found by Peter
* Dropped extraneous call to activate_blocked_waiters() noted by
Peter
Additionally I’d appreciate any testing or comments that folks
have with the full Proxy Execution series! You can find the full
Proxy Exec series here:
https://github.com/johnstultz-work/linux-dev/commits/proxy-exec-v32-7.3-rc-tip-sched-core/
https://github.com/johnstultz-work/linux-dev.git proxy-exec-v32-7.3-rc-tip-sched-core
New changes to the full patch series in this revision include:
* Integrated Suleiman’s proxy-enabled FUTEX_PING patch series,
recently sent to the list.
* Updated to include v13 of Andrea’s sched_ext + proxy-exec
patches
Issues still to address with the full series:
* After the nr_wait imbalance was addressed, Maria Yu raised a
subtle difference in how the nr_iowait counting might be
attributed with proxy-exec: potentially proxy-migrated donors
that become blocked on sleeping owners could
increment/decrement the value on the owners cpu rq, instead of
on the donor’s original cpu rq. It’s unclear to me what the
impact of this would be, if at all, but it is potentially an
observable difference with proxy-exec, so I’m going to take a
swing at addressing it.
* Reevaluate performance regression K Prateek Nayak found with
the full series earlier.
* The chain migration functionality needs further iterations and
better validation to ensure it truly maintains the RT/DL load
balancing invariants (despite this being broken in vanilla
upstream with RT_PUSH_IPI currently)
Future work:
* Expand to more locking primitives: Binder PI is something else
we’re exploring.
* Eventually: Work to replace rt_mutexes and get things happy
with PREEMPT_RT
Credit/Disclaimer:
—--------------------
As always, this Proxy Execution series has a long history with
lots of developers that deserve credit:
First described in a paper[1] by Watkins, Straub, Niehaus, then
from patches from Peter Zijlstra, extended with lots of work by
Juri Lelli, Valentin Schneider, and Connor O'Brien. (and thank
you to Steven Rostedt for providing additional details here!).
Thanks also to Joel Fernandes, Dietmar Eggemann, Metin Kaya,
K Prateek Nayak, Suleiman Souhlal, Christian Loehle, and
Andrea Righi for their substantial review, suggestion, and patch
contributions.
So again, many thanks to those above, as all the credit for this
series really is due to them - while the mistakes are surely
mine.
Thanks so much!
-john
[1] https://static.lwn.net/images/conf/rtlws11/papers/proc/p38.pdf
Cc: Joel Fernandes <joelagnelf@xxxxxxxxxx>
Cc: Qais Yousef <qyousef@xxxxxxxxxxx>
Cc: Ingo Molnar <mingo@xxxxxxxxxx>
Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
Cc: Juri Lelli <juri.lelli@xxxxxxxxxx>
Cc: Vincent Guittot <vincent.guittot@xxxxxxxxxx>
Cc: Dietmar Eggemann <dietmar.eggemann@xxxxxxx>
Cc: Valentin Schneider <vschneid@xxxxxxxxxx>
Cc: Steven Rostedt <rostedt@xxxxxxxxxxx>
Cc: Ben Segall <bsegall@xxxxxxxxxx>
Cc: Zimuzo Ezeozue <zezeozue@xxxxxxxxxx>
Cc: Will Deacon <will@xxxxxxxxxx>
Cc: Waiman Long <longman@xxxxxxxxxx>
Cc: Boqun Feng <boqun.feng@xxxxxxxxx>
Cc: "Paul E. McKenney" <paulmck@xxxxxxxxxx>
Cc: Metin Kaya <Metin.Kaya@xxxxxxx>
Cc: Xuewen Yan <xuewen.yan94@xxxxxxxxx>
Cc: K Prateek Nayak <kprateek.nayak@xxxxxxx>
Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
Cc: Daniel Lezcano <daniel.lezcano@xxxxxxxxxx>
Cc: Suleiman Souhlal <suleiman@xxxxxxxxxx>
Cc: Andrea Righi <arighi@xxxxxxxxxx>
Cc: kuyo chang <kuyo.chang@xxxxxxxxxxxx>
Cc: hupu <hupu.gm@xxxxxxxxx>
Cc: kernel-team@xxxxxxxxxxx
K Prateek Nayak (1):
sched/core: Activate blocked donor when no owner is found
Peter Zijlstra (1):
sched: Add deactivated (sleeping) owner handling to find_proxy_task()
include/linux/sched.h | 7 +
include/linux/sched/task.h | 1 +
init/init_task.c | 6 +
kernel/fork.c | 6 +
kernel/sched/core.c | 342 ++++++++++++++++++++++++++++++++++---
5 files changed, 338 insertions(+), 24 deletions(-)
--
2.55.0.1082.g2b9226bbc0-goog