From nobody Tue May 21 19:15:07 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 2A2D5107B5 for ; Mon, 10 Jul 2023 12:55:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1688993724; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=CaDbT0AbMW2VG7IkI6iHpvyId7hdGT/wZljMZEIMCT4=; b=SA/Y7if4M7E1M17Fq0/tN+NOKqHJZDN5TRJ27WUV0k0jatf36kLg+9ynmdvQIuA4V6vXBE ZuJf7XxnI3lrwQRuzNGA31Z0zL10DyddJJKbLPHURZN++TL3NnjzBHFtKGyY+Y9bzvVtBf 9Crz9ta76UznyvmDZ8S1X5ZmHAXHi68= 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-434-PHXmCYJ0OFaLXmL3jn0ETQ-1; Mon, 10 Jul 2023 08:55:23 -0400 X-MC-Unique: PHXmCYJ0OFaLXmL3jn0ETQ-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 615641C08782 for ; Mon, 10 Jul 2023 12:55:23 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.45.225.74]) by smtp.corp.redhat.com (Postfix) with ESMTP id E5A66C51488 for ; Mon, 10 Jul 2023 12:55:22 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next 01/14] mptcp: more accurate NL event generation. Date: Mon, 10 Jul 2023 14:54:56 +0200 Message-ID: <2dff178d492953373f5d7215aea15676b0e6079c.1688993569.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.8 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" Currently the mptcp code generate a "new listener" event even if the actual listen() syscall fails. Address the issue moving the event generation call under the successful branch. Signed-off-by: Paolo Abeni Reviewed-by: Mat Martineau --- this could possibly go via -net, but is used by later patches and is not really critical IMHO. Eventually the additional tag would be: Fixes: f8c9dfbd875b ("mptcp: add pm listener events") --- net/mptcp/protocol.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 497bc17b5223..8b5c78f582f7 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3762,10 +3762,9 @@ static int mptcp_listen(struct socket *sock, int bac= klog) if (!err) { sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); mptcp_copy_inaddrs(sk, ssock->sk); + mptcp_event_pm_listener(ssock->sk, MPTCP_EVENT_LISTENER_CREATED); } =20 - mptcp_event_pm_listener(ssock->sk, MPTCP_EVENT_LISTENER_CREATED); - unlock: release_sock(sk); return err; --=20 2.41.0 From nobody Tue May 21 19:15:07 2024 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 E19FA10975 for ; Mon, 10 Jul 2023 12:55:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1688993725; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=jmXeZSV87nwifsUiMNUyO3NvNPSNqQAzW63NHEbdwhg=; b=IJ+LDwBF4cDeJxD9GDHrv0kaM+sQ/psj1blv17XefqSkbxPelwFchCx9U4PWmZfzyrxzET t0M8qWi2iqxUsDAsbWViap7dPiHHAeEdt3iDNdtZGKgHv3do3dCC6XqHpik1CXtBZCkRyL SrrBF/C0ExTZaUxR5SESIJf82/3hvtk= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-659--dgvT5SVNa-0_wXCWzHQfQ-1; Mon, 10 Jul 2023 08:55:24 -0400 X-MC-Unique: -dgvT5SVNa-0_wXCWzHQfQ-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 3C3C386F122 for ; Mon, 10 Jul 2023 12:55:24 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.45.225.74]) by smtp.corp.redhat.com (Postfix) with ESMTP id A6883C09A09 for ; Mon, 10 Jul 2023 12:55:23 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next 02/14] mptcp: avoid unneeded mptcp_token_destroy() calls Date: Mon, 10 Jul 2023 14:54:57 +0200 Message-ID: <7a250eadfc33ac621c10f330b825754838afe7b5.1688993569.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.8 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" The mptcp protocol currently clears the msk token both at connect() and listen() time. That was necessary before the mptcp protocol gained a full disconnect implmenetation, but after commit b29fcfb54cd7 ("mptcp: full disconnect implementation") such calls are no more necessary and a bit confusing. Just drop them. Signed-off-by: Paolo Abeni --- net/mptcp/protocol.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 8b5c78f582f7..17174bdae1ca 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3634,7 +3634,6 @@ static int mptcp_connect(struct sock *sk, struct sock= addr *uaddr, int addr_len) if (IS_ERR(ssock)) return PTR_ERR(ssock); =20 - mptcp_token_destroy(msk); inet_sk_state_store(sk, TCP_SYN_SENT); subflow =3D mptcp_subflow_ctx(ssock->sk); #ifdef CONFIG_TCP_MD5SIG @@ -3753,7 +3752,6 @@ static int mptcp_listen(struct socket *sock, int back= log) goto unlock; } =20 - mptcp_token_destroy(msk); inet_sk_state_store(sk, TCP_LISTEN); sock_set_flag(sk, SOCK_RCU_FREE); =20 --=20 2.41.0 From nobody Tue May 21 19:15:07 2024 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 7D8B9111A9 for ; Mon, 10 Jul 2023 12:55:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1688993726; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=r1dmkK5CnnUR+ygKcTloGG9YQa8l+JT2lmCLY2rOQ74=; b=eMci8eo3Ya1kedlvuriEBQhIQTWsS7UrA+t6fJzKW4h4Sd+w4SJKuCRf9B7izpSujacBvu gcNK9LpkdITLzLkBSfrnI1nGUn7k1ezPaqHcn88N8wwWWE90AO5n7DxxSZIEhnbEOqL7J6 kKf6lJoDYzK0G3JxOH5iztMFcOxBzn8= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-643-vKcV8ChwOIKlJc-4nZaHVw-1; Mon, 10 Jul 2023 08:55:25 -0400 X-MC-Unique: vKcV8ChwOIKlJc-4nZaHVw-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id F1939185A78F for ; Mon, 10 Jul 2023 12:55:24 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.45.225.74]) by smtp.corp.redhat.com (Postfix) with ESMTP id 821D2C09A09 for ; Mon, 10 Jul 2023 12:55:24 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next 03/14] mptcp: avoid additional __inet_stream_connect() call Date: Mon, 10 Jul 2023 14:54:58 +0200 Message-ID: <3f427fdc84212cde2d5ad09a46925a43a4a0fae7.1688993569.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.8 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" The mptcp protocol maintains an additional socket just to easily invoke a few stream operations on the first subflow. One of them is __inet_stream_connect(). We are going to remove the first subflow socket soon, so avoid the addictional indirection via at connect time, calling directly into the sock-level connect() ops. No functional change intended. Signed-off-by: Paolo Abeni --- net/mptcp/protocol.c | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 17174bdae1ca..7445a3cf8812 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3629,22 +3629,24 @@ static int mptcp_connect(struct sock *sk, struct so= ckaddr *uaddr, int addr_len) struct mptcp_sock *msk =3D mptcp_sk(sk); struct socket *ssock; int err =3D -EINVAL; + struct sock *ssk; =20 ssock =3D __mptcp_nmpc_socket(msk); if (IS_ERR(ssock)) return PTR_ERR(ssock); =20 inet_sk_state_store(sk, TCP_SYN_SENT); - subflow =3D mptcp_subflow_ctx(ssock->sk); + ssk =3D msk->first; + subflow =3D mptcp_subflow_ctx(ssk); #ifdef CONFIG_TCP_MD5SIG /* no MPTCP if MD5SIG is enabled on this socket or we may run out of * TCP option space. */ - if (rcu_access_pointer(tcp_sk(ssock->sk)->md5sig_info)) + if (rcu_access_pointer(tcp_sk(ssk)->md5sig_info)) mptcp_subflow_early_fallback(msk, subflow); #endif - if (subflow->request_mptcp && mptcp_token_new_connect(ssock->sk)) { - MPTCP_INC_STATS(sock_net(ssock->sk), MPTCP_MIB_TOKENFALLBACKINIT); + if (subflow->request_mptcp && mptcp_token_new_connect(ssk)) { + MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_TOKENFALLBACKINIT); mptcp_subflow_early_fallback(msk, subflow); } if (likely(!__mptcp_check_fallback(msk))) @@ -3653,21 +3655,37 @@ static int mptcp_connect(struct sock *sk, struct so= ckaddr *uaddr, int addr_len) /* if reaching here via the fastopen/sendmsg path, the caller already * acquired the subflow socket lock, too. */ - if (msk->fastopening) - err =3D __inet_stream_connect(ssock, uaddr, addr_len, O_NONBLOCK, 1); - else - err =3D inet_stream_connect(ssock, uaddr, addr_len, O_NONBLOCK); - inet_sk(sk)->defer_connect =3D inet_sk(ssock->sk)->defer_connect; + if (!msk->fastopening) + lock_sock(ssk); + + if (ssk->sk_state !=3D TCP_CLOSE) + goto out; + + if (BPF_CGROUP_PRE_CONNECT_ENABLED(ssk)) { + err =3D ssk->sk_prot->pre_connect(ssk, uaddr, addr_len); + if (err) + goto out; + } + + err =3D ssk->sk_prot->connect(ssk, uaddr, addr_len); + if (err < 0) + goto out; + + inet_sk(sk)->defer_connect =3D inet_sk(ssk)->defer_connect; + +out: + if (!msk->fastopening) + release_sock(ssk); =20 /* on successful connect, the msk state will be moved to established by * subflow_finish_connect() */ if (unlikely(err && err !=3D -EINPROGRESS)) { - inet_sk_state_store(sk, inet_sk_state_load(ssock->sk)); + inet_sk_state_store(sk, inet_sk_state_load(ssk)); return err; } =20 - mptcp_copy_inaddrs(sk, ssock->sk); + mptcp_copy_inaddrs(sk, ssk); =20 /* silence EINPROGRESS and let the caller inet_stream_connect * handle the connection in progress --=20 2.41.0 From nobody Tue May 21 19:15:07 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 646FF107B5 for ; Mon, 10 Jul 2023 12:55:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1688993727; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wa/ZlhG+k1IftF5d3O4sL6G2mLk2xt1uCCzpMzVoCPg=; b=ALyBzL9Et4i6XGNrieQaGLSg1BwyfmJlSqkyPi1KvpX1xoDuJJv05MAhE2Ea6X/wZWSt1r sKD9cPsWx1KaqrbQg8mfZeZpRyu2T2m0m9CWNrHxWopU8Nvb9ko54/4nAmYaDvw1YzwUOP j6F5RcFAPehMogK4yvD3Alk1WCDp90M= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-448-hAMIJ-G4PQe5QL3Ygl9KSQ-1; Mon, 10 Jul 2023 08:55:26 -0400 X-MC-Unique: hAMIJ-G4PQe5QL3Ygl9KSQ-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id B47F9185A792 for ; Mon, 10 Jul 2023 12:55:25 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.45.225.74]) by smtp.corp.redhat.com (Postfix) with ESMTP id 428DDC09A09 for ; Mon, 10 Jul 2023 12:55:25 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next 04/14] mptcp: avoid subflow socket usage in mptcp_get_port() Date: Mon, 10 Jul 2023 14:54:59 +0200 Message-ID: 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.8 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" We are going to remove the first subflow socket soon, so avoid accessing it in mptcp_get_port(). Instead, access directly the first subflow sock. Signed-off-by: Paolo Abeni --- net/mptcp/protocol.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 7445a3cf8812..fe4232870a37 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3445,14 +3445,12 @@ static void mptcp_unhash(struct sock *sk) static int mptcp_get_port(struct sock *sk, unsigned short snum) { struct mptcp_sock *msk =3D mptcp_sk(sk); - struct socket *ssock; =20 - ssock =3D msk->subflow; - pr_debug("msk=3D%p, subflow=3D%p", msk, ssock); - if (WARN_ON_ONCE(!ssock)) + pr_debug("msk=3D%p, ssk=3D%p", msk, msk->first); + if (WARN_ON_ONCE(!msk->first)) return -EINVAL; =20 - return inet_csk_get_port(ssock->sk, snum); + return inet_csk_get_port(msk->first, snum); } =20 void mptcp_finish_connect(struct sock *ssk) --=20 2.41.0 From nobody Tue May 21 19:15:07 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 B48BA80C for ; Mon, 10 Jul 2023 12:55:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1688993727; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cGxNXb5AAUHd4ml2+3mWQDjJlRRhPEzMsUZG876sX2s=; b=V+5TvXaE15EUwEb1LqDuPDFn/OdYImLvhjqQlKVF+DMkHIuU3ON4D93cu2gWYXJqgsJ132 OvKO9zkq6kakToRyHrLtBHaecvB0FkMiC6zvyOXUEIodaydtITH0VScift78l/pb9P+yda NLAFzEzmMxrSTIdU4FxMdC7z2pl61So= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-452-g8cQ4Kw1PIegx99PrHzyRA-1; Mon, 10 Jul 2023 08:55:26 -0400 X-MC-Unique: g8cQ4Kw1PIegx99PrHzyRA-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 79430101A54E for ; Mon, 10 Jul 2023 12:55:26 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.45.225.74]) by smtp.corp.redhat.com (Postfix) with ESMTP id 089CDC09A09 for ; Mon, 10 Jul 2023 12:55:25 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next 05/14] net: factor out inet{,6}_bind_sk helpers Date: Mon, 10 Jul 2023 14:55:00 +0200 Message-ID: <97fc442ffea35c420916bee59e8595290c0c28d2.1688993569.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.8 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" The mptcp protocol maintains an additional socket just to easily invoke a few stream operations on the first subflow. One of them is bind(). Factor out the helpers operating directly on the struct sock, to allow get rid of the above dependency in the next patch without duplicating the existing code. No functional changes intended. Signed-off-by: Paolo Abeni --- include/net/inet_common.h | 1 + include/net/ipv6.h | 1 + net/ipv4/af_inet.c | 8 ++++++-- net/ipv6/af_inet6.c | 10 +++++++--- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/include/net/inet_common.h b/include/net/inet_common.h index b86b8e21de7f..8e97de700991 100644 --- a/include/net/inet_common.h +++ b/include/net/inet_common.h @@ -42,6 +42,7 @@ int inet_shutdown(struct socket *sock, int how); int inet_listen(struct socket *sock, int backlog); void inet_sock_destruct(struct sock *sk); int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len); +int inet_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len); /* Don't allocate port at this moment, defer to connect. */ #define BIND_FORCE_ADDRESS_NO_PORT (1 << 0) /* Grab and release socket lock. */ diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 7332296eca44..af761504e2f6 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h @@ -1220,6 +1220,7 @@ void inet6_cleanup_sock(struct sock *sk); void inet6_sock_destruct(struct sock *sk); int inet6_release(struct socket *sock); int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len); +int inet6_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len); int inet6_getname(struct socket *sock, struct sockaddr *uaddr, int peer); int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 9b2ca2fcc5a1..2fd23437c1d2 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -431,9 +431,8 @@ int inet_release(struct socket *sock) } EXPORT_SYMBOL(inet_release); =20 -int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) +int inet_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len) { - struct sock *sk =3D sock->sk; u32 flags =3D BIND_WITH_LOCK; int err; =20 @@ -454,6 +453,11 @@ int inet_bind(struct socket *sock, struct sockaddr *ua= ddr, int addr_len) =20 return __inet_bind(sk, uaddr, addr_len, flags); } + +int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) +{ + return inet_bind_sk(sock->sk, uaddr, addr_len); +} EXPORT_SYMBOL(inet_bind); =20 int __inet_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len, diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 5d593ddc0347..d68959434256 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c @@ -435,10 +435,8 @@ static int __inet6_bind(struct sock *sk, struct sockad= dr *uaddr, int addr_len, goto out; } =20 -/* bind for INET6 API */ -int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) +int inet6_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len) { - struct sock *sk =3D sock->sk; u32 flags =3D BIND_WITH_LOCK; const struct proto *prot; int err =3D 0; @@ -462,6 +460,12 @@ int inet6_bind(struct socket *sock, struct sockaddr *u= addr, int addr_len) =20 return __inet6_bind(sk, uaddr, addr_len, flags); } + +/* bind for INET6 API */ +int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) +{ + return inet6_bind_sk(sock->sk, uaddr, addr_len); +} EXPORT_SYMBOL(inet6_bind); =20 int inet6_release(struct socket *sock) --=20 2.41.0 From nobody Tue May 21 19:15:07 2024 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 C5D7A111A9 for ; Mon, 10 Jul 2023 12:55:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1688993728; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=gbZLlRFWlZNfcU1wPKuhyU/k14sbw0TksznnDxYHH9M=; b=LgTyhPpk2BYnoX4hUJPda6nmnGUuQKr0E3zWXMnTUO5my6iQjzi57pCy7uv4dWoAm+N1AL TdkEkNLMDpsOJ5wED8V0iT45JQscwMlicNLQkqMlgQjhIMjtPamcKdiBk2EZWpSQEHRqHv TWPuHGID/QH2DYVKTcJvL7brt38FbKM= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-135-5RSmF8_fN4WLEo1P1aLP0w-1; Mon, 10 Jul 2023 08:55:27 -0400 X-MC-Unique: 5RSmF8_fN4WLEo1P1aLP0w-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 39EA480006E for ; Mon, 10 Jul 2023 12:55:27 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.45.225.74]) by smtp.corp.redhat.com (Postfix) with ESMTP id BDD01C09A09 for ; Mon, 10 Jul 2023 12:55:26 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next 06/14] mptcp: mptcp: avoid additional indirection in mptcp_bind() Date: Mon, 10 Jul 2023 14:55:01 +0200 Message-ID: <9a02286946adbca8844050396ef04c31f2969c2c.1688993569.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.8 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" We are going to remove the first subflow socket soon, so avoid the addictional indirection via at bind() time. Instead call directly the recently introduced helpers on the first subflow sock. Signed-off-by: Paolo Abeni --- net/mptcp/protocol.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index fe4232870a37..00b891f709f7 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3728,22 +3728,29 @@ static struct proto mptcp_prot =3D { static int mptcp_bind(struct socket *sock, struct sockaddr *uaddr, int add= r_len) { struct mptcp_sock *msk =3D mptcp_sk(sock->sk); + struct sock *ssk, *sk =3D sock->sk; struct socket *ssock; - int err; + int err =3D -EINVAL; =20 - lock_sock(sock->sk); + lock_sock(sk); ssock =3D __mptcp_nmpc_socket(msk); if (IS_ERR(ssock)) { err =3D PTR_ERR(ssock); goto unlock; } =20 - err =3D ssock->ops->bind(ssock, uaddr, addr_len); + ssk =3D msk->first; + if (sk->sk_family =3D=3D AF_INET) + err =3D inet_bind_sk(ssk, uaddr, addr_len); +#if IS_ENABLED(CONFIG_MPTCP_IPV6) + else if (sk->sk_family =3D=3D AF_INET6) + err =3D inet6_bind_sk(ssk, uaddr, addr_len); +#endif if (!err) - mptcp_copy_inaddrs(sock->sk, ssock->sk); + mptcp_copy_inaddrs(sk, ssk); =20 unlock: - release_sock(sock->sk); + release_sock(sk); return err; } =20 --=20 2.41.0 From nobody Tue May 21 19:15:07 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 B27B880C for ; Mon, 10 Jul 2023 12:55:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1688993729; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=FlPtSxuSSyAeGp222kI07CojQxwNI4w1YXE18ZWpW4s=; b=UihbB1VhIjW1FlxO+P1ZbG1l9DL/e1uDY/085mlVP8I1BnFtjCuDC00BDXHGIwJF7tGvPu PFxCrKAvWr/CWgUh75vGZQyUSrSrjLsZNJhMLGkLouJwry5tfmJbDegDngmd4D9ZaQ2UsK Qxg6keYFPz/9rIv8ND1Ui5y8yccJy70= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-558-Kre9J4gkO2OgT0xMdMW1Pg-1; Mon, 10 Jul 2023 08:55:28 -0400 X-MC-Unique: Kre9J4gkO2OgT0xMdMW1Pg-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id EE77B858290 for ; Mon, 10 Jul 2023 12:55:27 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.45.225.74]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7ED3BC09A09 for ; Mon, 10 Jul 2023 12:55:27 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next 07/14] net: factor out __inet_listen_sk() helper Date: Mon, 10 Jul 2023 14:55:02 +0200 Message-ID: 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.8 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" The mptcp protocol maintains an additional socket just to easily invoke a few stream operations on the first subflow. One of them is inet_listen(). Factor out an helper operating directly on the (locked) struct sock, to allow get rid of the above dependency in the next patch without duplicating the existing code. No functional changes intended. Signed-off-by: Paolo Abeni --- include/net/inet_common.h | 1 + net/ipv4/af_inet.c | 39 +++++++++++++++++++++++---------------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/include/net/inet_common.h b/include/net/inet_common.h index 8e97de700991..f50a644d87a9 100644 --- a/include/net/inet_common.h +++ b/include/net/inet_common.h @@ -40,6 +40,7 @@ int inet_recvmsg(struct socket *sock, struct msghdr *msg,= size_t size, int flags); int inet_shutdown(struct socket *sock, int how); int inet_listen(struct socket *sock, int backlog); +int __inet_listen_sk(struct sock *sk, int backlog); void inet_sock_destruct(struct sock *sk); int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len); int inet_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len); diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 2fd23437c1d2..fa482e314162 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -187,24 +187,13 @@ static int inet_autobind(struct sock *sk) return 0; } =20 -/* - * Move a socket into listening state. - */ -int inet_listen(struct socket *sock, int backlog) +int __inet_listen_sk(struct sock *sk, int backlog) { - struct sock *sk =3D sock->sk; - unsigned char old_state; + unsigned char old_state =3D sk->sk_state; int err, tcp_fastopen; =20 - lock_sock(sk); - - err =3D -EINVAL; - if (sock->state !=3D SS_UNCONNECTED || sock->type !=3D SOCK_STREAM) - goto out; - - old_state =3D sk->sk_state; if (!((1 << old_state) & (TCPF_CLOSE | TCPF_LISTEN))) - goto out; + return -EINVAL; =20 WRITE_ONCE(sk->sk_max_ack_backlog, backlog); /* Really, if the socket is already in listen state @@ -227,10 +216,28 @@ int inet_listen(struct socket *sock, int backlog) =20 err =3D inet_csk_listen_start(sk); if (err) - goto out; + return err; + tcp_call_bpf(sk, BPF_SOCK_OPS_TCP_LISTEN_CB, 0, NULL); } - err =3D 0; + return 0; +} + +/* + * Move a socket into listening state. + */ +int inet_listen(struct socket *sock, int backlog) +{ + struct sock *sk =3D sock->sk; + int err; + + lock_sock(sk); + + err =3D -EINVAL; + if (sock->state !=3D SS_UNCONNECTED || sock->type !=3D SOCK_STREAM) + goto out; + + err =3D __inet_listen_sk(sk, backlog); =20 out: release_sock(sk); --=20 2.41.0 From nobody Tue May 21 19:15:07 2024 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 7CD5E111A9 for ; Mon, 10 Jul 2023 12:55:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1688993730; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=My9bJBL97ni8UXlxKYjv29tf7ZPY3pCwltWAFluONU4=; b=X/TU/F7MpwXhm7OdJlv9dnOjKPt+5V46XApayGWAVffBGBAnori0dSzd9LYJysgwj4t/+t lcxPtrpDrJqsFcwkAjGygpzMOGKKvtz2ahK20QOZOa9UgrcMUV9vQ/gUP2ZTNbzwyHeLNE S96Bcg6Oy4oftyDUdlXyAm8p28A8FpQ= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-639-0DgnYMkAMWOPbuuGZBWsWw-1; Mon, 10 Jul 2023 08:55:29 -0400 X-MC-Unique: 0DgnYMkAMWOPbuuGZBWsWw-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id B1338800159 for ; Mon, 10 Jul 2023 12:55:28 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.45.225.74]) by smtp.corp.redhat.com (Postfix) with ESMTP id 408C4C51488 for ; Mon, 10 Jul 2023 12:55:28 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next 08/14] mptcp: avoid additional indirection in mptcp_listen() Date: Mon, 10 Jul 2023 14:55:03 +0200 Message-ID: <3e6dc1e7ec147cf1ab8109a7ec65b62319565604.1688993569.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.8 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" We are going to remove the first subflow socket soon, so avoid the addictional indirection via at listen() time. Instead call directly the recently introduced helper on the first subflow sock. No functional changes intended. Signed-off-by: Paolo Abeni --- net/mptcp/protocol.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 00b891f709f7..c5da7a172ee9 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3759,6 +3759,7 @@ static int mptcp_listen(struct socket *sock, int back= log) struct mptcp_sock *msk =3D mptcp_sk(sock->sk); struct sock *sk =3D sock->sk; struct socket *ssock; + struct sock *ssk; int err; =20 pr_debug("msk=3D%p", msk); @@ -3775,15 +3776,20 @@ static int mptcp_listen(struct socket *sock, int ba= cklog) goto unlock; } =20 + ssk =3D msk->first; inet_sk_state_store(sk, TCP_LISTEN); sock_set_flag(sk, SOCK_RCU_FREE); =20 - err =3D ssock->ops->listen(ssock, backlog); - inet_sk_state_store(sk, inet_sk_state_load(ssock->sk)); + lock_sock(ssk); + err =3D __inet_listen_sk(ssk, backlog); + release_sock(ssk); + inet_sk_state_store(sk, inet_sk_state_load(ssk)); + if (!err) { + WRITE_ONCE(sk->sk_max_ack_backlog, backlog); sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); - mptcp_copy_inaddrs(sk, ssock->sk); - mptcp_event_pm_listener(ssock->sk, MPTCP_EVENT_LISTENER_CREATED); + mptcp_copy_inaddrs(sk, ssk); + mptcp_event_pm_listener(ssk, MPTCP_EVENT_LISTENER_CREATED); } =20 unlock: --=20 2.41.0 From nobody Tue May 21 19:15:07 2024 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 DE670111BD for ; Mon, 10 Jul 2023 12:55:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1688993731; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=925XH7rhHy4oeT94nvedTJLpn0V7Xv3qUcI6KTOzJz0=; b=Fa+x6ouuu/1OC0OVj1nlP5+AgcsFD3niAHNQOmdomi7Gs2Mbk8felShU5SlbZldz4OVXfM qCU7SMZco6DvVU311YBuxhZn7kr8/syJ36n0YIItMTgM1HMWslOcROhkKTLAiCKgKhbzxO OQI8IfPP/drhWRDILyZ8+3SjcihNkiw= 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-623-YRApKD9oPF2V6HYRRULJ-Q-1; Mon, 10 Jul 2023 08:55:29 -0400 X-MC-Unique: YRApKD9oPF2V6HYRRULJ-Q-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 710DA380671E for ; Mon, 10 Jul 2023 12:55:29 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.45.225.74]) by smtp.corp.redhat.com (Postfix) with ESMTP id 00C89C09A09 for ; Mon, 10 Jul 2023 12:55:28 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next 09/14] mptcp: avoid additional indirection in mptcp_poll() Date: Mon, 10 Jul 2023 14:55:04 +0200 Message-ID: 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.8 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" We are going to remove the first subflow socket soon, so avoid the addictional indirection at poll() time. Instead access directly the first subflow sock. No functional changes intended. Signed-off-by: Paolo Abeni --- net/mptcp/protocol.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index c5da7a172ee9..4e5c9770d8d6 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3884,12 +3884,12 @@ static __poll_t mptcp_poll(struct file *file, struc= t socket *sock, state =3D inet_sk_state_load(sk); pr_debug("msk=3D%p state=3D%d flags=3D%lx", msk, state, msk->flags); if (state =3D=3D TCP_LISTEN) { - struct socket *ssock =3D READ_ONCE(msk->subflow); + struct sock *ssk =3D READ_ONCE(msk->first); =20 - if (WARN_ON_ONCE(!ssock || !ssock->sk)) + if (WARN_ON_ONCE(!ssk)) return 0; =20 - return inet_csk_listen_poll(ssock->sk); + return inet_csk_listen_poll(ssk); } =20 shutdown =3D READ_ONCE(sk->sk_shutdown); --=20 2.41.0 From nobody Tue May 21 19:15:07 2024 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 7971580C for ; Mon, 10 Jul 2023 12:55:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1688993731; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=UrC9q6f4wAQiDuC9mUcBejtHFHUSxiR/Q2Ex1BywahA=; b=G5RlGLNbFUMuoMq6++rB3a0a1haPtOB2eARwLT6M3fBik3reX6WvNCI5Rp2hu4YgPyWoZJ 7PzajSLyHO5UYD/OsHbELxOtosH/Cjfw+w1YjIX14pEFpnXfs+akk9flLdzf5sy43les2y sDfpnBDeMiImlS9uKVC6unvaai+kPBE= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-167-hllK6_9iPrObaER9rbbbaQ-1; Mon, 10 Jul 2023 08:55:30 -0400 X-MC-Unique: hllK6_9iPrObaER9rbbbaQ-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 31EEC104458D for ; Mon, 10 Jul 2023 12:55:30 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.45.225.74]) by smtp.corp.redhat.com (Postfix) with ESMTP id B5E07C09A09 for ; Mon, 10 Jul 2023 12:55:29 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next 10/14] mptcp: avoid unneeded indirection in mptcp_stream_accept() Date: Mon, 10 Jul 2023 14:55:05 +0200 Message-ID: <7e485259a201fdac1807c56746bd437d4335edd1.1688993569.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.8 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" We are going to remove the first subflow socket soon, so avoid the addictional indirection at accept() time. Instead access directly the first subflow sock. No functional changes intended. Signed-off-by: Paolo Abeni --- net/mptcp/protocol.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 4e5c9770d8d6..00cfed1d0ebd 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3220,17 +3220,12 @@ static struct sock *mptcp_accept(struct sock *sk, i= nt flags, int *err, bool kern) { struct mptcp_sock *msk =3D mptcp_sk(sk); - struct socket *listener; - struct sock *newsk; + struct sock *ssk, *newsk; =20 - listener =3D READ_ONCE(msk->subflow); - if (WARN_ON_ONCE(!listener)) { - *err =3D -EINVAL; - return NULL; - } + ssk =3D READ_ONCE(msk->first); =20 - pr_debug("msk=3D%p, listener=3D%p", msk, mptcp_subflow_ctx(listener->sk)); - newsk =3D inet_csk_accept(listener->sk, flags, err, kern); + pr_debug("msk=3D%p, listener=3D%p", msk, mptcp_subflow_ctx(ssk)); + newsk =3D inet_csk_accept(ssk, flags, err, kern); if (!newsk) return NULL; =20 @@ -3801,7 +3796,6 @@ static int mptcp_stream_accept(struct socket *sock, s= truct socket *newsock, int flags, bool kern) { struct mptcp_sock *msk =3D mptcp_sk(sock->sk); - struct socket *ssock; struct sock *newsk; int err; =20 @@ -3810,8 +3804,7 @@ static int mptcp_stream_accept(struct socket *sock, s= truct socket *newsock, /* Buggy applications can call accept on socket states other then LISTEN * but no need to allocate the first subflow just to error out. */ - ssock =3D READ_ONCE(msk->subflow); - if (!ssock) + if (!READ_ONCE(msk->first)) return -EINVAL; =20 newsk =3D mptcp_accept(sock->sk, flags, &err, kern); --=20 2.41.0 From nobody Tue May 21 19:15:07 2024 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 418AE111A9 for ; Mon, 10 Jul 2023 12:55:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1688993732; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=poKr2f2/qEoyTf7d74omHVhbHOtl16PWzdzTg3K1zWw=; b=gfNoDq1AOQZvXK8cFNOjytVuF8RcZd/8bihABNNIgabb8B6yQyOIIVpHCClTpN6ziKWEEe 2yP/59PrWumKy3mbV9ay7BJis2DhVqLKdFLMSTA4by5rwWFANBEtE9a4wWsxUHRPPTy4dG qTKby1qVVzZ0QA7UBh+2Qyd3K3Vhc04= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-247-g3wRlHsVOrKltzV0v0d1hg-1; Mon, 10 Jul 2023 08:55:31 -0400 X-MC-Unique: g3wRlHsVOrKltzV0v0d1hg-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id E70ED104458C for ; Mon, 10 Jul 2023 12:55:30 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.45.225.74]) by smtp.corp.redhat.com (Postfix) with ESMTP id 76ED2C09A09 for ; Mon, 10 Jul 2023 12:55:30 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next 11/14] mptcp: avoid additional indirection in sockopt Date: Mon, 10 Jul 2023 14:55:06 +0200 Message-ID: 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.8 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" The mptcp sockopt infrastructure unneedly uses the first subflow socket struct in a few spots. We are going to remove such field soon, so use directly the first subflow sock instead. No functional changes intended. Signed-off-by: Paolo Abeni --- net/mptcp/sockopt.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 63f7a09335c5..348475dcbc23 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -293,6 +293,7 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_soc= k *msk, int optname, { struct sock *sk =3D (struct sock *)msk; struct socket *ssock; + struct sock *ssk; int ret; =20 switch (optname) { @@ -307,16 +308,17 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_s= ock *msk, int optname, return PTR_ERR(ssock); } =20 - ret =3D sock_setsockopt(ssock, SOL_SOCKET, optname, optval, optlen); + ssk =3D msk->first; + ret =3D sk_setsockopt(ssk, SOL_SOCKET, optname, optval, optlen); if (ret =3D=3D 0) { if (optname =3D=3D SO_REUSEPORT) - sk->sk_reuseport =3D ssock->sk->sk_reuseport; + sk->sk_reuseport =3D ssk->sk_reuseport; else if (optname =3D=3D SO_REUSEADDR) - sk->sk_reuse =3D ssock->sk->sk_reuse; + sk->sk_reuse =3D ssk->sk_reuse; else if (optname =3D=3D SO_BINDTODEVICE) - sk->sk_bound_dev_if =3D ssock->sk->sk_bound_dev_if; + sk->sk_bound_dev_if =3D ssk->sk_bound_dev_if; else if (optname =3D=3D SO_BINDTOIFINDEX) - sk->sk_bound_dev_if =3D ssock->sk->sk_bound_dev_if; + sk->sk_bound_dev_if =3D ssk->sk_bound_dev_if; } release_sock(sk); return ret; @@ -391,6 +393,7 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk, = int optname, struct sock *sk =3D (struct sock *)msk; int ret =3D -EOPNOTSUPP; struct socket *ssock; + struct sock *ssk; =20 switch (optname) { case IPV6_V6ONLY: @@ -403,7 +406,8 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk, = int optname, return PTR_ERR(ssock); } =20 - ret =3D tcp_setsockopt(ssock->sk, SOL_IPV6, optname, optval, optlen); + ssk =3D msk->first; + ret =3D tcp_setsockopt(ssk, SOL_IPV6, optname, optval, optlen); if (ret !=3D 0) { release_sock(sk); return ret; @@ -413,13 +417,13 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk= , int optname, =20 switch (optname) { case IPV6_V6ONLY: - sk->sk_ipv6only =3D ssock->sk->sk_ipv6only; + sk->sk_ipv6only =3D ssk->sk_ipv6only; break; case IPV6_TRANSPARENT: - inet_sk(sk)->transparent =3D inet_sk(ssock->sk)->transparent; + inet_sk(sk)->transparent =3D inet_sk(ssk)->transparent; break; case IPV6_FREEBIND: - inet_sk(sk)->freebind =3D inet_sk(ssock->sk)->freebind; + inet_sk(sk)->freebind =3D inet_sk(ssk)->freebind; break; } =20 @@ -700,7 +704,7 @@ static int mptcp_setsockopt_sol_ip_set_transparent(stru= ct mptcp_sock *msk, int o return PTR_ERR(ssock); } =20 - issk =3D inet_sk(ssock->sk); + issk =3D inet_sk(msk->first); =20 switch (optname) { case IP_FREEBIND: @@ -865,8 +869,8 @@ static int mptcp_getsockopt_first_sf_only(struct mptcp_= sock *msk, int level, int { struct sock *sk =3D (struct sock *)msk; struct socket *ssock; - int ret; struct sock *ssk; + int ret; =20 lock_sock(sk); ssk =3D msk->first; @@ -881,7 +885,7 @@ static int mptcp_getsockopt_first_sf_only(struct mptcp_= sock *msk, int level, int goto out; } =20 - ret =3D tcp_getsockopt(ssock->sk, level, optname, optval, optlen); + ret =3D tcp_getsockopt(ssk, level, optname, optval, optlen); =20 out: release_sock(sk); --=20 2.41.0 From nobody Tue May 21 19:15:07 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 44F2780C for ; Mon, 10 Jul 2023 12:55:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1688993733; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=joBGKcUdoUahqUpfr7bFbYlaoHLCEnUeJd+IkRK8ZAY=; b=RhAoI8SWwa8L02j5KRgq7lwm+zT70YFxr1oeQpSlr5XRglWF5caqCt6LSzkE0akR4ADbyy tDvlnT2oMH19kJhbpiioI4i88oB74BR88b1pHZ03gfnfNUecK5bW+8M6pZPfvNfY8014kH vaKMjp1hHw7GibEtPm6Ad1lfv4ce+40= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-128-xHs5OYF0PEedUObDGXCX_Q-1; Mon, 10 Jul 2023 08:55:31 -0400 X-MC-Unique: xHs5OYF0PEedUObDGXCX_Q-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id A95BB908301 for ; Mon, 10 Jul 2023 12:55:31 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.45.225.74]) by smtp.corp.redhat.com (Postfix) with ESMTP id 38AA1C09A09 for ; Mon, 10 Jul 2023 12:55:31 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next 12/14] mptcp: avoid ssock usage in mptcp_pm_nl_create_listen_socket() Date: Mon, 10 Jul 2023 14:55:07 +0200 Message-ID: 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.8 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" This is one of the few remaining spots actually manipulating the first subflow socket. We can leverage the recently introduced inet helpers to get rid of ssock there. No functional changes intended. Signed-off-by: Paolo Abeni --- net/mptcp/pm_netlink.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 3be32f134d2a..b939e442477a 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -1002,8 +1003,8 @@ static int mptcp_pm_nl_create_listen_socket(struct so= ck *sk, bool is_ipv6 =3D sk->sk_family =3D=3D AF_INET6; int addrlen =3D sizeof(struct sockaddr_in); struct sockaddr_storage addr; + struct sock *newsk, *ssk; struct socket *ssock; - struct sock *newsk; int backlog =3D 1024; int err; =20 @@ -1039,18 +1040,23 @@ static int mptcp_pm_nl_create_listen_socket(struct = sock *sk, if (entry->addr.family =3D=3D AF_INET6) addrlen =3D sizeof(struct sockaddr_in6); #endif - err =3D kernel_bind(ssock, (struct sockaddr *)&addr, addrlen); + ssk =3D mptcp_sk(newsk)->first; + if (ssk->sk_family =3D=3D AF_INET) + err =3D inet_bind_sk(ssk, (struct sockaddr *)&addr, addrlen); +#if IS_ENABLED(CONFIG_MPTCP_IPV6) + else if (ssk->sk_family =3D=3D AF_INET6) + err =3D inet6_bind_sk(ssk, (struct sockaddr *)&addr, addrlen); +#endif if (err) return err; =20 inet_sk_state_store(newsk, TCP_LISTEN); - err =3D kernel_listen(ssock, backlog); - if (err) - return err; - - mptcp_event_pm_listener(ssock->sk, MPTCP_EVENT_LISTENER_CREATED); - - return 0; + lock_sock(ssk); + err =3D __inet_listen_sk(ssk, backlog); + if (!err) + mptcp_event_pm_listener(ssk, MPTCP_EVENT_LISTENER_CREATED); + release_sock(ssk); + return err; } =20 int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_inf= o *skc) --=20 2.41.0 From nobody Tue May 21 19:15:07 2024 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 9D96C107B5 for ; Mon, 10 Jul 2023 12:55:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1688993733; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=iSpmeJk9BalMNMvAnxf1gNwdTI1qGYoPCVqRJAgbDNM=; b=gJw/hk9gi5eq7Yuo7BQJzyGlWhA2sKvbxU4OIxbcDf0+2aTl/Zoni7+hqO6cHbH/ipW0By UA93eWr2HufsQ9Z2eFyRl8BzFOMymdJwpS91+s8AfmPeDLdTo7Qq2v/n9tJIJ88wGqnk9Y gLUx7huwX9nMgB58lZzYfBzGss8JDR0= 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-669-mXakxpklPNiazCejLkaAcw-1; Mon, 10 Jul 2023 08:55:32 -0400 X-MC-Unique: mXakxpklPNiazCejLkaAcw-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 6CA1B1C08790 for ; Mon, 10 Jul 2023 12:55:32 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.45.225.74]) by smtp.corp.redhat.com (Postfix) with ESMTP id ED09EC478DE for ; Mon, 10 Jul 2023 12:55:31 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next 13/14] mptcp: change the mpc check helper to return a sk Date: Mon, 10 Jul 2023 14:55:08 +0200 Message-ID: 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.8 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" After the previous patch the __mptcp_nmpc_socket helper is used only to ensure that the MPTCP socket is a suitable status - that is, the mptcp capable handshake is not started yet. Change the return value to the relevant subflow sock, to finally remove the last references to first subflow socket in the MPTCP stack. As a bonus, we can get rid of a few local variables in different functions. No functional change intended. Signed-off-by: Paolo Abeni --- net/mptcp/pm_netlink.c | 8 +++----- net/mptcp/protocol.c | 40 +++++++++++++++------------------------ net/mptcp/protocol.h | 2 +- net/mptcp/sockopt.c | 43 +++++++++++++++++++----------------------- 4 files changed, 38 insertions(+), 55 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index b939e442477a..9661f3812682 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1004,7 +1004,6 @@ static int mptcp_pm_nl_create_listen_socket(struct so= ck *sk, int addrlen =3D sizeof(struct sockaddr_in); struct sockaddr_storage addr; struct sock *newsk, *ssk; - struct socket *ssock; int backlog =3D 1024; int err; =20 @@ -1030,17 +1029,16 @@ static int mptcp_pm_nl_create_listen_socket(struct = sock *sk, &mptcp_keys[is_ipv6]); =20 lock_sock(newsk); - ssock =3D __mptcp_nmpc_socket(mptcp_sk(newsk)); + ssk =3D __mptcp_nmpc_sk(mptcp_sk(newsk)); release_sock(newsk); - if (IS_ERR(ssock)) - return PTR_ERR(ssock); + if (IS_ERR(ssk)) + return PTR_ERR(ssk); =20 mptcp_info2sockaddr(&entry->addr, &addr, entry->addr.family); #if IS_ENABLED(CONFIG_MPTCP_IPV6) if (entry->addr.family =3D=3D AF_INET6) addrlen =3D sizeof(struct sockaddr_in6); #endif - ssk =3D mptcp_sk(newsk)->first; if (ssk->sk_family =3D=3D AF_INET) err =3D inet_bind_sk(ssk, (struct sockaddr *)&addr, addrlen); #if IS_ENABLED(CONFIG_MPTCP_IPV6) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 00cfed1d0ebd..1c12c7911c43 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -108,7 +108,7 @@ static int __mptcp_socket_create(struct mptcp_sock *msk) /* If the MPC handshake is not started, returns the first subflow, * eventually allocating it. */ -struct socket *__mptcp_nmpc_socket(struct mptcp_sock *msk) +struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk) { struct sock *sk =3D (struct sock *)msk; int ret; @@ -116,10 +116,7 @@ struct socket *__mptcp_nmpc_socket(struct mptcp_sock *= msk) if (!((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) return ERR_PTR(-EINVAL); =20 - if (!msk->subflow) { - if (msk->first) - return ERR_PTR(-EINVAL); - + if (!msk->first) { ret =3D __mptcp_socket_create(msk); if (ret) return ERR_PTR(ret); @@ -127,7 +124,7 @@ struct socket *__mptcp_nmpc_socket(struct mptcp_sock *m= sk) mptcp_sockopt_sync(msk, msk->first); } =20 - return msk->subflow; + return msk->first; } =20 static void mptcp_drop(struct sock *sk, struct sk_buff *skb) @@ -1671,7 +1668,6 @@ static int mptcp_sendmsg_fastopen(struct sock *sk, st= ruct msghdr *msg, { unsigned int saved_flags =3D msg->msg_flags; struct mptcp_sock *msk =3D mptcp_sk(sk); - struct socket *ssock; struct sock *ssk; int ret; =20 @@ -1682,9 +1678,9 @@ static int mptcp_sendmsg_fastopen(struct sock *sk, st= ruct msghdr *msg, * fastopen attempt, no need to check for additional subflow status. */ if (msg->msg_flags & MSG_FASTOPEN) { - ssock =3D __mptcp_nmpc_socket(msk); - if (IS_ERR(ssock)) - return PTR_ERR(ssock); + ssk =3D __mptcp_nmpc_sk(msk); + if (IS_ERR(ssk)) + return PTR_ERR(ssk); } if (!msk->first) return -EINVAL; @@ -3620,16 +3616,14 @@ static int mptcp_connect(struct sock *sk, struct so= ckaddr *uaddr, int addr_len) { struct mptcp_subflow_context *subflow; struct mptcp_sock *msk =3D mptcp_sk(sk); - struct socket *ssock; int err =3D -EINVAL; struct sock *ssk; =20 - ssock =3D __mptcp_nmpc_socket(msk); - if (IS_ERR(ssock)) - return PTR_ERR(ssock); + ssk =3D __mptcp_nmpc_sk(msk); + if (IS_ERR(ssk)) + return PTR_ERR(ssk); =20 inet_sk_state_store(sk, TCP_SYN_SENT); - ssk =3D msk->first; subflow =3D mptcp_subflow_ctx(ssk); #ifdef CONFIG_TCP_MD5SIG /* no MPTCP if MD5SIG is enabled on this socket or we may run out of @@ -3724,17 +3718,15 @@ static int mptcp_bind(struct socket *sock, struct s= ockaddr *uaddr, int addr_len) { struct mptcp_sock *msk =3D mptcp_sk(sock->sk); struct sock *ssk, *sk =3D sock->sk; - struct socket *ssock; int err =3D -EINVAL; =20 lock_sock(sk); - ssock =3D __mptcp_nmpc_socket(msk); - if (IS_ERR(ssock)) { - err =3D PTR_ERR(ssock); + ssk =3D __mptcp_nmpc_sk(msk); + if (IS_ERR(ssk)) { + err =3D PTR_ERR(ssk); goto unlock; } =20 - ssk =3D msk->first; if (sk->sk_family =3D=3D AF_INET) err =3D inet_bind_sk(ssk, uaddr, addr_len); #if IS_ENABLED(CONFIG_MPTCP_IPV6) @@ -3753,7 +3745,6 @@ static int mptcp_listen(struct socket *sock, int back= log) { struct mptcp_sock *msk =3D mptcp_sk(sock->sk); struct sock *sk =3D sock->sk; - struct socket *ssock; struct sock *ssk; int err; =20 @@ -3765,13 +3756,12 @@ static int mptcp_listen(struct socket *sock, int ba= cklog) if (sock->state !=3D SS_UNCONNECTED || sock->type !=3D SOCK_STREAM) goto unlock; =20 - ssock =3D __mptcp_nmpc_socket(msk); - if (IS_ERR(ssock)) { - err =3D PTR_ERR(ssock); + ssk =3D __mptcp_nmpc_sk(msk); + if (IS_ERR(ssk)) { + err =3D PTR_ERR(ssk); goto unlock; } =20 - ssk =3D msk->first; inet_sk_state_store(sk, TCP_LISTEN); sock_set_flag(sk, SOCK_RCU_FREE); =20 diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index bb4d50c8c398..c26587fd7d50 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -636,7 +636,7 @@ void __mptcp_subflow_send_ack(struct sock *ssk); void mptcp_subflow_reset(struct sock *ssk); void mptcp_subflow_queue_clean(struct sock *sk, struct sock *ssk); void mptcp_sock_graft(struct sock *sk, struct socket *parent); -struct socket *__mptcp_nmpc_socket(struct mptcp_sock *msk); +struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk); bool __mptcp_close(struct sock *sk, long timeout); void mptcp_cancel_work(struct sock *sk); void __mptcp_unaccepted_force_close(struct sock *sk); diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 348475dcbc23..91ee1aa2284e 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -292,7 +292,6 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_soc= k *msk, int optname, sockptr_t optval, unsigned int optlen) { struct sock *sk =3D (struct sock *)msk; - struct socket *ssock; struct sock *ssk; int ret; =20 @@ -302,13 +301,12 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_s= ock *msk, int optname, case SO_BINDTODEVICE: case SO_BINDTOIFINDEX: lock_sock(sk); - ssock =3D __mptcp_nmpc_socket(msk); - if (IS_ERR(ssock)) { + ssk =3D __mptcp_nmpc_sk(msk); + if (IS_ERR(ssk)) { release_sock(sk); - return PTR_ERR(ssock); + return PTR_ERR(ssk); } =20 - ssk =3D msk->first; ret =3D sk_setsockopt(ssk, SOL_SOCKET, optname, optval, optlen); if (ret =3D=3D 0) { if (optname =3D=3D SO_REUSEPORT) @@ -392,7 +390,6 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk, = int optname, { struct sock *sk =3D (struct sock *)msk; int ret =3D -EOPNOTSUPP; - struct socket *ssock; struct sock *ssk; =20 switch (optname) { @@ -400,13 +397,12 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk= , int optname, case IPV6_TRANSPARENT: case IPV6_FREEBIND: lock_sock(sk); - ssock =3D __mptcp_nmpc_socket(msk); - if (IS_ERR(ssock)) { + ssk =3D __mptcp_nmpc_sk(msk); + if (IS_ERR(ssk)) { release_sock(sk); - return PTR_ERR(ssock); + return PTR_ERR(ssk); } =20 - ssk =3D msk->first; ret =3D tcp_setsockopt(ssk, SOL_IPV6, optname, optval, optlen); if (ret !=3D 0) { release_sock(sk); @@ -689,7 +685,7 @@ static int mptcp_setsockopt_sol_ip_set_transparent(stru= ct mptcp_sock *msk, int o { struct sock *sk =3D (struct sock *)msk; struct inet_sock *issk; - struct socket *ssock; + struct sock *ssk; int err; =20 err =3D ip_setsockopt(sk, SOL_IP, optname, optval, optlen); @@ -698,13 +694,13 @@ static int mptcp_setsockopt_sol_ip_set_transparent(st= ruct mptcp_sock *msk, int o =20 lock_sock(sk); =20 - ssock =3D __mptcp_nmpc_socket(msk); - if (IS_ERR(ssock)) { + ssk =3D __mptcp_nmpc_sk(msk); + if (IS_ERR(ssk)) { release_sock(sk); - return PTR_ERR(ssock); + return PTR_ERR(ssk); } =20 - issk =3D inet_sk(msk->first); + issk =3D inet_sk(ssk); =20 switch (optname) { case IP_FREEBIND: @@ -767,18 +763,18 @@ static int mptcp_setsockopt_first_sf_only(struct mptc= p_sock *msk, int level, int sockptr_t optval, unsigned int optlen) { struct sock *sk =3D (struct sock *)msk; - struct socket *sock; + struct sock *ssk; int ret; =20 /* Limit to first subflow, before the connection establishment */ lock_sock(sk); - sock =3D __mptcp_nmpc_socket(msk); - if (IS_ERR(sock)) { - ret =3D PTR_ERR(sock); + ssk =3D __mptcp_nmpc_sk(msk); + if (IS_ERR(ssk)) { + ret =3D PTR_ERR(ssk); goto unlock; } =20 - ret =3D tcp_setsockopt(sock->sk, level, optname, optval, optlen); + ret =3D tcp_setsockopt(ssk, level, optname, optval, optlen); =20 unlock: release_sock(sk); @@ -868,7 +864,6 @@ static int mptcp_getsockopt_first_sf_only(struct mptcp_= sock *msk, int level, int char __user *optval, int __user *optlen) { struct sock *sk =3D (struct sock *)msk; - struct socket *ssock; struct sock *ssk; int ret; =20 @@ -879,9 +874,9 @@ static int mptcp_getsockopt_first_sf_only(struct mptcp_= sock *msk, int level, int goto out; } =20 - ssock =3D __mptcp_nmpc_socket(msk); - if (IS_ERR(ssock)) { - ret =3D PTR_ERR(ssock); + ssk =3D __mptcp_nmpc_sk(msk); + if (IS_ERR(ssk)) { + ret =3D PTR_ERR(ssk); goto out; } =20 --=20 2.41.0 From nobody Tue May 21 19:15:07 2024 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 796EC111A9 for ; Mon, 10 Jul 2023 12:55:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1688993734; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qmLHKSyQs30gUXEaz5K4a1rsckTqEGibKpgBbE5PxVQ=; b=M3uZHRphn8PaH1x/jePSsJkglvvcGM9h4nLCvCVxvQ5VMqSMgb2g4IkZS/TJs4LNNvRsNi CtMgu05eCgtUYk/BdcpQvp6CHL9uFD8PWj4LB95lSox2RaG8PpdmvARDFgfPbfH1E6A0pl +/CwDWmWa8/pFhG4o9+s5GSaMd2RtWY= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-517-sydu-VvwPEShVoO_wYAI9Q-1; Mon, 10 Jul 2023 08:55:33 -0400 X-MC-Unique: sydu-VvwPEShVoO_wYAI9Q-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 2A7CC86F123 for ; Mon, 10 Jul 2023 12:55:33 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.45.225.74]) by smtp.corp.redhat.com (Postfix) with ESMTP id AEBCBC09A09 for ; Mon, 10 Jul 2023 12:55:32 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next 14/14] mptcp: get rid of msk->subflow Date: Mon, 10 Jul 2023 14:55:09 +0200 Message-ID: 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.8 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" Such field is now unused just as a flag to control the first subflow deletion at close() time. Introduce a new bit flag for that and finally drop the mentioned field. As an intended side effect, now the first subflow sock is not freed before close() even for passive sockets. The msk has no open/active subflows if the first one is closed and the subflow list is singular, update accordingly the state check in mptcp_stream_accept(). Among other benefits, the subflow removal, reduces the amount of memory used on the client side for each mptcp connection, allows passive sockets to go through successful accept()/disconnect()/connect() and makes return error code consistent for failing both passive and active sockets. Signed-off-by: Paolo Abeni --- Side notes: - syzkaller will be likely happy about the new code path to possibly exploit - we could possibly avoid allocating the 'socket' struct at __mptcp_subflow_connect() time, but that will require more invasive helpers creation in inet core. --- net/mptcp/protocol.c | 22 +++++----------------- net/mptcp/protocol.h | 13 ++++++------- 2 files changed, 11 insertions(+), 24 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 1c12c7911c43..0518a37e62c7 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -91,7 +91,6 @@ static int __mptcp_socket_create(struct mptcp_sock *msk) return err; =20 WRITE_ONCE(msk->first, ssock->sk); - WRITE_ONCE(msk->subflow, ssock); subflow =3D mptcp_subflow_ctx(ssock->sk); list_add(&subflow->node, &msk->conn_list); sock_hold(ssock->sk); @@ -101,6 +100,7 @@ static int __mptcp_socket_create(struct mptcp_sock *msk) /* This is the first subflow, always with id 0 */ subflow->local_id_valid =3D 1; mptcp_sock_graft(msk->first, sk->sk_socket); + iput(SOCK_INODE(ssock)); =20 return 0; } @@ -2263,14 +2263,6 @@ struct sock *mptcp_subflow_get_retrans(struct mptcp_= sock *msk) return min_stale_count > 1 ? backup : NULL; } =20 -static void mptcp_dispose_initial_subflow(struct mptcp_sock *msk) -{ - if (msk->subflow) { - iput(SOCK_INODE(msk->subflow)); - WRITE_ONCE(msk->subflow, NULL); - } -} - bool __mptcp_retransmit_pending_data(struct sock *sk) { struct mptcp_data_frag *cur, *rtx_head; @@ -2349,7 +2341,7 @@ static void __mptcp_close_ssk(struct sock *sk, struct= sock *ssk, goto out_release; } =20 - dispose_it =3D !msk->subflow || ssk !=3D msk->subflow->sk; + dispose_it =3D msk->free_first || ssk !=3D msk->first; if (dispose_it) list_del(&subflow->node); =20 @@ -2370,7 +2362,6 @@ static void __mptcp_close_ssk(struct sock *sk, struct= sock *ssk, * disconnect should never fail */ WARN_ON_ONCE(tcp_disconnect(ssk, 0)); - msk->subflow->state =3D SS_UNCONNECTED; mptcp_subflow_ctx_reset(subflow); release_sock(ssk); =20 @@ -3147,7 +3138,6 @@ struct sock *mptcp_sk_clone_init(const struct sock *s= k, msk =3D mptcp_sk(nsk); msk->local_key =3D subflow_req->local_key; msk->token =3D subflow_req->token; - WRITE_ONCE(msk->subflow, NULL); msk->in_accept_queue =3D 1; WRITE_ONCE(msk->fully_established, false); if (mp_opt->suboptions & OPTION_MPTCP_CSUMREQD) @@ -3285,10 +3275,8 @@ static void mptcp_destroy(struct sock *sk) { struct mptcp_sock *msk =3D mptcp_sk(sk); =20 - /* clears msk->subflow, allowing the following to close - * even the initial subflow - */ - mptcp_dispose_initial_subflow(msk); + /* allow the following to close even the initial subflow */ + msk->free_first =3D 1; mptcp_destroy_common(msk, 0); sk_sockets_allocated_dec(sk); } @@ -3828,7 +3816,7 @@ static int mptcp_stream_accept(struct socket *sock, s= truct socket *newsock, unlikely(inet_sk_state_load(msk->first) =3D=3D TCP_CLOSE)) { __mptcp_close_ssk(newsk, msk->first, mptcp_subflow_ctx(msk->first), 0); - if (unlikely(list_empty(&msk->conn_list))) + if (unlikely(list_is_singular(&msk->conn_list))) inet_sk_state_store(newsk, TCP_CLOSE); } } diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index c26587fd7d50..1b4457c44fe8 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -297,7 +297,8 @@ struct mptcp_sock { cork:1, nodelay:1, fastopening:1, - in_accept_queue:1; + in_accept_queue:1, + free_first:1; struct work_struct work; struct sk_buff *ooo_last_skb; struct rb_root out_of_order_queue; @@ -306,12 +307,10 @@ struct mptcp_sock { struct list_head rtx_queue; struct mptcp_data_frag *first_pending; struct list_head join_list; - struct socket *subflow; /* outgoing connect/listener/!mp_capable - * The mptcp ops can safely dereference, using suitable - * ONCE annotation, the subflow outside the socket - * lock as such sock is freed after close(). - */ - struct sock *first; + struct sock *first; /* The mptcp ops can safely dereference, using suitab= le + * ONCE annotation, the subflow outside the socket + * lock as such sock is freed after close(). + */ struct mptcp_pm_data pm; struct mptcp_sched_ops *sched; struct { --=20 2.41.0