sched/eevdf: Also update slice on placement
authorPeter Zijlstra <peterz@infradead.org>
Thu, 14 Sep 2023 22:48:55 +0000 (00:48 +0200)
committerPeter Zijlstra <peterz@infradead.org>
Tue, 3 Oct 2023 10:32:29 +0000 (12:32 +0200)
Tasks that never consume their full slice would not update their slice value.
This means that tasks that are spawned before the sysctl scaling keep their
original (UP) slice length.

Fixes: 147f3efaa241 ("sched/fair: Implement an EEVDF-like scheduling policy")
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20230915124822.847197830@noisy.programming.kicks-ass.net
kernel/sched/fair.c

index cb225921bbca47419eeac08a96c98ac74a57ced2..7d73652acbb23512a7050c9515ba2b60ea70f586 100644 (file)
@@ -4919,10 +4919,12 @@ static inline void update_misfit_status(struct task_struct *p, struct rq *rq) {}
 static void
 place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)
 {
-       u64 vslice = calc_delta_fair(se->slice, se);
-       u64 vruntime = avg_vruntime(cfs_rq);
+       u64 vslice, vruntime = avg_vruntime(cfs_rq);
        s64 lag = 0;
 
+       se->slice = sysctl_sched_base_slice;
+       vslice = calc_delta_fair(se->slice, se);
+
        /*
         * Due to how V is constructed as the weighted average of entities,
         * adding tasks with positive lag, or removing tasks with negative lag