While reading sysctl_tcp_min_snd_mss, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
Unified · Split
| @@ -1719,7 +1719,8 @@ static inline int __tcp_mtu_to_mss(struct sock *sk, int pmtu) · 1718 unmodified lines | |||
| 1719 | mss_now -= icsk->icsk_ext_hdr_len; | 1719 | mss_now -= icsk->icsk_ext_hdr_len; |
| 1720 | 1720 | ||
| 1721 | /* Then reserve room for full set of TCP options and 8 bytes of data */ | 1721 | /* Then reserve room for full set of TCP options and 8 bytes of data */ |
| 1722 | mss_now = max(mss_now, sock_net(sk)->ipv4.sysctl_tcp_min_snd_mss); | 1722 | mss_now = max(mss_now, |
| 1723 | READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_min_snd_mss)); | ||
| 1723 | return mss_now; | 1724 | return mss_now; |
| 1724 | } | 1725 | } |
| 1725 | 1726 | ||
| @@ -173,7 +173,7 @@ static void tcp_mtu_probing(struct inet_connection_sock *icsk, struct sock *sk) · 172 unmodified lines | |||
| 173 | mss = tcp_mtu_to_mss(sk, icsk->icsk_mtup.search_low) >> 1; | 173 | mss = tcp_mtu_to_mss(sk, icsk->icsk_mtup.search_low) >> 1; |
| 174 | mss = min(READ_ONCE(net->ipv4.sysctl_tcp_base_mss), mss); | 174 | mss = min(READ_ONCE(net->ipv4.sysctl_tcp_base_mss), mss); |
| 175 | mss = max(mss, net->ipv4.sysctl_tcp_mtu_probe_floor); | 175 | mss = max(mss, net->ipv4.sysctl_tcp_mtu_probe_floor); |
| 176 | mss = max(mss, net->ipv4.sysctl_tcp_min_snd_mss); | 176 | mss = max(mss, READ_ONCE(net->ipv4.sysctl_tcp_min_snd_mss)); |
| 177 | icsk->icsk_mtup.search_low = tcp_mss_to_mtu(sk, mss); | 177 | icsk->icsk_mtup.search_low = tcp_mss_to_mtu(sk, mss); |
| 178 | } | 178 | } |
| 179 | tcp_sync_mss(sk, icsk->icsk_pmtu_cookie); | 179 | tcp_sync_mss(sk, icsk->icsk_pmtu_cookie); |