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

Commit ba537427 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

tcp: use ACCESS_ONCE() in tcp_update_pacing_rate()



sk_pacing_rate is read by sch_fq packet scheduler at any time,
with no synchronization, so make sure we update it in a
sensible way. ACCESS_ONCE() is how we instruct compiler
to not do stupid things, like using the memory location
as a temporary variable.

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 634fb979
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -755,7 +755,12 @@ static void tcp_update_pacing_rate(struct sock *sk)
	if (tp->srtt > 8 + 2)
		do_div(rate, tp->srtt);

	sk->sk_pacing_rate = min_t(u64, rate, sk->sk_max_pacing_rate);
	/* ACCESS_ONCE() is needed because sch_fq fetches sk_pacing_rate
	 * without any lock. We want to make sure compiler wont store
	 * intermediate values in this location.
	 */
	ACCESS_ONCE(sk->sk_pacing_rate) = min_t(u64, rate,
						sk->sk_max_pacing_rate);
}

/* Calculate rto without backoff.  This is the second half of Van Jacobson's