diff --git a/[refs] b/[refs] index b856ab7c242d..de514d67588c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: cd490c5b285544dc1319cf79c2ca0528a6447f61 +refs/heads/master: 067491b7313c41f49607fce782d29344d1472587 diff --git a/trunk/kernel/sched/fair.c b/trunk/kernel/sched/fair.c index 6482136f8991..a4d2b7abc3cd 100644 --- a/trunk/kernel/sched/fair.c +++ b/trunk/kernel/sched/fair.c @@ -5088,23 +5088,28 @@ static inline int nohz_kick_needed(struct rq *rq, int cpu) if (rq->nr_running >= 2) 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); if (sd->flags & SD_SHARE_PKG_RESOURCES && nr_busy > 1) - goto need_kick; + goto need_kick_unlock; if (sd->flags & SD_ASYM_PACKING && nr_busy != sg->group_weight && (cpumask_first_and(nohz.idle_cpus_mask, sched_domain_span(sd)) < cpu)) - goto need_kick; + goto need_kick_unlock; if (!(sd->flags & (SD_SHARE_PKG_RESOURCES | SD_ASYM_PACKING))) break; } + rcu_read_unlock(); return 0; + +need_kick_unlock: + rcu_read_unlock(); need_kick: return 1; }