From nobody Mon Sep 16 20:05:49 2024 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E32BB168C9 for ; Wed, 17 May 2023 11:35:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1684323349; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kcsuNVRKbJOO8K51jJnXzwFWg2sNweGKXoA7u8+SAkc=; b=aNeDRm1fm5jZFr/HQZemHtds1uTa1sd/3maj5JulqgCQY54IWIT8OLxWSmEKTHCz9E+out vBGZv7Gu8X/J3yNUahuX57NHNwAIznIV5qH+tgYUW83hxMYMfOYPS01FECTKdmVemMwmIa einy+pxBRGGWUSGD9YnnF49AWP2Nj8E= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-368-J_BwL1FjNVOLOhzJamzxKQ-1; Wed, 17 May 2023 07:35:46 -0400 X-MC-Unique: J_BwL1FjNVOLOhzJamzxKQ-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 67E5D3815F65; Wed, 17 May 2023 11:35:46 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.193.56]) by smtp.corp.redhat.com (Postfix) with ESMTP id CC9E163F7E; Wed, 17 May 2023 11:35:45 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Cc: Christoph Paasch Subject: [PATCH mptcp-net 4/4] mptcp: add annotations around sk->sk_shutdown accesses Date: Wed, 17 May 2023 13:35:36 +0200 Message-Id: <4ea2e7aeea3fdfdaeaca9aa431ca66df205f68fb.1684321532.git.pabeni@redhat.com> In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.5 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8"; x-default="true" Christoph reported the mptcp variant of a recently addressed plain TCP issue. Similar to commit e14cadfd80d7 ("tcp: add annotations around sk->sk_shutdown accesses") add READ/WRITE ONCE annotations to silence KCSAN reports around lockless sk_shutdown access. Fixes: 71ba088ce0aa ("mptcp: cleanup accept and poll") Reported-by: Christoph Paasch Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/401 Signed-off-by: Paolo Abeni --- net/mptcp/protocol.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 379ae468d755..21c19a0e0dfb 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -603,7 +603,7 @@ static bool mptcp_check_data_fin(struct sock *sk) WRITE_ONCE(msk->ack_seq, msk->ack_seq + 1); WRITE_ONCE(msk->rcv_data_fin, 0); =20 - sk->sk_shutdown |=3D RCV_SHUTDOWN; + WRITE_ONCE(sk->sk_shutdown, sk->sk_shutdown | RCV_SHUTDOWN); smp_mb__before_atomic(); /* SHUTDOWN must be visible first */ =20 switch (sk->sk_state) { @@ -910,7 +910,7 @@ static void mptcp_check_for_eof(struct mptcp_sock *msk) /* hopefully temporary hack: propagate shutdown status * to msk, when all subflows agree on it */ - sk->sk_shutdown |=3D RCV_SHUTDOWN; + WRITE_ONCE(sk->sk_shutdown, sk->sk_shutdown | RCV_SHUTDOWN); =20 smp_mb__before_atomic(); /* SHUTDOWN must be visible first */ sk->sk_data_ready(sk); @@ -2553,7 +2553,7 @@ static void mptcp_check_fastclose(struct mptcp_sock *= msk) } =20 inet_sk_state_store(sk, TCP_CLOSE); - sk->sk_shutdown =3D SHUTDOWN_MASK; + WRITE_ONCE(sk->sk_shutdown, SHUTDOWN_MASK); smp_mb__before_atomic(); /* SHUTDOWN must be visible first */ set_bit(MPTCP_WORK_CLOSE_SUBFLOW, &msk->flags); =20 @@ -3006,7 +3006,7 @@ bool __mptcp_close(struct sock *sk, long timeout) bool do_cancel_work =3D false; int subflows_alive =3D 0; =20 - sk->sk_shutdown =3D SHUTDOWN_MASK; + WRITE_ONCE(sk->sk_shutdown, SHUTDOWN_MASK); =20 if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE)) { mptcp_listen_inuse_dec(sk); @@ -3149,7 +3149,7 @@ static int mptcp_disconnect(struct sock *sk, int flag= s) mptcp_pm_data_reset(msk); mptcp_ca_reset(sk); =20 - sk->sk_shutdown =3D 0; + WRITE_ONCE(sk->sk_shutdown, 0); sk_error_report(sk); return 0; } @@ -3856,9 +3856,6 @@ static __poll_t mptcp_check_writeable(struct mptcp_so= ck *msk) { struct sock *sk =3D (struct sock *)msk; =20 - if (unlikely(sk->sk_shutdown & SEND_SHUTDOWN)) - return EPOLLOUT | EPOLLWRNORM; - if (sk_stream_is_writeable(sk)) return EPOLLOUT | EPOLLWRNORM; =20 @@ -3876,6 +3873,7 @@ static __poll_t mptcp_poll(struct file *file, struct = socket *sock, struct sock *sk =3D sock->sk; struct mptcp_sock *msk; __poll_t mask =3D 0; + u8 shutdown; int state; =20 msk =3D mptcp_sk(sk); @@ -3892,17 +3890,22 @@ static __poll_t mptcp_poll(struct file *file, struc= t socket *sock, return inet_csk_listen_poll(ssock->sk); } =20 + shutdown =3D READ_ONCE(sk->sk_shutdown); + if (shutdown =3D=3D SHUTDOWN_MASK || state =3D=3D TCP_CLOSE) + mask |=3D EPOLLHUP; + if (shutdown & RCV_SHUTDOWN) + mask |=3D EPOLLIN | EPOLLRDNORM | EPOLLRDHUP; + if (state !=3D TCP_SYN_SENT && state !=3D TCP_SYN_RECV) { mask |=3D mptcp_check_readable(msk); - mask |=3D mptcp_check_writeable(msk); + if (shutdown & SEND_SHUTDOWN) + mask |=3D EPOLLOUT | EPOLLWRNORM; + else + mask |=3D mptcp_check_writeable(msk); } else if (state =3D=3D TCP_SYN_SENT && inet_sk(sk)->defer_connect) { /* cf tcp_poll() note about TFO */ mask |=3D EPOLLOUT | EPOLLWRNORM; } - if (sk->sk_shutdown =3D=3D SHUTDOWN_MASK || state =3D=3D TCP_CLOSE) - mask |=3D EPOLLHUP; - if (sk->sk_shutdown & RCV_SHUTDOWN) - mask |=3D EPOLLIN | EPOLLRDNORM | EPOLLRDHUP; =20 /* This barrier is coupled with smp_wmb() in __mptcp_error_report() */ smp_rmb(); --=20 2.40.1