|
@@ -402,6 +402,7 @@ void tcp_init_sock(struct sock *sk)
|
|
|
tp->snd_ssthresh = TCP_INFINITE_SSTHRESH;
|
|
|
tp->snd_cwnd_clamp = ~0;
|
|
|
tp->mss_cache = TCP_MSS_DEFAULT;
|
|
|
+ u64_stats_init(&tp->syncp);
|
|
|
|
|
|
tp->reordering = sysctl_tcp_reordering;
|
|
|
tcp_enable_early_retrans(tp);
|
|
@@ -2598,6 +2599,7 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info)
|
|
|
const struct tcp_sock *tp = tcp_sk(sk);
|
|
|
const struct inet_connection_sock *icsk = inet_csk(sk);
|
|
|
u32 now = tcp_time_stamp;
|
|
|
+ unsigned int start;
|
|
|
u32 rate;
|
|
|
|
|
|
memset(info, 0, sizeof(*info));
|
|
@@ -2665,10 +2667,11 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info)
|
|
|
rate = READ_ONCE(sk->sk_max_pacing_rate);
|
|
|
info->tcpi_max_pacing_rate = rate != ~0U ? rate : ~0ULL;
|
|
|
|
|
|
- spin_lock_bh(&sk->sk_lock.slock);
|
|
|
- info->tcpi_bytes_acked = tp->bytes_acked;
|
|
|
- info->tcpi_bytes_received = tp->bytes_received;
|
|
|
- spin_unlock_bh(&sk->sk_lock.slock);
|
|
|
+ do {
|
|
|
+ start = u64_stats_fetch_begin_irq(&tp->syncp);
|
|
|
+ info->tcpi_bytes_acked = tp->bytes_acked;
|
|
|
+ info->tcpi_bytes_received = tp->bytes_received;
|
|
|
+ } while (u64_stats_fetch_retry_irq(&tp->syncp, start));
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(tcp_get_info);
|
|
|
|