mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
ARM64: sched: fix bug: avoid infinite loop
All of the sched domains will be destroied and then rebuilded when a cpu online/offline, if a softirq comes after the shced domains are destroied, this cpu will be stucked in the infinite loop in sched_group_energy(), because of it can not get the shced donmain in for_each_domain(cpu, sd). Change-Id: I154cf560e4e1af4a7a2547154ad321e936196ce3 Signed-off-by: Chen Liang <cl@rock-chips.com>
This commit is contained in:
@@ -4866,6 +4866,7 @@ static int sched_group_energy(struct energy_env *eenv)
|
||||
struct sched_group *sg_shared_cap = NULL;
|
||||
|
||||
cpu = cpumask_first(&visit_cpus);
|
||||
cpumask_clear_cpu(cpu, &visit_cpus);
|
||||
|
||||
/*
|
||||
* Is the group utilization affected by cpus outside this
|
||||
@@ -4928,8 +4929,12 @@ static int sched_group_energy(struct energy_env *eenv)
|
||||
|
||||
total_energy += sg_busy_energy + sg_idle_energy;
|
||||
|
||||
if (!sd->child)
|
||||
cpumask_xor(&visit_cpus, &visit_cpus, sched_group_cpus(sg));
|
||||
if (!sd->child) {
|
||||
int i;
|
||||
|
||||
for_each_cpu(i, sched_group_cpus(sg))
|
||||
cpumask_clear_cpu(i, &visit_cpus);
|
||||
}
|
||||
|
||||
if (cpumask_equal(sched_group_cpus(sg), sched_group_cpus(eenv->sg_top)))
|
||||
goto next_cpu;
|
||||
|
||||
Reference in New Issue
Block a user