mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-13 14:24:11 +08:00
net: annotate data-races around sk->sk_max_pacing_rate
sk_getsockopt() runs locklessly. This means sk->sk_max_pacing_rate
can be read while other threads are changing its value.
Fixes: 62748f32d5
("net: introduce SO_MAX_PACING_RATE")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
c76a032889
commit
ea7f45ef77
@ -1439,7 +1439,8 @@ set_sndbuf:
|
||||
cmpxchg(&sk->sk_pacing_status,
|
||||
SK_PACING_NONE,
|
||||
SK_PACING_NEEDED);
|
||||
sk->sk_max_pacing_rate = ulval;
|
||||
/* Pairs with READ_ONCE() from sk_getsockopt() */
|
||||
WRITE_ONCE(sk->sk_max_pacing_rate, ulval);
|
||||
sk->sk_pacing_rate = min(sk->sk_pacing_rate, ulval);
|
||||
break;
|
||||
}
|
||||
@ -1903,12 +1904,14 @@ int sk_getsockopt(struct sock *sk, int level, int optname,
|
||||
#endif
|
||||
|
||||
case SO_MAX_PACING_RATE:
|
||||
/* The READ_ONCE() pair with the WRITE_ONCE() in sk_setsockopt() */
|
||||
if (sizeof(v.ulval) != sizeof(v.val) && len >= sizeof(v.ulval)) {
|
||||
lv = sizeof(v.ulval);
|
||||
v.ulval = sk->sk_max_pacing_rate;
|
||||
v.ulval = READ_ONCE(sk->sk_max_pacing_rate);
|
||||
} else {
|
||||
/* 32bit version */
|
||||
v.val = min_t(unsigned long, sk->sk_max_pacing_rate, ~0U);
|
||||
v.val = min_t(unsigned long, ~0U,
|
||||
READ_ONCE(sk->sk_max_pacing_rate));
|
||||
}
|
||||
break;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user