[tip: sched/urgent] sched/core: Account PSI IRQ time to the execution context, not the scheduling context

tip-bot2 for Zhan Xusheng posted 1 patch 3 hours ago
kernel/sched/core.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
[tip: sched/urgent] sched/core: Account PSI IRQ time to the execution context, not the scheduling context
Posted by tip-bot2 for Zhan Xusheng 3 hours ago
The following commit has been merged into the sched/urgent branch of tip:

Commit-ID:     a0bb6fac53fa7cf1cadb487b43d4c9276a6b82e3
Gitweb:        https://git.kernel.org/tip/a0bb6fac53fa7cf1cadb487b43d4c9276a6b82e3
Author:        Zhan Xusheng <zhanxusheng1024@gmail.com>
AuthorDate:    Fri, 18 Sep 2026 21:29:15 +08:00
Committer:     Ingo Molnar <mingo@kernel.org>
CommitterDate: Thu, 24 Sep 2026 10:32:50 +02:00

sched/core: Account PSI IRQ time to the execution context, not the scheduling context

psi_account_irqtime() has two callers which share rq->psi_irq_time, and
they disagree about the context: __schedule() passes the outgoing rq->curr,
sched_tick() passes rq->donor.  Under proxy execution the donor is blocked
on a mutex while rq->curr burns the CPU.

The tick charges PSI_IRQ_FULL to the donor's cgroup and advances the
timestamp, so the call from __schedule() then finds delta <= 0 and charges
nothing.  The delta is not counted twice, it lands on the wrong cgroup.

Pass rq->curr, which is what the call read before commit af0c8b2bf67b
("sched: Split scheduler and execution contexts") renamed 'curr' to
'donor' across sched_tick().  Without CONFIG_SCHED_PROXY_EXEC the two rq
members are a union, so this only changes anything where that option is set,
and it depends on EXPERT.

Fixes: af0c8b2bf67b ("sched: Split scheduler and execution contexts")
Signed-off-by: Zhan Xusheng <zhanxusheng@xiaomi.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://patch.msgid.link/20260918132915.1236312-1-zhanxusheng@xiaomi.com
---
 kernel/sched/core.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 0b846a1..1fe40de 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -5798,7 +5798,7 @@ void sched_tick(void)
 	curr = rq->curr;
 	donor = rq->donor;
 
-	psi_account_irqtime(rq, donor, NULL);
+	psi_account_irqtime(rq, curr, NULL);
 
 	update_rq_clock(rq);
 	hw_pressure = arch_scale_hw_pressure(cpu_of(rq));