mptcp: annotate lockless accesses around read-mostly fields
authorPaolo Abeni <pabeni@redhat.com>
Fri, 2 Feb 2024 11:40:11 +0000 (12:40 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 5 Feb 2024 11:18:09 +0000 (11:18 +0000)
The following MPTCP socket fields:

 - can_ack
 - fully_established
 - rcv_data_fin
 - snd_data_fin_enable
 - rcv_fastclose
 - use_64bit_ack

are accessed without any lock, add the appropriate annotation.

The schema is safe as each field can change its value at most
once in the whole mptcp socket life cycle.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <martineau@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mptcp/protocol.c
net/mptcp/sockopt.c

index 4478ddd3b5fa762e14701d2eac48afe93435ca51..ad39f54b3a81b6745f28cb8d0ed8907bf194ac26 100644 (file)
@@ -3149,16 +3149,16 @@ static int mptcp_disconnect(struct sock *sk, int flags)
        msk->cb_flags = 0;
        msk->push_pending = 0;
        msk->recovery = false;
-       msk->can_ack = false;
-       msk->fully_established = false;
-       msk->rcv_data_fin = false;
-       msk->snd_data_fin_enable = false;
-       msk->rcv_fastclose = false;
-       msk->use_64bit_ack = false;
-       msk->bytes_consumed = 0;
+       WRITE_ONCE(msk->can_ack, false);
+       WRITE_ONCE(msk->fully_established, false);
+       WRITE_ONCE(msk->rcv_data_fin, false);
+       WRITE_ONCE(msk->snd_data_fin_enable, false);
+       WRITE_ONCE(msk->rcv_fastclose, false);
+       WRITE_ONCE(msk->use_64bit_ack, false);
        WRITE_ONCE(msk->csum_enabled, mptcp_is_checksum_enabled(sock_net(sk)));
        mptcp_pm_data_reset(msk);
        mptcp_ca_reset(sk);
+       msk->bytes_consumed = 0;
        msk->bytes_acked = 0;
        msk->bytes_received = 0;
        msk->bytes_sent = 0;
index c40f1428e6020236db6e13317cde86d7627bce9e..da37e4541a5d7e22d87351498482690c01e550b3 100644 (file)
@@ -942,7 +942,7 @@ void mptcp_diag_fill_info(struct mptcp_sock *msk, struct mptcp_info *info)
        mptcp_data_unlock(sk);
 
        slow = lock_sock_fast(sk);
-       info->mptcpi_csum_enabled = msk->csum_enabled;
+       info->mptcpi_csum_enabled = READ_ONCE(msk->csum_enabled);
        info->mptcpi_token = msk->token;
        info->mptcpi_write_seq = msk->write_seq;
        info->mptcpi_retransmits = inet_csk(sk)->icsk_retransmits;