Skip to content

Commit 23e71d8

Browse files
Luca AbeniPeter Zijlstra
authored andcommitted
sched/deadline: Implement fallback mechanism for !fit case
When a task has a runtime that cannot be served within the scheduling deadline by any of the idle CPU (later_mask) the task is doomed to miss its deadline. This can happen since the SCHED_DEADLINE admission control guarantees only bounded tardiness and not the hard respect of all deadlines. In this case try to select the idle CPU with the largest CPU capacity to minimize tardiness. Favor task_cpu(p) if it has max capacity of !fitting CPUs so that find_later_rq() can potentially still return it (most likely cache-hot) early. Signed-off-by: Luca Abeni <[email protected]> Signed-off-by: Dietmar Eggemann <[email protected]> Signed-off-by: Peter Zijlstra (Intel) <[email protected]> Acked-by: Juri Lelli <[email protected]> Link: https://lkml.kernel.org/r/[email protected]
1 parent b411898 commit 23e71d8

File tree

1 file changed

+16
-4
lines changed

1 file changed

+16
-4
lines changed

kernel/sched/cpudeadline.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,19 +121,31 @@ int cpudl_find(struct cpudl *cp, struct task_struct *p,
121121

122122
if (later_mask &&
123123
cpumask_and(later_mask, cp->free_cpus, p->cpus_ptr)) {
124-
int cpu;
124+
unsigned long cap, max_cap = 0;
125+
int cpu, max_cpu = -1;
125126

126127
if (!static_branch_unlikely(&sched_asym_cpucapacity))
127128
return 1;
128129

129130
/* Ensure the capacity of the CPUs fits the task. */
130131
for_each_cpu(cpu, later_mask) {
131-
if (!dl_task_fits_capacity(p, cpu))
132+
if (!dl_task_fits_capacity(p, cpu)) {
132133
cpumask_clear_cpu(cpu, later_mask);
134+
135+
cap = capacity_orig_of(cpu);
136+
137+
if (cap > max_cap ||
138+
(cpu == task_cpu(p) && cap == max_cap)) {
139+
max_cap = cap;
140+
max_cpu = cpu;
141+
}
142+
}
133143
}
134144

135-
if (!cpumask_empty(later_mask))
136-
return 1;
145+
if (cpumask_empty(later_mask))
146+
cpumask_set_cpu(max_cpu, later_mask);
147+
148+
return 1;
137149
} else {
138150
int best_cpu = cpudl_maximum(cp);
139151

0 commit comments

Comments
 (0)