FROMLIST: sched: Fix runtime accounting w/ split exec & sched contexts
The idea here is we want to charge the scheduler-context task's vruntime but charge the execution-context task's sum_exec_runtime. This way cputime accounting goes against the task actually running but vruntime accounting goes against the rq->donor task so we get proper fairness. Cc: Joel Fernandes <joelaf@google.com> Cc: Qais Yousef <qyousef@layalina.io> Cc: Ingo Molnar <mingo@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Juri Lelli <juri.lelli@redhat.com> Cc: Vincent Guittot <vincent.guittot@linaro.org> Cc: Dietmar Eggemann <dietmar.eggemann@arm.com> Cc: Valentin Schneider <vschneid@redhat.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Ben Segall <bsegall@google.com> Cc: Zimuzo Ezeozue <zezeozue@google.com> Cc: Mel Gorman <mgorman@suse.de> Cc: Will Deacon <will@kernel.org> Cc: Waiman Long <longman@redhat.com> Cc: Boqun Feng <boqun.feng@gmail.com> Cc: "Paul E. McKenney" <paulmck@kernel.org> Cc: Metin Kaya <Metin.Kaya@arm.com> Cc: Xuewen Yan <xuewen.yan94@gmail.com> Cc: K Prateek Nayak <kprateek.nayak@amd.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Daniel Lezcano <daniel.lezcano@linaro.org> Cc: kernel-team@android.com Change-Id: I30b577e7d1a90891e0b869454bce6bbbb00ba09f Signed-off-by: John Stultz <jstultz@google.com> Link: https://lore.kernel.org/lkml/20241125195204.2374458-4-jstultz@google.com/ Bug: 306081722
This commit is contained in:
+16
-5
@@ -1173,22 +1173,33 @@ static void update_tg_load_avg(struct cfs_rq *cfs_rq)
|
||||
}
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
static s64 update_curr_se(struct rq *rq, struct sched_entity *curr)
|
||||
static s64 update_curr_se(struct rq *rq, struct sched_entity *se)
|
||||
{
|
||||
u64 now = rq_clock_task(rq);
|
||||
s64 delta_exec;
|
||||
|
||||
delta_exec = now - curr->exec_start;
|
||||
delta_exec = now - se->exec_start;
|
||||
if (unlikely(delta_exec <= 0))
|
||||
return delta_exec;
|
||||
|
||||
curr->exec_start = now;
|
||||
curr->sum_exec_runtime += delta_exec;
|
||||
se->exec_start = now;
|
||||
if (entity_is_task(se)) {
|
||||
struct task_struct *running = rq->curr;
|
||||
/*
|
||||
* If se is a task, we account the time against the running
|
||||
* task, as w/ proxy-exec they may not be the same.
|
||||
*/
|
||||
running->se.exec_start = now;
|
||||
running->se.sum_exec_runtime += delta_exec;
|
||||
} else {
|
||||
/* If not task, account the time against se */
|
||||
se->sum_exec_runtime += delta_exec;
|
||||
}
|
||||
|
||||
if (schedstat_enabled()) {
|
||||
struct sched_statistics *stats;
|
||||
|
||||
stats = __schedstats_from_se(curr);
|
||||
stats = __schedstats_from_se(se);
|
||||
__schedstat_set(stats->exec_max,
|
||||
max(delta_exec, stats->exec_max));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user