From: Valentin Schneider Date: Wed, 4 Jul 2018 10:17:46 +0000 (+0100) Subject: sched: Wrap rq->rd->overload accesses with READ/WRITE_ONCE X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c432d15764db5063175e45a971df351647a54145;p=platform%2Fkernel%2Flinux-exynos.git sched: Wrap rq->rd->overload accesses with READ/WRITE_ONCE This variable can be read and set locklessly within update_sd_lb_stats(). As such, READ/WRITE_ONCE are added to make sure nothing terribly wrong can happen because of the compiler. cc: Ingo Molnar cc: Peter Zijlstra Signed-off-by: Valentin Schneider Signed-off-by: Morten Rasmussen --- diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 682a98524cfe..b15e2bb4cd42 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -8271,7 +8271,7 @@ next_group: struct root_domain *rd = env->dst_rq->rd; /* update overload indicator if we are at root domain */ - rd->overload = sg_status & SG_OVERLOAD; + WRITE_ONCE(rd->overload, sg_status & SG_OVERLOAD); /* Update over-utilization (tipping point, U >= 0) indicator */ WRITE_ONCE(rd->overutilized, sg_status & SG_OVERUTILIZED); @@ -9724,7 +9724,7 @@ static int idle_balance(struct rq *this_rq, struct rq_flags *rf) rq_unpin_lock(this_rq, rf); if (this_rq->avg_idle < sysctl_sched_migration_cost || - !this_rq->rd->overload) { + !READ_ONCE(this_rq->rd->overload)) { rcu_read_lock(); sd = rcu_dereference_check_sched_domain(this_rq->sd); diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 25057135ee6e..73d4432f66a2 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -1720,8 +1720,8 @@ static inline void add_nr_running(struct rq *rq, unsigned count) if (prev_nr < 2 && rq->nr_running >= 2) { #ifdef CONFIG_SMP - if (!rq->rd->overload) - rq->rd->overload = 1; + if (!READ_ONCE(rq->rd->overload)) + WRITE_ONCE(rq->rd->overload, 1); #endif }