|
@@ -4414,8 +4414,24 @@ int select_nohz_load_balancer(int stop_tick)
|
|
|
/* make me the ilb owner */
|
|
|
if (atomic_cmpxchg(&nohz.load_balancer, -1, cpu) == -1)
|
|
|
return 1;
|
|
|
- } else if (atomic_read(&nohz.load_balancer) == cpu)
|
|
|
+ } else if (atomic_read(&nohz.load_balancer) == cpu) {
|
|
|
+ int new_ilb;
|
|
|
+
|
|
|
+ if (!(sched_smt_power_savings ||
|
|
|
+ sched_mc_power_savings))
|
|
|
+ return 1;
|
|
|
+ /*
|
|
|
+ * Check to see if there is a more power-efficient
|
|
|
+ * ilb.
|
|
|
+ */
|
|
|
+ new_ilb = find_new_ilb(cpu);
|
|
|
+ if (new_ilb < nr_cpu_ids && new_ilb != cpu) {
|
|
|
+ atomic_set(&nohz.load_balancer, -1);
|
|
|
+ resched_cpu(new_ilb);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
return 1;
|
|
|
+ }
|
|
|
} else {
|
|
|
if (!cpumask_test_cpu(cpu, nohz.cpu_mask))
|
|
|
return 0;
|