diff options
author | Eric Dumazet <edumazet@google.com> | 2015-04-16 19:12:28 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-04-17 13:28:31 -0400 |
commit | fad9dfefea6405039491e7e4fc21fb6e59e7d26c (patch) | |
tree | db00e0628d50740f70b98effd4f39eed46161dd4 | |
parent | c3ffe6d2c9733729307799a60e1ae09a9878e697 (diff) |
tcp: tcp_get_info() should fetch socket fields once
tcp_get_info() can be called without holding socket lock,
so any socket fields can change under us.
Use READ_ONCE() to fetch sk_pacing_rate and sk_max_pacing_rate
Fixes: 977cb0ecf82e ("tcp: add pacing_rate information into tcp_info")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/ipv4/tcp.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 18e3a12eb1b2..59c8a027721b 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -2595,6 +2595,7 @@ void tcp_get_info(const struct sock *sk, struct tcp_info *info) | |||
2595 | const struct tcp_sock *tp = tcp_sk(sk); | 2595 | const struct tcp_sock *tp = tcp_sk(sk); |
2596 | const struct inet_connection_sock *icsk = inet_csk(sk); | 2596 | const struct inet_connection_sock *icsk = inet_csk(sk); |
2597 | u32 now = tcp_time_stamp; | 2597 | u32 now = tcp_time_stamp; |
2598 | u32 rate; | ||
2598 | 2599 | ||
2599 | memset(info, 0, sizeof(*info)); | 2600 | memset(info, 0, sizeof(*info)); |
2600 | 2601 | ||
@@ -2655,10 +2656,11 @@ void tcp_get_info(const struct sock *sk, struct tcp_info *info) | |||
2655 | 2656 | ||
2656 | info->tcpi_total_retrans = tp->total_retrans; | 2657 | info->tcpi_total_retrans = tp->total_retrans; |
2657 | 2658 | ||
2658 | info->tcpi_pacing_rate = sk->sk_pacing_rate != ~0U ? | 2659 | rate = READ_ONCE(sk->sk_pacing_rate); |
2659 | sk->sk_pacing_rate : ~0ULL; | 2660 | info->tcpi_pacing_rate = rate != ~0U ? rate : ~0ULL; |
2660 | info->tcpi_max_pacing_rate = sk->sk_max_pacing_rate != ~0U ? | 2661 | |
2661 | sk->sk_max_pacing_rate : ~0ULL; | 2662 | rate = READ_ONCE(sk->sk_max_pacing_rate); |
2663 | info->tcpi_max_pacing_rate = rate != ~0U ? rate : ~0ULL; | ||
2662 | } | 2664 | } |
2663 | EXPORT_SYMBOL_GPL(tcp_get_info); | 2665 | EXPORT_SYMBOL_GPL(tcp_get_info); |
2664 | 2666 | ||