mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-01-11 17:10:13 +00:00
sched_ext: Don't kick CPUs running higher classes
When a sched_ext scheduler tries to kick a CPU, the CPU may be running a higher class task. sched_ext has no control over such CPUs. A sched_ext scheduler couldn't have expected to get access to the CPU after kicking it anyway. Skip kicking when the target CPU is running a higher class. Reviewed-by: Andrea Righi <arighi@nvidia.com> Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
2dbbdeda77
commit
a9c1fbbd6d
@ -5122,18 +5122,23 @@ static bool kick_one_cpu(s32 cpu, struct rq *this_rq, unsigned long *pseqs)
|
||||
{
|
||||
struct rq *rq = cpu_rq(cpu);
|
||||
struct scx_rq *this_scx = &this_rq->scx;
|
||||
const struct sched_class *cur_class;
|
||||
bool should_wait = false;
|
||||
unsigned long flags;
|
||||
|
||||
raw_spin_rq_lock_irqsave(rq, flags);
|
||||
cur_class = rq->curr->sched_class;
|
||||
|
||||
/*
|
||||
* During CPU hotplug, a CPU may depend on kicking itself to make
|
||||
* forward progress. Allow kicking self regardless of online state.
|
||||
* forward progress. Allow kicking self regardless of online state. If
|
||||
* @cpu is running a higher class task, we have no control over @cpu.
|
||||
* Skip kicking.
|
||||
*/
|
||||
if (cpu_online(cpu) || cpu == cpu_of(this_rq)) {
|
||||
if ((cpu_online(cpu) || cpu == cpu_of(this_rq)) &&
|
||||
!sched_class_above(cur_class, &ext_sched_class)) {
|
||||
if (cpumask_test_cpu(cpu, this_scx->cpus_to_preempt)) {
|
||||
if (rq->curr->sched_class == &ext_sched_class)
|
||||
if (cur_class == &ext_sched_class)
|
||||
rq->curr->scx.slice = 0;
|
||||
cpumask_clear_cpu(cpu, this_scx->cpus_to_preempt);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user