From: Chen Liang Date: Fri, 8 Jul 2016 02:12:43 +0000 (+0800) Subject: ARM64: sched: fix bug: avoid infinite loop X-Git-Tag: firefly_0821_release~2181 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=firefly-linux-kernel-4.4.55.git;a=commitdiff_plain;h=d4773e1407b6d59a202bd4ce8acc83deaceafa29 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 --- diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 6d84df9366ed..67629fa15d58 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -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;