mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-18 22:59:29 +02:00
Merge tag 'sched-urgent-2026-09-13' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull scheduler fixes from Ingo Molnar: - Fix EEVDF se->max_slice value on enqueueing (Vincent Guittot) - Fix EEVDF augmented rb-trees re-balancing with multiple fields (Vincent Guittot) - In proxy scheduling, account cgroup CPU time to the execution context, not the scheduling context (Hui Su) - Likewise, call wq_worker_tick() for the execution context, not the scheduling context (Hui Su) * tag 'sched-urgent-2026-09-13' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: sched/core: Call wq_worker_tick() for the execution context sched: Account cgroup CPU time to the execution context sched/eevdf: Fix rb augmented with multi fields sched/eevdf: Fix augmented max_slice
This commit is contained in:
+5
-4
@@ -5776,8 +5776,8 @@ void sched_tick(void)
|
||||
{
|
||||
int cpu = smp_processor_id();
|
||||
struct rq *rq = cpu_rq(cpu);
|
||||
/* accounting goes to the donor task */
|
||||
struct task_struct *donor;
|
||||
/* scheduler accounting goes to the donor task */
|
||||
struct task_struct *curr, *donor;
|
||||
struct rq_flags rf;
|
||||
unsigned long hw_pressure;
|
||||
u64 resched_latency;
|
||||
@@ -5788,6 +5788,7 @@ void sched_tick(void)
|
||||
sched_clock_tick();
|
||||
|
||||
rq_lock(rq, &rf);
|
||||
curr = rq->curr;
|
||||
donor = rq->donor;
|
||||
|
||||
psi_account_irqtime(rq, donor, NULL);
|
||||
@@ -5813,8 +5814,8 @@ void sched_tick(void)
|
||||
|
||||
perf_event_task_tick();
|
||||
|
||||
if (donor->flags & PF_WQ_WORKER)
|
||||
wq_worker_tick(donor);
|
||||
if (curr->flags & PF_WQ_WORKER)
|
||||
wq_worker_tick(curr);
|
||||
|
||||
if (!scx_switched_all()) {
|
||||
rq->idle_balance = idle_cpu(cpu);
|
||||
|
||||
+13
-5
@@ -1032,6 +1032,13 @@ static inline void __max_slice_update(struct sched_entity *se, struct rb_node *n
|
||||
}
|
||||
}
|
||||
|
||||
static inline void min_vruntime_copy(struct sched_entity *new, struct sched_entity *old)
|
||||
{
|
||||
new->min_vruntime = old->min_vruntime;
|
||||
new->min_slice = old->min_slice;
|
||||
new->max_slice = old->max_slice;
|
||||
}
|
||||
|
||||
/*
|
||||
* se->min_vruntime = min(se->vruntime, {left,right}->min_vruntime)
|
||||
*/
|
||||
@@ -1059,8 +1066,9 @@ static inline bool min_vruntime_update(struct sched_entity *se, bool exit)
|
||||
se->max_slice == old_max_slice;
|
||||
}
|
||||
|
||||
RB_DECLARE_CALLBACKS(static, min_vruntime_cb, struct sched_entity,
|
||||
run_node, min_vruntime, min_vruntime_update);
|
||||
|
||||
RB_DECLARE_CALLBACKS_MULTI(static, min_vruntime_cb, struct sched_entity,
|
||||
run_node, min_vruntime_copy, min_vruntime_update);
|
||||
|
||||
/*
|
||||
* Enqueue an entity into the rb-tree:
|
||||
@@ -1073,6 +1081,8 @@ static void __enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se)
|
||||
sum_w_vruntime_add(cfs_rq, se);
|
||||
se->min_vruntime = se->vruntime;
|
||||
se->min_slice = se->slice;
|
||||
se->max_slice = se->slice;
|
||||
|
||||
rb_add_augmented_cached(&se->run_node, &cfs_rq->tasks_timeline,
|
||||
__entity_less, &min_vruntime_cb);
|
||||
}
|
||||
@@ -1404,7 +1414,6 @@ static s64 update_se(struct rq *rq, struct sched_entity *se)
|
||||
|
||||
se->exec_start = now;
|
||||
if (entity_is_task(se)) {
|
||||
struct task_struct *donor = task_of(se);
|
||||
struct task_struct *running = rq->curr;
|
||||
/*
|
||||
* If se is a task, we account the time against the running
|
||||
@@ -1417,8 +1426,7 @@ static s64 update_se(struct rq *rq, struct sched_entity *se)
|
||||
account_group_exec_runtime(running, delta_exec);
|
||||
account_mm_sched(rq, running, delta_exec);
|
||||
|
||||
/* cgroup time is always accounted against the donor */
|
||||
cgroup_account_cputime(donor, delta_exec);
|
||||
cgroup_account_cputime(running, delta_exec);
|
||||
} else {
|
||||
/* If not task, account the time against donor se */
|
||||
se->sum_exec_runtime += delta_exec;
|
||||
|
||||
Reference in New Issue
Block a user