|
@@ -5420,13 +5420,16 @@ static inline void set_cpu_sd_state_busy(void)
|
|
|
struct sched_domain *sd;
|
|
|
int cpu = smp_processor_id();
|
|
|
|
|
|
- if (!test_bit(NOHZ_IDLE, nohz_flags(cpu)))
|
|
|
- return;
|
|
|
- clear_bit(NOHZ_IDLE, nohz_flags(cpu));
|
|
|
-
|
|
|
rcu_read_lock();
|
|
|
- for_each_domain(cpu, sd)
|
|
|
+ sd = rcu_dereference_check_sched_domain(cpu_rq(cpu)->sd);
|
|
|
+
|
|
|
+ if (!sd || !sd->nohz_idle)
|
|
|
+ goto unlock;
|
|
|
+ sd->nohz_idle = 0;
|
|
|
+
|
|
|
+ for (; sd; sd = sd->parent)
|
|
|
atomic_inc(&sd->groups->sgp->nr_busy_cpus);
|
|
|
+unlock:
|
|
|
rcu_read_unlock();
|
|
|
}
|
|
|
|
|
@@ -5435,13 +5438,16 @@ void set_cpu_sd_state_idle(void)
|
|
|
struct sched_domain *sd;
|
|
|
int cpu = smp_processor_id();
|
|
|
|
|
|
- if (test_bit(NOHZ_IDLE, nohz_flags(cpu)))
|
|
|
- return;
|
|
|
- set_bit(NOHZ_IDLE, nohz_flags(cpu));
|
|
|
-
|
|
|
rcu_read_lock();
|
|
|
- for_each_domain(cpu, sd)
|
|
|
+ sd = rcu_dereference_check_sched_domain(cpu_rq(cpu)->sd);
|
|
|
+
|
|
|
+ if (!sd || sd->nohz_idle)
|
|
|
+ goto unlock;
|
|
|
+ sd->nohz_idle = 1;
|
|
|
+
|
|
|
+ for (; sd; sd = sd->parent)
|
|
|
atomic_dec(&sd->groups->sgp->nr_busy_cpus);
|
|
|
+unlock:
|
|
|
rcu_read_unlock();
|
|
|
}
|
|
|
|