|
@@ -3890,19 +3890,24 @@ int select_nohz_load_balancer(int stop_tick)
|
|
|
int cpu = smp_processor_id();
|
|
|
|
|
|
if (stop_tick) {
|
|
|
- cpumask_set_cpu(cpu, nohz.cpu_mask);
|
|
|
cpu_rq(cpu)->in_nohz_recently = 1;
|
|
|
|
|
|
- /*
|
|
|
- * If we are going offline and still the leader, give up!
|
|
|
- */
|
|
|
- if (!cpu_active(cpu) &&
|
|
|
- atomic_read(&nohz.load_balancer) == cpu) {
|
|
|
+ if (!cpu_active(cpu)) {
|
|
|
+ if (atomic_read(&nohz.load_balancer) != cpu)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If we are going offline and still the leader,
|
|
|
+ * give up!
|
|
|
+ */
|
|
|
if (atomic_cmpxchg(&nohz.load_balancer, cpu, -1) != cpu)
|
|
|
BUG();
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ cpumask_set_cpu(cpu, nohz.cpu_mask);
|
|
|
+
|
|
|
/* time for ilb owner also to sleep */
|
|
|
if (cpumask_weight(nohz.cpu_mask) == num_online_cpus()) {
|
|
|
if (atomic_read(&nohz.load_balancer) == cpu)
|