lkml.org 
[lkml]   [2021]   [Jul]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 67/71] tcp: annotate data races around tp->mtu_info
    Date
    From: Eric Dumazet <edumazet@google.com>

    commit 561022acb1ce62e50f7a8258687a21b84282a4cb upstream.

    While tp->mtu_info is read while socket is owned, the write
    sides happen from err handlers (tcp_v[46]_mtu_reduced)
    which only own the socket spinlock.

    Fixes: 563d34d05786 ("tcp: dont drop MTU reduction indications")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/ipv4/tcp_ipv4.c | 4 ++--
    net/ipv6/tcp_ipv6.c | 4 ++--
    2 files changed, 4 insertions(+), 4 deletions(-)

    --- a/net/ipv4/tcp_ipv4.c
    +++ b/net/ipv4/tcp_ipv4.c
    @@ -343,7 +343,7 @@ void tcp_v4_mtu_reduced(struct sock *sk)

    if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))
    return;
    - mtu = tcp_sk(sk)->mtu_info;
    + mtu = READ_ONCE(tcp_sk(sk)->mtu_info);
    dst = inet_csk_update_pmtu(sk, mtu);
    if (!dst)
    return;
    @@ -512,7 +512,7 @@ int tcp_v4_err(struct sk_buff *icmp_skb,
    if (sk->sk_state == TCP_LISTEN)
    goto out;

    - tp->mtu_info = info;
    + WRITE_ONCE(tp->mtu_info, info);
    if (!sock_owned_by_user(sk)) {
    tcp_v4_mtu_reduced(sk);
    } else {
    --- a/net/ipv6/tcp_ipv6.c
    +++ b/net/ipv6/tcp_ipv6.c
    @@ -347,7 +347,7 @@ static void tcp_v6_mtu_reduced(struct so
    if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))
    return;

    - dst = inet6_csk_update_pmtu(sk, tcp_sk(sk)->mtu_info);
    + dst = inet6_csk_update_pmtu(sk, READ_ONCE(tcp_sk(sk)->mtu_info));
    if (!dst)
    return;

    @@ -438,7 +438,7 @@ static int tcp_v6_err(struct sk_buff *sk
    if (!ip6_sk_accept_pmtu(sk))
    goto out;

    - tp->mtu_info = ntohl(info);
    + WRITE_ONCE(tp->mtu_info, ntohl(info));
    if (!sock_owned_by_user(sk))
    tcp_v6_mtu_reduced(sk);
    else if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED,

    \
     
     \ /
      Last update: 2021-07-22 19:34    [W:4.423 / U:0.288 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site