|
@@ -6534,16 +6534,16 @@ static inline void nohz_balance_exit_idle(int cpu)
|
|
|
static inline void set_cpu_sd_state_busy(void)
|
|
|
{
|
|
|
struct sched_domain *sd;
|
|
|
+ int cpu = smp_processor_id();
|
|
|
|
|
|
rcu_read_lock();
|
|
|
- sd = rcu_dereference_check_sched_domain(this_rq()->sd);
|
|
|
+ sd = rcu_dereference(per_cpu(sd_busy, cpu));
|
|
|
|
|
|
if (!sd || !sd->nohz_idle)
|
|
|
goto unlock;
|
|
|
sd->nohz_idle = 0;
|
|
|
|
|
|
- for (; sd; sd = sd->parent)
|
|
|
- atomic_inc(&sd->groups->sgp->nr_busy_cpus);
|
|
|
+ atomic_inc(&sd->groups->sgp->nr_busy_cpus);
|
|
|
unlock:
|
|
|
rcu_read_unlock();
|
|
|
}
|
|
@@ -6551,16 +6551,16 @@ unlock:
|
|
|
void set_cpu_sd_state_idle(void)
|
|
|
{
|
|
|
struct sched_domain *sd;
|
|
|
+ int cpu = smp_processor_id();
|
|
|
|
|
|
rcu_read_lock();
|
|
|
- sd = rcu_dereference_check_sched_domain(this_rq()->sd);
|
|
|
+ sd = rcu_dereference(per_cpu(sd_busy, cpu));
|
|
|
|
|
|
if (!sd || sd->nohz_idle)
|
|
|
goto unlock;
|
|
|
sd->nohz_idle = 1;
|
|
|
|
|
|
- for (; sd; sd = sd->parent)
|
|
|
- atomic_dec(&sd->groups->sgp->nr_busy_cpus);
|
|
|
+ atomic_dec(&sd->groups->sgp->nr_busy_cpus);
|
|
|
unlock:
|
|
|
rcu_read_unlock();
|
|
|
}
|
|
@@ -6767,6 +6767,8 @@ static inline int nohz_kick_needed(struct rq *rq, int cpu)
|
|
|
{
|
|
|
unsigned long now = jiffies;
|
|
|
struct sched_domain *sd;
|
|
|
+ struct sched_group_power *sgp;
|
|
|
+ int nr_busy;
|
|
|
|
|
|
if (unlikely(idle_cpu(cpu)))
|
|
|
return 0;
|
|
@@ -6792,22 +6794,22 @@ static inline int nohz_kick_needed(struct rq *rq, int cpu)
|
|
|
goto need_kick;
|
|
|
|
|
|
rcu_read_lock();
|
|
|
- for_each_domain(cpu, sd) {
|
|
|
- struct sched_group *sg = sd->groups;
|
|
|
- struct sched_group_power *sgp = sg->sgp;
|
|
|
- int nr_busy = atomic_read(&sgp->nr_busy_cpus);
|
|
|
+ sd = rcu_dereference(per_cpu(sd_busy, cpu));
|
|
|
|
|
|
- if (sd->flags & SD_SHARE_PKG_RESOURCES && nr_busy > 1)
|
|
|
- goto need_kick_unlock;
|
|
|
+ if (sd) {
|
|
|
+ sgp = sd->groups->sgp;
|
|
|
+ nr_busy = atomic_read(&sgp->nr_busy_cpus);
|
|
|
|
|
|
- if (sd->flags & SD_ASYM_PACKING
|
|
|
- && (cpumask_first_and(nohz.idle_cpus_mask,
|
|
|
- sched_domain_span(sd)) < cpu))
|
|
|
+ if (nr_busy > 1)
|
|
|
goto need_kick_unlock;
|
|
|
-
|
|
|
- if (!(sd->flags & (SD_SHARE_PKG_RESOURCES | SD_ASYM_PACKING)))
|
|
|
- break;
|
|
|
}
|
|
|
+
|
|
|
+ sd = rcu_dereference(per_cpu(sd_asym, cpu));
|
|
|
+
|
|
|
+ if (sd && (cpumask_first_and(nohz.idle_cpus_mask,
|
|
|
+ sched_domain_span(sd)) < cpu))
|
|
|
+ goto need_kick_unlock;
|
|
|
+
|
|
|
rcu_read_unlock();
|
|
|
return 0;
|
|
|
|