From nobody Thu Apr 18 11:10:28 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:956b:0:0:0:0:0 with SMTP id y98csp1255960jah; Fri, 5 Nov 2021 03:49:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwI7KQ4w8P1uz8PGwMRgZzX45gMFQQ1qbSHkFu7FMI9WSXWZObwnC/5uyguAdYpV67ePhtw X-Received: by 2002:a9d:19c1:: with SMTP id k59mr43509334otk.348.1636109375489; Fri, 05 Nov 2021 03:49:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1636109375; cv=none; d=google.com; s=arc-20160816; b=nZj1XlPbp9T5AOwf/VVBAyuZ959I2W0z/m9sOvXNGoo6Ia0Km/H46yt/ZY4idN6J3r evN3YCPqVmwy805lmzlXv6zGS8RrdrL0KwWQHM130wLev3lxFenjMnZe3DUa91TyTQTJ znk/AelbH7D0htZYH+bYxEA/KaiOvS0e9lWv0XIY2bqMmq/j6CK3Xxcm2lsT9GhtwTxp GA2JfT5J4oxcUT7ZJziX+nqdwQEfv2CLZUx8wodm+Of8e9cBsnHFTvQT5yzsEJxwqc7g MDCNkr+XK/C4fUQjgSDMb0CJ/vAXzxJrQF5vTgSk+NafpAtGIFGFiDgmbzjwoIMusMoM EPYw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=DJW7TKXEvDg7nk3jz00uUquoHRDCJzAWq+2MM86W64w=; b=XHeePIiulHBqef43qwYe0hoKgFQxfqa/qkTiM4+/5/UrJfCXherzCC4xxafxD0wax8 Dpl8l/N05BblERZ+51J0E0vBTRFjFXaZQvTyvsZYnmymMeHl7VmnYo5e0eiLWGn7IsWo i+wgLC/Ift2bB2lUM9HZyWcEujb0IYLqS/NuiWTI29rUKehtr7fddU1pLv70HhXuPF7G TKr4iRC6FEhacrTgJiti2Kqr148tGUCwsPx7NOWLwozsUe6e/6xSvGxZXiBkgnjFoMRE 98I0WQY5kQXJ/gN+rn/1+zRqMMZoP6KPAvYliuKMNVLlkgj5WUR04B5TtKW9xyd3CRZY blTQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=Rp6vH4N0; spf=pass (google.com: domain of mptcp+bounces-2373-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2373-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [147.75.197.195]) by mx.google.com with ESMTPS id t3si2045544oiw.241.2021.11.05.03.49.35 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 05 Nov 2021 03:49:35 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-2373-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) client-ip=147.75.197.195; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=Rp6vH4N0; spf=pass (google.com: domain of mptcp+bounces-2373-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2373-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ewr.edge.kernel.org (Postfix) with ESMTPS id 011591C0FA6 for ; Fri, 5 Nov 2021 10:49:35 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 04A962C9D; Fri, 5 Nov 2021 10:49:34 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.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 3181D29CA for ; Fri, 5 Nov 2021 10:49:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1636109371; 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=DJW7TKXEvDg7nk3jz00uUquoHRDCJzAWq+2MM86W64w=; b=Rp6vH4N0Rgzq7QpGZa00F846nel8BWcpzpK5QfHJTb8+AzyyrBrVtaOcEzel2BdQuySWhx QUWM2hTWtNZSpVCjSLzp9o7CuNKuNPHw+Z62hoJT31DghHbW3tBkavaMi4Qz3TFX4Vf1a2 qvjcP7AtYOuIGOUKSCCwIqUo3QahMLc= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-581-gJKSDdYfOrC7LRqFluN6rw-1; Fri, 05 Nov 2021 06:49:30 -0400 X-MC-Unique: gJKSDdYfOrC7LRqFluN6rw-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 28B68101AFA7 for ; Fri, 5 Nov 2021 10:49:29 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.194.132]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8EC815D9D3 for ; Fri, 5 Nov 2021 10:49:28 +0000 (UTC) From: Paolo Abeni To: MPTCP Upstream Subject: [RFC PATCH 1/3] mptcp: never allow the PM to close a listener subflow Date: Fri, 5 Nov 2021 11:49:10 +0100 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 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pabeni@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Currently, when deleting an endpoint the netlink PM treverses all the local MPTCP sockets, regardless of their status. If an MPTCP listener socket is bound to the IP matching the delete endpoint, the listener TCP socket will be closed. That is unexpected, the PM should only affect data subflows. Fix the issue explicitly skipping MPTCP socket in TCP_LISTEN status. Signed-off-by: Paolo Abeni --- net/mptcp/pm_netlink.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 7b96be1e9f14..f523051f5aef 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -700,6 +700,9 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp= _sock *msk, =20 msk_owned_by_me(msk); =20 + if (sk->sk_state =3D=3D TCP_LISTEN) + return; + if (!rm_list->nr) return; =20 --=20 2.26.3 From nobody Thu Apr 18 11:10:28 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:956b:0:0:0:0:0 with SMTP id y98csp1255973jah; Fri, 5 Nov 2021 03:49:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxJsJdUk8aBAFQjIC/QqY1O2Y0kjAdxjIOzzc0LcZ4TwE47737SAF/2chN6q6N6xTY1lYxU X-Received: by 2002:aca:3885:: with SMTP id f127mr21082402oia.65.1636109376781; Fri, 05 Nov 2021 03:49:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1636109376; cv=none; d=google.com; s=arc-20160816; b=Wb4WqYjlxU0d3jU5Qoi8vu4++3O117d6G/EJXCVSw/4FGFbExsI2zPftlyqs4z1wBY asefxzaDtdTT5n04VsEF0QSdGJnUiiBulLVQhBw0INdgJHMMbFJgHfOFodJshI/SWyQ/ OfVLHboWiHDrvSiqUqylW0+C4uvtgDcl2lgoY9daDC0Y9Z1H3qkKpmo4YAvhURWdNJI6 h1eRrqvDYlTmaTozjxkKLT4wOHR+oML0AeTS3Ih/9kG9jFQGcSmX4FwJvMMdYqBxu5Nm S/w8s2/uuW7dEjTrovePK29RcvIUmBxO7+ZTsPUKSEhqbDe3o+qOHFsylpKbk/sVY6mO 4X+w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=QOHyT5bBm+4tFr1sh6fVBEDnmjVe8U0Ia7z9cLMvPWE=; b=S0WGwi2/6kxcHcnn9cFMLPaNkTDFj+A3UHH68wrZK2UgtU5Bzf9WiZs4dLKgOZlPPF SMWdwa+qbcC1eCGad/REhWVxOZHH3BOG5CtnhzmAU7K9iaVnQvDK2CL3vIcaGmrq5rrb WdY57npDxqOnRa5eTXtN47kkMLAt5zjCBF2FqrXCcQ5+KM01JLPMlDurrF6cTlp3+X4g WLIrbjdw8NjgyyrFB8e54FFWBImgwGz9q6rBhNSyA0dpJSUFdwzrV5XFW2Cav8m19WpM zfLank85ic6mPPZlwP56f4AgahzgnyPJ/w6iC7As74czptfTLK1JO/rYyhiziGJP2BSf AyBw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=Vx27QKgA; spf=pass (google.com: domain of mptcp+bounces-2374-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2374-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [2604:1380:1:3600::1]) by mx.google.com with ESMTPS id u6si3587877oiw.18.2021.11.05.03.49.36 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 05 Nov 2021 03:49:36 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-2374-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) client-ip=2604:1380:1:3600::1; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=Vx27QKgA; spf=pass (google.com: domain of mptcp+bounces-2374-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2374-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ewr.edge.kernel.org (Postfix) with ESMTPS id 34D2D1C0F6F for ; Fri, 5 Nov 2021 10:49:36 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5A8582C9F; Fri, 5 Nov 2021 10:49:34 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev 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 1EA992C9B for ; Fri, 5 Nov 2021 10:49:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1636109372; 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=QOHyT5bBm+4tFr1sh6fVBEDnmjVe8U0Ia7z9cLMvPWE=; b=Vx27QKgAQU8FurvV1XVy3ixLKZ7lRxLLf3kkJ3NGej/+l3bpfi9j3TtC6CoJi+5ejGUyK6 bwGa5PVAfg0cJavPoWIb4aKTC9UbatHV4qxgp+3yLHKwylAo8CuZClm8K5tgJhhJIIWcW1 Mb46LBlAvI7/SbEQl+vi16Fwo0GfhR0= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-458-E5zn8zNVP92872-ax05AGw-1; Fri, 05 Nov 2021 06:49:31 -0400 X-MC-Unique: E5zn8zNVP92872-ax05AGw-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 468E51835AC2 for ; Fri, 5 Nov 2021 10:49:30 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.194.132]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7EDA85D9D3 for ; Fri, 5 Nov 2021 10:49:29 +0000 (UTC) From: Paolo Abeni To: MPTCP Upstream Subject: [RFC PATCH 2/3] mptcp: full disconnect implementation Date: Fri, 5 Nov 2021 11:49:11 +0100 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 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pabeni@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The current mptcp_disconnect() implementation lacks several steps, we additionally need to reset the msk socket state and flush the subflow list. Factor out the needed helper to avoid code duplication. Additionally ensure that the initial subflow is disposed only after mptcp_close(), just reset it at disconnect time. Signed-off-by: Paolo Abeni --- net/mptcp/pm.c | 10 +++-- net/mptcp/protocol.c | 95 ++++++++++++++++++++++++++++++++------------ net/mptcp/protocol.h | 14 +++++++ net/mptcp/token.c | 1 + 4 files changed, 92 insertions(+), 28 deletions(-) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 6ab386ff3294..6b2bfe89d445 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -356,7 +356,7 @@ void mptcp_pm_subflow_chk_stale(const struct mptcp_sock= *msk, struct sock *ssk) } } =20 -void mptcp_pm_data_init(struct mptcp_sock *msk) +void mptcp_pm_data_reset(struct mptcp_sock *msk) { msk->pm.add_addr_signaled =3D 0; msk->pm.add_addr_accepted =3D 0; @@ -371,10 +371,14 @@ void mptcp_pm_data_init(struct mptcp_sock *msk) WRITE_ONCE(msk->pm.remote_deny_join_id0, false); msk->pm.status =3D 0; =20 + mptcp_pm_nl_data_init(msk); +} + +void mptcp_pm_data_init(struct mptcp_sock *msk) +{ spin_lock_init(&msk->pm.lock); INIT_LIST_HEAD(&msk->pm.anno_list); - - mptcp_pm_nl_data_init(msk); + mptcp_pm_data_reset(msk); } =20 void __init mptcp_pm_init(void) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 1ee3530ac2a3..5fe19adb88a5 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2226,22 +2226,33 @@ bool __mptcp_retransmit_pending_data(struct sock *s= k) * parent socket. */ static void __mptcp_close_ssk(struct sock *sk, struct sock *ssk, - struct mptcp_subflow_context *subflow) + struct mptcp_subflow_context *subflow, + bool check_pending) { struct mptcp_sock *msk =3D mptcp_sk(sk); - bool need_push; + bool need_push, dispose_it; =20 - list_del(&subflow->node); + dispose_it =3D !msk->subflow || ssk !=3D msk->subflow->sk; + if (dispose_it) + list_del(&subflow->node); =20 lock_sock_nested(ssk, SINGLE_DEPTH_NESTING); =20 + need_push =3D check_pending && __mptcp_retransmit_pending_data(sk); + if (!dispose_it) { + tcp_disconnect(ssk, 0); + mptcp_subflow_ctx_reset(subflow); + release_sock(ssk); + + goto out; + } + /* if we are invoked by the msk cleanup code, the subflow is * already orphaned */ if (ssk->sk_socket) sock_orphan(ssk); =20 - need_push =3D __mptcp_retransmit_pending_data(sk); subflow->disposable =3D 1; =20 /* if ssk hit tcp_done(), tcp_cleanup_ulp() cleared the related ops @@ -2261,14 +2272,12 @@ static void __mptcp_close_ssk(struct sock *sk, stru= ct sock *ssk, =20 sock_put(ssk); =20 - if (ssk =3D=3D msk->last_snd) - msk->last_snd =3D NULL; - if (ssk =3D=3D msk->first) msk->first =3D NULL; =20 - if (msk->subflow && ssk =3D=3D msk->subflow->sk) - mptcp_dispose_initial_subflow(msk); +out: + if (ssk =3D=3D msk->last_snd) + msk->last_snd =3D NULL; =20 if (need_push) __mptcp_push_pending(sk, 0); @@ -2279,7 +2288,7 @@ void mptcp_close_ssk(struct sock *sk, struct sock *ss= k, { if (sk->sk_state =3D=3D TCP_ESTABLISHED) mptcp_event(MPTCP_EVENT_SUB_CLOSED, mptcp_sk(sk), ssk, GFP_KERNEL); - __mptcp_close_ssk(sk, ssk, subflow); + __mptcp_close_ssk(sk, ssk, subflow, true); } =20 static unsigned int mptcp_sync_mss(struct sock *sk, u32 pmtu) @@ -2501,9 +2510,20 @@ static int __mptcp_init_sock(struct sock *sk) return 0; } =20 -static int mptcp_init_sock(struct sock *sk) +static void mptcp_ca_reset(struct sock *sk) { struct inet_connection_sock *icsk =3D inet_csk(sk); + + tcp_assign_congestion_control(sk); + strcpy(mptcp_sk(sk)->ca_name, icsk->icsk_ca_ops->name); + + /* no need to keep a reference to the ops, the name will suffice */ + tcp_cleanup_congestion_control(sk); + icsk->icsk_ca_ops =3D NULL; +} + +static int mptcp_init_sock(struct sock *sk) +{ struct net *net =3D sock_net(sk); int ret; =20 @@ -2524,12 +2544,7 @@ static int mptcp_init_sock(struct sock *sk) /* fetch the ca name; do it outside __mptcp_init_sock(), so that clone wi= ll * propagate the correct value */ - tcp_assign_congestion_control(sk); - strcpy(mptcp_sk(sk)->ca_name, icsk->icsk_ca_ops->name); - - /* no need to keep a reference to the ops, the name will suffice */ - tcp_cleanup_congestion_control(sk); - icsk->icsk_ca_ops =3D NULL; + mptcp_ca_reset(sk); =20 sk_sockets_allocated_inc(sk); sk->sk_rcvbuf =3D sock_net(sk)->ipv4.sysctl_tcp_rmem[1]; @@ -2687,9 +2702,13 @@ static void __mptcp_destroy_sock(struct sock *sk) sk_stop_timer(sk, &sk->sk_timer); msk->pm.status =3D 0; =20 + /* clears msk->subflow, allowing the following loop to close + * even the initial subflow + */ + mptcp_dispose_initial_subflow(msk); list_for_each_entry_safe(subflow, tmp, &conn_list, node) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); - __mptcp_close_ssk(sk, ssk, subflow); + __mptcp_close_ssk(sk, ssk, subflow, false); } =20 sk->sk_prot->destroy(sk); @@ -2700,7 +2719,6 @@ static void __mptcp_destroy_sock(struct sock *sk) xfrm_sk_free_policy(sk); =20 sk_refcnt_debug_release(sk); - mptcp_dispose_initial_subflow(msk); sock_put(sk); } =20 @@ -2736,6 +2754,9 @@ static void mptcp_close(struct sock *sk, long timeout) =20 sock_hold(sk); pr_debug("msk=3D%p state=3D%d", sk, sk->sk_state); + if (mptcp_sk(sk)->token) + mptcp_event(MPTCP_EVENT_CLOSED, mptcp_sk(sk), NULL, GFP_KERNEL); + if (sk->sk_state =3D=3D TCP_CLOSE) { __mptcp_destroy_sock(sk); do_cancel_work =3D true; @@ -2746,9 +2767,6 @@ static void mptcp_close(struct sock *sk, long timeout) if (do_cancel_work) mptcp_cancel_work(sk); =20 - if (mptcp_sk(sk)->token) - mptcp_event(MPTCP_EVENT_CLOSED, mptcp_sk(sk), NULL, GFP_KERNEL); - sock_put(sk); } =20 @@ -2782,13 +2800,40 @@ static int mptcp_disconnect(struct sock *sk, int fl= ags) =20 mptcp_do_flush_join_list(msk); =20 + inet_sk_state_store(sk, TCP_CLOSE); + mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); =20 - lock_sock(ssk); - tcp_disconnect(ssk, flags); - release_sock(ssk); + __mptcp_close_ssk(sk, ssk, subflow, false); } + + sk_stop_timer(sk, &msk->sk.icsk_retransmit_timer); + sk_stop_timer(sk, &sk->sk_timer); + + if (mptcp_sk(sk)->token) + mptcp_event(MPTCP_EVENT_CLOSED, mptcp_sk(sk), NULL, GFP_KERNEL); + + mptcp_destroy_common(msk); + msk->last_snd =3D 0; + msk->flags =3D 0; + msk->recovery =3D false; + msk->can_ack =3D false; + msk->fully_established =3D false; + msk->rcv_data_fin =3D false; + msk->snd_data_fin_enable =3D false; + msk->rcv_fastclose =3D false; + msk->use_64bit_ack =3D false; + WRITE_ONCE(msk->csum_enabled, mptcp_is_checksum_enabled(sock_net(sk))); + mptcp_pm_data_reset(msk); + mptcp_ca_reset(sk); + +#if IS_ENABLED(CONFIG_KASAN) + sock_set_flag(sk, SOCK_RCU_FREE); +#else + sock_reset_flag(sk, SOCK_RCU_FREE); +#endif + return 0; } =20 diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index f6f4054e19ee..188b9e044672 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -392,6 +392,9 @@ DECLARE_PER_CPU(struct mptcp_delegated_action, mptcp_de= legated_actions); /* MPTCP subflow context */ struct mptcp_subflow_context { struct list_head node;/* conn_list of subflows */ + + char reset_start[0]; + unsigned long avg_pacing_rate; /* protected by msk socket lock */ u64 local_key; u64 remote_key; @@ -438,6 +441,9 @@ struct mptcp_subflow_context { u8 stale_count; =20 long delegated_status; + + char reset_end[0]; + struct list_head delegated_node; /* link into delegated_action, protect= ed by local BH */ =20 u32 setsockopt_seq; @@ -469,6 +475,13 @@ mptcp_subflow_tcp_sock(const struct mptcp_subflow_cont= ext *subflow) return subflow->tcp_sock; } =20 +static inline void +mptcp_subflow_ctx_reset(struct mptcp_subflow_context *subflow) +{ + memset(subflow->reset_start, 0, subflow->reset_end - subflow->reset_start= ); + subflow->request_mptcp =3D 1; +} + static inline u64 mptcp_subflow_get_map_offset(const struct mptcp_subflow_context *subflow) { @@ -708,6 +721,7 @@ void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u8 *msg,= int len, void *hmac); =20 void __init mptcp_pm_init(void); void mptcp_pm_data_init(struct mptcp_sock *msk); +void mptcp_pm_data_reset(struct mptcp_sock *msk); void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock = *ssk); void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct so= ck *ssk); void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ss= k, int server_side); diff --git a/net/mptcp/token.c b/net/mptcp/token.c index e581b341c5be..f52ee7b26aed 100644 --- a/net/mptcp/token.c +++ b/net/mptcp/token.c @@ -384,6 +384,7 @@ void mptcp_token_destroy(struct mptcp_sock *msk) bucket->chain_len--; } spin_unlock_bh(&bucket->lock); + WRITE_ONCE(msk->token, 0); } =20 void __init mptcp_token_init(void) --=20 2.26.3 From nobody Thu Apr 18 11:10:28 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:956b:0:0:0:0:0 with SMTP id y98csp1256118jah; Fri, 5 Nov 2021 03:49:48 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwwcu91q8mBffvMxlRcbGJsthEp7mTAGI5fVKkiEeVTnxWmCFUL7YGYoGjSb65sDqESUD0K X-Received: by 2002:ab0:74c2:: with SMTP id f2mr2808087uaq.21.1636109388734; Fri, 05 Nov 2021 03:49:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1636109388; cv=none; d=google.com; s=arc-20160816; b=ANxPxiCNKXLr18/hWecVcePLjCkAZLkbUTTWwXr28+WVH3IhC63TikuKZz9yqSJ84N lb+2lNZpxNhK/t0bOjUzQT8yhzhn9oehEdENGntYO5oNBUIfoD3YW+j6DXHiTYUqFtMX 1dhY1/cGS6vc+7B8bjqWK8zLQPvwStS6iLMOV13ict60p4xVv9xKc8uod5jKVHQSNnBM ym6SOkaKkoQCC56aDh65KkThxQP6AM0tZFrv3ZKH9V7FkwH9AcUJGiKI9vtCwk6j2dna cV/TwAZ+d8r2paTzmcnplsGGM52I/jOzlwivvHFhWk8aRZAVmkrYzsRI9IEzePyxlCcS 4ovQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=OyY/WUYdJtP6gwCGDcHLvwtdy+aDd5yuFvsXsxkMt/A=; b=WhZJDrSa6yJgMUuXEgSZqDc8GdYbia649pBReBVCymen6uPylSxdSnCsyMClWNFdcR KA0itD3T4kc00MPv2Q1hqhWIZKwD/gf6enczAumGkqYJHNdeYx3OX3dhj0mWDx51sf2D 7OEK2ULeIESfb8ZHTFekhc59MQVd7l9HXKOGB0R9vKxMpSBCDLr9587S6wSt57JkCI3V xt37VYZrzupkoHZ2xd4kFgvEGJSLQf6ZG05b4XQ6y5tVJJqgkMDhE9uWah7s8dP5o/Yv 0YAfI7BV8NjtZ5ZbTo1Az+pwREIt+WVeEB0t9aJ3QIi36gKR+Ntv5vf6fq0xZ1gNXsXn OcBA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=L1Gxaycq; spf=pass (google.com: domain of mptcp+bounces-2375-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2375-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [147.75.69.165]) by mx.google.com with ESMTPS id y7si7008160vsn.196.2021.11.05.03.49.48 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 05 Nov 2021 03:49:48 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-2375-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) client-ip=147.75.69.165; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=L1Gxaycq; spf=pass (google.com: domain of mptcp+bounces-2375-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2375-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sjc.edge.kernel.org (Postfix) with ESMTPS id 2ABE73E10C4 for ; Fri, 5 Nov 2021 10:49:48 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 18C152C9C; Fri, 5 Nov 2021 10:49:47 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev 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 02C662C9B for ; Fri, 5 Nov 2021 10:49:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1636109385; 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=OyY/WUYdJtP6gwCGDcHLvwtdy+aDd5yuFvsXsxkMt/A=; b=L1GxaycqJ4MaTKXHjqWWSG2wwAzVM2o6iwetNAuUFLu/BX2gh4RCExJXEh1PMKEWEsDsYR hIRVCJ4xqDJfYEzhSvJ41kF2MXbt1pKztdvKWmzJN+U2ppFMCAiNSvieYnm/wAmMdso79W kJT9PPIsjDqeRVhihgSLBfJHJBFSvoE= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-350-3IeaNP7SNpSrv1eoo_ONKw-1; Fri, 05 Nov 2021 06:49:32 -0400 X-MC-Unique: 3IeaNP7SNpSrv1eoo_ONKw-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 35D721835AC8 for ; Fri, 5 Nov 2021 10:49:31 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.194.132]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9D7825D9D3 for ; Fri, 5 Nov 2021 10:49:30 +0000 (UTC) From: Paolo Abeni To: MPTCP Upstream Subject: [RFC PATCH 3/3] mptcp: cleanup accept and poll Date: Fri, 5 Nov 2021 11:49:12 +0100 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 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pabeni@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" After the previous patch, msk->subflow will never be deleted during the whole msk lifetime. We don't need anymore to acquire references to it in mptcp_stream_accept() and we can use the listener subflow accept queue to simplify mptcp_poll() for listener socket. Overall this removes a lock pair and 4 more atomic operations per accept(). Signed-off-by: Paolo Abeni --- net/mptcp/protocol.c | 25 +++++++------------------ net/mptcp/protocol.h | 1 - net/mptcp/subflow.c | 1 - 3 files changed, 7 insertions(+), 20 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 5fe19adb88a5..38f5b4bcba69 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3402,17 +3402,9 @@ static int mptcp_stream_accept(struct socket *sock, = struct socket *newsock, =20 pr_debug("msk=3D%p", msk); =20 - lock_sock(sock->sk); - if (sock->sk->sk_state !=3D TCP_LISTEN) - goto unlock_fail; - ssock =3D __mptcp_nmpc_socket(msk); if (!ssock) - goto unlock_fail; - - clear_bit(MPTCP_DATA_READY, &msk->flags); - sock_hold(ssock->sk); - release_sock(sock->sk); + return -EINVAL; =20 err =3D ssock->ops->accept(sock, newsock, flags, kern); if (err =3D=3D 0 && !mptcp_is_tcpsk(newsock->sk)) { @@ -3452,14 +3444,7 @@ static int mptcp_stream_accept(struct socket *sock, = struct socket *newsock, release_sock(newsk); } =20 - if (inet_csk_listen_poll(ssock->sk)) - set_bit(MPTCP_DATA_READY, &msk->flags); - sock_put(ssock->sk); return err; - -unlock_fail: - release_sock(sock->sk); - return -EINVAL; } =20 static __poll_t mptcp_check_readable(struct mptcp_sock *msk) @@ -3505,8 +3490,12 @@ static __poll_t mptcp_poll(struct file *file, struct= socket *sock, =20 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) - return test_bit(MPTCP_DATA_READY, &msk->flags) ? EPOLLIN | EPOLLRDNORM := 0; + if (state =3D=3D TCP_LISTEN) { + if (WARN_ON_ONCE(!msk->subflow || !msk->subflow->sk)) + return 0; + + return inet_csk_listen_poll(msk->subflow->sk); + } =20 if (state !=3D TCP_SYN_SENT && state !=3D TCP_SYN_RECV) { mask |=3D mptcp_check_readable(msk); diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 188b9e044672..b2d016f8803a 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -111,7 +111,6 @@ #define MPTCP_RST_TRANSIENT BIT(0) =20 /* MPTCP socket flags */ -#define MPTCP_DATA_READY 0 #define MPTCP_NOSPACE 1 #define MPTCP_WORK_RTX 2 #define MPTCP_WORK_EOF 3 diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 72ccbd85941b..4e7395cfab9b 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1293,7 +1293,6 @@ static void subflow_data_ready(struct sock *sk) if (reqsk_queue_empty(&inet_csk(sk)->icsk_accept_queue)) return; =20 - set_bit(MPTCP_DATA_READY, &msk->flags); parent->sk_data_ready(parent); return; } --=20 2.26.3