From nobody Wed May 1 14:29:24 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:ab0:590e:0:0:0:0:0 with SMTP id n14csp63850uad; Wed, 29 Jun 2022 15:36:00 -0700 (PDT) X-Google-Smtp-Source: AGRyM1uwQP0/1sNV8bG2V02uYXB26z3+0/D23EGrLREdEyp8NRj5rfzWFl2QSPnSRACm+eSsuIue X-Received: by 2002:a17:902:8f97:b0:169:5e8:d75b with SMTP id z23-20020a1709028f9700b0016905e8d75bmr12627237plo.28.1656542160349; Wed, 29 Jun 2022 15:36:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1656542160; cv=none; d=google.com; s=arc-20160816; b=MPTVJx/aSTawjfil7fk5V/uZa1CLTtsjgq5fPKmyYgO/5FasOSXQHyPNuNfiOk2fUi RiFwSXuBiMw22eYdOJKeuToKsDcpPjl8jGreng2e80LLHnH6zWH6raibNwhjMFqdkZZJ jURzE6MtNEfeGsTcdntvku56fEA2SDPXsLLK2C/N9PtHSx4TQRi/YyROBbH8Mhu84LWa kmx5TMzAZ9i/wOaNx13lZvRhrsnEkwk8IFJh9y8wObFNVIp9de9flfS+8Ldo2tYEcamH HF97oRvQVWbAO5EKMc8rCpN5SOU5yo7Z1cGaO2166mEzr8DdnPG/c0Icb7wM5wdJut1g RNCA== 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:cc:to:from:dkim-signature; bh=zW3RYXfs3puMtaDV+55kojVqNd8U++TyIdROLnK00uY=; b=Foj1WM0twDUe6V1f+rZPIfsfjxB8OyT9ZQ1aLy5Hson1+UqhifCgkov0RuEOVK/Ekv hViyC5REyVtXpRismF2E+mSmrISIuTMZYRj3RDot3HjGrYtvuTjmRFF+mRltv4Ri+GFy s2Y7z+JygYBXmcHySuFMdEZSWopNxiuR+mdtg4HKsQmer/XUnySejTS40zEzxAmeyNpj WClhh6BodTl/8k+AWfrgDqkk9TiH1pwp7S0Bf3vigft7b+9kNJwYXT0rt5UUyR+yTUUU rMIkXH+f5qtl5pAKIGyw8g5h7dm9rY2SDVGEjQOhmCVhC4ckXK9eIG+QfepnobspJNQt Zw4A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=lbvw0fsc; spf=pass (google.com: domain of mptcp+bounces-5893-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5893-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id r4-20020a635144000000b00408c5943df5si23350992pgl.38.2022.06.29.15.36.00 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 29 Jun 2022 15:36:00 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5893-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=lbvw0fsc; spf=pass (google.com: domain of mptcp+bounces-5893-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5893-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.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 sv.mirrors.kernel.org (Postfix) with ESMTPS id CB260280C11 for ; Wed, 29 Jun 2022 22:35:59 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 1E3706ADB; Wed, 29 Jun 2022 22:35:59 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) (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 759EE7B for ; Wed, 29 Jun 2022 22:35:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1656542157; x=1688078157; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=qmRi+cGXcerluFw1EN+/UhOf5UoZko7/g8T3OUWG1vU=; b=lbvw0fsckcoIw/pRMmPvjQvRrr9/Jk5ev3/32k8zMMybOZ4dTXAsUct3 5KQ2Xj4SgXImSIscDKU65/LE7y9o5G41szNRwnQqzQmiNNPbxCwss6jYA cWZUh3bRiFZ5O/g5yyEt5qGsMNXdCQCwlTjvLRNcP4BMg0/CZeadeAwaL l46bZ0XvFjiriufIY6ErVzCN9ygaZA0UQUz//hsDjKVayOJxvWvSc+rxx bZT6Nj7fOYGy8TGCSIaeTBvlchtaBWM54X49yPAz/s//RwZGoDC/7w/l3 RX+dchh0YBfvTZRf93ZH4TgbPOX09CpdgGId+GEYLbqkqPBnMFkthvHiu Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10393"; a="282214125" X-IronPort-AV: E=Sophos;i="5.92,232,1650956400"; d="scan'208";a="282214125" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jun 2022 15:35:54 -0700 X-IronPort-AV: E=Sophos;i="5.92,232,1650956400"; d="scan'208";a="718005996" Received: from divyamar-mobl2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.13.211]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jun 2022 15:35:54 -0700 From: Mat Martineau To: mptcp@lists.linux.dev, pabeni@redhat.com Cc: Mat Martineau Subject: [PATCH mptcp-net v2 1/2] mptcp: Avoid acquiring PM lock for subflow priority changes Date: Wed, 29 Jun 2022 15:35:49 -0700 Message-Id: <20220629223550.655928-2-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.37.0 In-Reply-To: <20220629223550.655928-1-mathew.j.martineau@linux.intel.com> References: <20220629223550.655928-1-mathew.j.martineau@linux.intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The in-kernel path manager code for changing subflow flags acquired both the msk socket lock and the PM lock when possibly changing the "backup" and "fullmesh" flags. mptcp_pm_nl_mp_prio_send_ack() does not access anything protected by the PM lock, and it must release and reacquire the PM lock. By pushing the PM lock to where it is needed in mptcp_pm_nl_fullmesh(), the lock is only acquired when the fullmesh flag is changed and the backup flag code no longer has to release and reacquire the PM lock. The change in locking context requires the MIB update to be modified - move that to a better location instead. This change also makes it possible to call mptcp_pm_nl_mp_prio_send_ack() for the userspace PM commands without manipulating the in-kernel PM lock. v2: Move MIB call to handle change in atomic context. Fixes: 0f9f696a502e ("mptcp: add set_flags command in PM netlink") Signed-off-by: Mat Martineau --- net/mptcp/options.c | 2 ++ net/mptcp/pm_netlink.c | 7 ++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/net/mptcp/options.c b/net/mptcp/options.c index aead331866a0..d5e58d2ce153 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -1584,6 +1584,8 @@ void mptcp_write_options(struct tcphdr *th, __be32 *p= tr, struct tcp_sock *tp, *ptr++ =3D mptcp_option(MPTCPOPT_MP_PRIO, TCPOLEN_MPTCP_PRIO, opts->backup, TCPOPT_NOP); + + MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPPRIOTX); } =20 mp_capable_done: diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index e099f2a12504..936d72359c46 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -739,12 +739,9 @@ static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_s= ock *msk, subflow->backup =3D bkup; subflow->send_mp_prio =3D 1; subflow->request_bkup =3D bkup; - __MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPPRIOTX); =20 - spin_unlock_bh(&msk->pm.lock); pr_debug("send ack for mp_prio"); mptcp_subflow_send_ack(ssk); - spin_lock_bh(&msk->pm.lock); =20 return 0; } @@ -1816,8 +1813,10 @@ static void mptcp_pm_nl_fullmesh(struct mptcp_sock *= msk, =20 list.ids[list.nr++] =3D addr->id; =20 + spin_lock_bh(&msk->pm.lock); mptcp_pm_nl_rm_subflow_received(msk, &list); mptcp_pm_create_subflow_or_signal_addr(msk); + spin_unlock_bh(&msk->pm.lock); } =20 static int mptcp_nl_set_flags(struct net *net, @@ -1835,12 +1834,10 @@ static int mptcp_nl_set_flags(struct net *net, goto next; =20 lock_sock(sk); - spin_lock_bh(&msk->pm.lock); if (changed & MPTCP_PM_ADDR_FLAG_BACKUP) ret =3D mptcp_pm_nl_mp_prio_send_ack(msk, addr, bkup); if (changed & MPTCP_PM_ADDR_FLAG_FULLMESH) mptcp_pm_nl_fullmesh(msk, addr); - spin_unlock_bh(&msk->pm.lock); release_sock(sk); =20 next: --=20 2.36.1 From nobody Wed May 1 14:29:24 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:ab0:590e:0:0:0:0:0 with SMTP id n14csp63859uad; Wed, 29 Jun 2022 15:36:01 -0700 (PDT) X-Google-Smtp-Source: AGRyM1sqYGlYKdpQEiSFWO3yK576dUKA5/fvpasM/iPYy9Ok3dp1U+SItyh/JmoEy1akuzCHj5e8 X-Received: by 2002:a17:90b:1d81:b0:1ec:afbc:f026 with SMTP id pf1-20020a17090b1d8100b001ecafbcf026mr6402094pjb.192.1656542161341; Wed, 29 Jun 2022 15:36:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1656542161; cv=none; d=google.com; s=arc-20160816; b=N5Yf1eC1j9AemTQKZ0L5OheiooTuxjFBvcGHwZ8xsYXHFtM2c4miS8fdzil/Jme1k1 ew4RV31vZdn7vHb/W38Uc9oRIgkuP4PjySRjf36RSKnV+mLUiyn1uERfzXHAIuFZICbv 8zt/gH5TPhb/IVC7avW641ugMssKdfFU/S+oEP2SmpSFjO4P2ux3vMQawLFcrsLfk9c7 lTPLF/5yreiBNf8FnP7vkPH8BBp2l9lNAnMfsDZb1K/Sjil7b8G/5Ky+hOXSJPBkqK1d G5W5yu8El3pteGmqagChISgkD+0MPK2POl4mS+GGrfcZwhRv5c8SsJfhiR7r3xtJCMSH PoNw== 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:cc:to:from:dkim-signature; bh=qoRgCwByt/dKouFdDgAGXnx8m+uDuy8AxvY3dQ5tacs=; b=FNJygBr5w9o/jkdKN1CMufrHndi6OX6scSFUQg6ermGS3+NLHjV1rRnPohiOBei6wm IcJNuJrTlA5yMTiGFwvaj2qbORcMMSP8kjlC0LOvSaiC4lqz4JhxRMkz3xMXmTPS8kE3 /8P0yeIhUpQs1J2vbEtK0ZWLfzwVEqUX3UNKonFG583+D4afro+vbMuu3U2xRf+u58ud E0GoSamID872nU3SAaITVbKL9nMmNfFae6/yYWibMl4Jm58hOXvtiuITuAiXPfO6CjFt G1+/yFZz0/zV0Shdf47vDe56HuBRoRxFP3hBh5nmgnzPSQJB2tDpMZ9OFYLca/t6ThJZ ffCw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=oEdOcSXp; spf=pass (google.com: domain of mptcp+bounces-5894-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5894-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id x3-20020a17090a9dc300b001ec72dc9099si4257961pjv.180.2022.06.29.15.36.01 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 29 Jun 2022 15:36:01 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5894-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=oEdOcSXp; spf=pass (google.com: domain of mptcp+bounces-5894-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5894-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.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 sv.mirrors.kernel.org (Postfix) with ESMTPS id 19CE4280C0A for ; Wed, 29 Jun 2022 22:36:01 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 786D07B; Wed, 29 Jun 2022 22:35:59 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) (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 EBB886AC0 for ; Wed, 29 Jun 2022 22:35:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1656542157; x=1688078157; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=EvaQjk+5XNMCrHXpibm6WIDqle7blbNVE8maepgy9x8=; b=oEdOcSXpVH348Ra4MFkxuQorcrhgGBqJqjaWG94ltDKdxeUbozz/90Aq 1Fd99XULl/ZSIgW2p/zcej1+6XFBW8ZcVz3PtOX/WFLeSFnbmvwy8U9Tc eKaZ3OVqu/RTDY+KdUc1M7WjrgDjwmHUF1+sBNCRxxxX02QOP+7pAb8lD 8joH2wGETjNAdKPEWPTfJ7w0s/lO5qV/c7/PGo/Yj6qOcv8UeF60LwVpN C4avQ59ULgjYFDOjxIc4sHmoiqNf5M3GKScyDMlFvNSKrUxfsd3UMtfMK S3hBDfqigS/4efWbCI5WWbD89o2K6+ASoMthvF3eXuf4kUClMC94nPmym A==; X-IronPort-AV: E=McAfee;i="6400,9594,10393"; a="282214127" X-IronPort-AV: E=Sophos;i="5.92,232,1650956400"; d="scan'208";a="282214127" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jun 2022 15:35:55 -0700 X-IronPort-AV: E=Sophos;i="5.92,232,1650956400"; d="scan'208";a="718005997" Received: from divyamar-mobl2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.13.211]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jun 2022 15:35:54 -0700 From: Mat Martineau To: mptcp@lists.linux.dev, pabeni@redhat.com Cc: Mat Martineau Subject: [PATCH mptcp-net v2 2/2] mptcp: Acquire the subflow socket lock before modifying MP_PRIO flags Date: Wed, 29 Jun 2022 15:35:50 -0700 Message-Id: <20220629223550.655928-3-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.37.0 In-Reply-To: <20220629223550.655928-1-mathew.j.martineau@linux.intel.com> References: <20220629223550.655928-1-mathew.j.martineau@linux.intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When setting up a subflow's flags for sending MP_PRIO MPTCP options, the subflow socket lock was not held while reading and modifying several struct members that are also read and modified in mptcp_write_options(). Acquire the subflow socket lock earlier and send the MP_PRIO ACK with that lock already acquired. Add a new variant of the mptcp_subflow_send_ack() helper to use with the subflow lock held. v2: Squashed helper function commit Fixes: 067065422fcd ("mptcp: add the outgoing MP_PRIO support") Signed-off-by: Mat Martineau --- net/mptcp/pm_netlink.c | 5 ++++- net/mptcp/protocol.c | 9 +++++++-- net/mptcp/protocol.h | 1 + 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 936d72359c46..04bae2d38b5b 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -729,11 +729,13 @@ static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_= sock *msk, struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); struct sock *sk =3D (struct sock *)msk; struct mptcp_addr_info local; + bool slow; =20 local_address((struct sock_common *)ssk, &local); if (!mptcp_addresses_equal(&local, addr, addr->port)) continue; =20 + slow =3D lock_sock_fast(ssk); if (subflow->backup !=3D bkup) msk->last_snd =3D NULL; subflow->backup =3D bkup; @@ -741,7 +743,8 @@ static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_so= ck *msk, subflow->request_bkup =3D bkup; =20 pr_debug("send ack for mp_prio"); - mptcp_subflow_send_ack(ssk); + __mptcp_subflow_send_ack(ssk); + unlock_sock_fast(ssk, slow); =20 return 0; } diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 3efbae948707..b96a80c8e22a 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -506,13 +506,18 @@ static inline bool tcp_can_send_ack(const struct sock= *ssk) (TCPF_SYN_SENT | TCPF_SYN_RECV | TCPF_TIME_WAIT | TCPF_CLOSE | TCP= F_LISTEN)); } =20 +void __mptcp_subflow_send_ack(struct sock *ssk) +{ + if (tcp_can_send_ack(ssk)) + tcp_send_ack(ssk); +} + void mptcp_subflow_send_ack(struct sock *ssk) { bool slow; =20 slow =3D lock_sock_fast(ssk); - if (tcp_can_send_ack(ssk)) - tcp_send_ack(ssk); + __mptcp_subflow_send_ack(ssk); unlock_sock_fast(ssk, slow); } =20 diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index c14d70c036d0..033c995772dc 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -607,6 +607,7 @@ void __init mptcp_subflow_init(void); void mptcp_subflow_shutdown(struct sock *sk, struct sock *ssk, int how); void mptcp_close_ssk(struct sock *sk, struct sock *ssk, struct mptcp_subflow_context *subflow); +void __mptcp_subflow_send_ack(struct sock *ssk); void mptcp_subflow_send_ack(struct sock *ssk); void mptcp_subflow_reset(struct sock *ssk); void mptcp_subflow_queue_clean(struct sock *ssk); --=20 2.36.1