mirror of
https://github.com/torvalds/linux.git
synced 2026-10-11 12:58:02 +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 commitaf0c8b2bf6("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:af0c8b2bf6("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
This commit is contained in:
parent
3cb0243767
commit
a0bb6fac53
|
|
@ -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));
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user