aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched/fair.c
diff options
context:
space:
mode:
authorPeter Zijlstra <peterz@infradead.org>2011-12-07 08:32:08 -0500
committerIngo Molnar <mingo@elte.hu>2011-12-07 23:45:48 -0500
commit067491b7313c41f49607fce782d29344d1472587 (patch)
tree06f6352372038f7f4171c8d8fc869e686665d32f /kernel/sched/fair.c
parentcd490c5b285544dc1319cf79c2ca0528a6447f61 (diff)
sched, nohz: Fix missing RCU read lock
Yong Zhang reported: > [ INFO: suspicious RCU usage. ] > kernel/sched/fair.c:5091 suspicious rcu_dereference_check() usage! This is due to the sched_domain stuff being RCU protected and commit 0b005cf5 ("sched, nohz: Implement sched group, domain aware nohz idle load balancing") overlooking this fact. The sd variable only lives inside the for_each_domain() block, so we only need to wrap that. Reported-by: Yong Zhang <yong.zhang0@gmail.com> Tested-by: Yong Zhang <yong.zhang0@gmail.com> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Suresh Siddha <suresh.b.siddha@intel.com> Link: http://lkml.kernel.org/r/1323264728.32012.107.camel@twins Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/sched/fair.c')
-rw-r--r--kernel/sched/fair.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 6482136f8991..a4d2b7abc3cd 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -5088,23 +5088,28 @@ static inline int nohz_kick_needed(struct rq *rq, int cpu)
5088 if (rq->nr_running >= 2) 5088 if (rq->nr_running >= 2)
5089 goto need_kick; 5089 goto need_kick;
5090 5090
5091 rcu_read_lock();
5091 for_each_domain(cpu, sd) { 5092 for_each_domain(cpu, sd) {
5092 struct sched_group *sg = sd->groups; 5093 struct sched_group *sg = sd->groups;
5093 struct sched_group_power *sgp = sg->sgp; 5094 struct sched_group_power *sgp = sg->sgp;
5094 int nr_busy = atomic_read(&sgp->nr_busy_cpus); 5095 int nr_busy = atomic_read(&sgp->nr_busy_cpus);
5095 5096
5096 if (sd->flags & SD_SHARE_PKG_RESOURCES && nr_busy > 1) 5097 if (sd->flags & SD_SHARE_PKG_RESOURCES && nr_busy > 1)
5097 goto need_kick; 5098 goto need_kick_unlock;
5098 5099
5099 if (sd->flags & SD_ASYM_PACKING && nr_busy != sg->group_weight 5100 if (sd->flags & SD_ASYM_PACKING && nr_busy != sg->group_weight
5100 && (cpumask_first_and(nohz.idle_cpus_mask, 5101 && (cpumask_first_and(nohz.idle_cpus_mask,
5101 sched_domain_span(sd)) < cpu)) 5102 sched_domain_span(sd)) < cpu))
5102 goto need_kick; 5103 goto need_kick_unlock;
5103 5104
5104 if (!(sd->flags & (SD_SHARE_PKG_RESOURCES | SD_ASYM_PACKING))) 5105 if (!(sd->flags & (SD_SHARE_PKG_RESOURCES | SD_ASYM_PACKING)))
5105 break; 5106 break;
5106 } 5107 }
5108 rcu_read_unlock();
5107 return 0; 5109 return 0;
5110
5111need_kick_unlock:
5112 rcu_read_unlock();
5108need_kick: 5113need_kick:
5109 return 1; 5114 return 1;
5110} 5115}