Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 90713948 authored by Valentin Schneider's avatar Valentin Schneider Committed by Chris Redpath
Browse files

FROMLIST: 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 <mingo@redhat.com>
cc: Peter Zijlstra <peterz@infradead.org>

Signed-off-by: default avatarValentin Schneider <valentin.schneider@arm.com>
[from https://lore.kernel.org/lkml/1530699470-29808-9-git-send-email-morten.rasmussen@arm.com/

]
Signed-off-by: default avatarValentin Schneider <valentin.schneider@arm.com>
Signed-off-by: default avatarChris Redpath <chris.redpath@arm.com>
Change-Id: I14ce007f916bffd6a7938b7d56faf2b384d27887
parent 14b1b1f5
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -9332,8 +9332,8 @@ static inline void update_sd_lb_stats(struct lb_env *env, struct sd_lb_stats *sd

	if (!lb_sd_parent(env->sd)) {
		/* update overload indicator if we are at root domain */
		if (env->dst_rq->rd->overload != overload)
			env->dst_rq->rd->overload = overload;
		if (READ_ONCE(env->dst_rq->rd->overload) != overload)
			WRITE_ONCE(env->dst_rq->rd->overload, overload);
	}

	if (overutilized)
@@ -10206,7 +10206,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);
		if (sd)
+2 −2
Original line number Diff line number Diff line
@@ -1654,8 +1654,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
	}