From nobody Mon Apr 29 05:24:29 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:ab0:590e:0:0:0:0:0 with SMTP id n14csp72168uad; Wed, 29 Jun 2022 15:53:37 -0700 (PDT) X-Google-Smtp-Source: AGRyM1ulP9YP7npDUk0K3AQ8NVgK0b3PFLl71o14DSBZK6+qlTQt1ejbmbd8C7PmwLdsKjQw5i+b X-Received: by 2002:a05:6808:1691:b0:325:61f7:7e6a with SMTP id bb17-20020a056808169100b0032561f77e6amr3706450oib.256.1656543217474; Wed, 29 Jun 2022 15:53:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1656543217; cv=none; d=google.com; s=arc-20160816; b=rg5E3L1CXapznDoG28+LxWeHjiU99KimICcgfrFxWGIkRaXj9nRY7ZhZWkp35mRlAN Ex5ryvSxwa6VK8EX1r6zKLoIClmcUxgXdZ0rIQqTROSlEhnZL5ki5mf0tUXRyxU/h64N gaGJD8Pl0XccwRLTjl0+3QVQBDAOXE0Iq3oxMn5dB8aiXiPqRKHpNkqgoCN0wr0obZk9 uXiqMUBKNGK0UZQNzbOpESuEj0FSmtp4kNiFZTw9b/ICSUe6VVhHESO+i3t6FElLL+5r +LeXyb1aVCT2mHQVfxYKT3P4Imf24zMoF49QqLTAG8bJnnSp0po+pC8gg3jowSxi1/Hm CXbw== 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=OQyLeGQs4C8xn9QkRtOCoDXwb27t66f9HfTzk+8TVNM=; b=e7cJ0dB8K+zIe6Fe3+q4jCsM5qX9YTwdEj+eCDSvx8fwMBBIQgxG88lRW8IFosd5sY fzen6NJiIcHITIiTA2c//zWj0yDqgjFThz5ndDIyGF3HSeaECQRO0mnH/HNSDr8Ep2ak fYd0LOu3MuhvLDGjqZiSlmfIUz71lEKHfqYcW6tX1cipn/gURmv0JFV0WAdp/Oo+62Tu 4G64opYR75YrIE0qbx8dfVadhwPie+j6zze7aSAYfu1X9LbbxawkJjwmzu9EOg/+BrId 5IEKAvt2F3m2VHrrJ5ExXPqCWaideSPD/ZG5BRQGJrNUnCXUP+oMNKRdl7I1JCA6kY54 Er6A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=kkRS42Ky; spf=pass (google.com: domain of mptcp+bounces-5898-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5898-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from da.mirrors.kernel.org (da.mirrors.kernel.org. [139.178.84.19]) by mx.google.com with ESMTPS id bl35-20020a05680830a300b0032ed6391eaasi26521101oib.242.2022.06.29.15.53.37 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 29 Jun 2022 15:53:37 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5898-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) client-ip=139.178.84.19; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=kkRS42Ky; spf=pass (google.com: domain of mptcp+bounces-5898-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5898-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 da.mirrors.kernel.org (Postfix) with ESMTPS id 9F9852E0A75 for ; Wed, 29 Jun 2022 22:53:36 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 38B486ADE; Wed, 29 Jun 2022 22:53:35 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 C7A577B for ; Wed, 29 Jun 2022 22:53:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1656543213; x=1688079213; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=AfcaFE9tZ2fT8hsrB3RT2PdizEQOzByOL/b01tnz/Xs=; b=kkRS42Kya7s1OI3XYeIT5ZT62f2UQ7eIGaE79fx1+6e92BlN7OD86pCw zHt74SeuwDskFM/PnkK+3+Hi1jZ30VvE506ToBxruuJQ7STRcQ7B+n3y6 cRGSTvdAEk0pxz9M4FK12SqdAKokrErDexZBteV11WakOPdCIuu1DqEoc D8RTslOkBlZVgcgN1IWMvs9y5FKhLbHhGTrGCFhDWEf2aVLxDgfT+DvrK qm3IOmc0cPIcGIm2rurQfOqSO7yKFAiTOblzBZBderGvD0DQDWAqH7SZW WvtP/Et2w55lnK4jnvxGscDwoH6rScmVbpFkTDm8jVC8dY6/Cnox0uQ9f Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10393"; a="368498785" X-IronPort-AV: E=Sophos;i="5.92,232,1650956400"; d="scan'208";a="368498785" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jun 2022 15:53:31 -0700 X-IronPort-AV: E=Sophos;i="5.92,232,1650956400"; d="scan'208";a="917796274" Received: from divyamar-mobl2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.13.211]) by fmsmga005-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jun 2022 15:53:31 -0700 From: Mat Martineau To: mptcp@lists.linux.dev, pabeni@redhat.com Cc: Mat Martineau Subject: [PATCH mptcp-net v3 1/2] mptcp: Avoid acquiring PM lock for subflow priority changes Date: Wed, 29 Jun 2022 15:53:26 -0700 Message-Id: <20220629225327.657202-2-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.37.0 In-Reply-To: <20220629225327.657202-1-mathew.j.martineau@linux.intel.com> References: <20220629225327.657202-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. v3: Build fixes Fixes: 0f9f696a502e ("mptcp: add set_flags command in PM netlink") Signed-off-by: Mat Martineau Acked-by: Paolo Abeni --- net/mptcp/options.c | 3 +++ net/mptcp/pm_netlink.c | 8 ++------ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/net/mptcp/options.c b/net/mptcp/options.c index aead331866a0..bd8f0f425be4 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -1584,6 +1584,9 @@ 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((const struct sock *)tp), + MPTCP_MIB_MPPRIOTX); } =20 mp_capable_done: diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index e099f2a12504..5ff93b73f33d 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -727,7 +727,6 @@ static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_so= ck *msk, =20 mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); - struct sock *sk =3D (struct sock *)msk; struct mptcp_addr_info local; =20 local_address((struct sock_common *)ssk, &local); @@ -739,12 +738,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 +1812,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 +1833,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.37.0 From nobody Mon Apr 29 05:24:29 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:ab0:590e:0:0:0:0:0 with SMTP id n14csp72172uad; Wed, 29 Jun 2022 15:53:38 -0700 (PDT) X-Google-Smtp-Source: AGRyM1srStO0GwAnxmrr26qM/u7wZ+d55XclQ2/m53CRMxOlKWdbcJLmTsmWCXh78VC2OswjzGwv X-Received: by 2002:a05:6808:118c:b0:2d4:4194:70db with SMTP id j12-20020a056808118c00b002d4419470dbmr3576068oil.93.1656543218006; Wed, 29 Jun 2022 15:53:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1656543218; cv=none; d=google.com; s=arc-20160816; b=bJKhwRL2z/2yfLm0FRK1Gg3+qRIW8t3Pi4SL+peT1Hp1T7JZEWiIbrktGKEp59q+Xi MNaOXfVbW7/xr5R8VrGRFXq0dwMc1vgHMJT46JsCwvWQL49JxSfBqcskQVJWaDgghS+A 9pY8skRgJXGGpkJjPKnZRaPhr9s0d7F7mr1hXXdqbiA5ylBwH375KrQ759unlmlErDog zkSubGNkpQ21xCjeZ5GYKtaDvSTG0iQ9VdjDPRcZrkhxu+pEjrDiADs7jRZ0R++3Zaz8 UJQ5zYaMvm85EouapuXnldlbY9/i7NQCKQ8bEeYwHqh6T9r2jQ/2M4znbkQUrlKd/rQB QsBg== 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=qvZcAaxn0WpsiXHWYvWN4cbeWdrIXbfKBeqoOJy+5og=; b=h854hzCYKIvQ5mVr1rg8pFhEwy6KICSapgI/jHeQDJq3sUTsGYW2gGeMUkP1ne1hns BRvpolFPsE5IcBZT5itQcGxEMTPHpycCFXSW+PiE1+2cK7Aqd7kDkgDCzzoCfzr8pdHf hfr8bN5WSsxK5ezg8Iu7bQwWSLxqhMwUYiS4EzU/Rni6mDE+SmZhyCgkCdDpCF05AasL 6QmN40KmqjwStUE2WTiHakszJZhfFw2+yEepIkeyYo65rqoPxmg/sexJq/CHAtPSEkpv yi8hfTxNi1KXOv8+POFPpd1GgZSyo8nhYF6+gesVl93iLB8noncAlDhcXWhNtrVro/CW 1/rg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=St00RI6B; spf=pass (google.com: domain of mptcp+bounces-5899-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5899-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from da.mirrors.kernel.org (da.mirrors.kernel.org. [139.178.84.19]) by mx.google.com with ESMTPS id bk38-20020a0568081a2600b003356738a320si14704269oib.246.2022.06.29.15.53.37 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 29 Jun 2022 15:53:38 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5899-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) client-ip=139.178.84.19; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=St00RI6B; spf=pass (google.com: domain of mptcp+bounces-5899-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5899-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 da.mirrors.kernel.org (Postfix) with ESMTPS id D494E2E0A75 for ; Wed, 29 Jun 2022 22:53:37 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 778187B; Wed, 29 Jun 2022 22:53:35 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 3ECC06ADB for ; Wed, 29 Jun 2022 22:53:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1656543214; x=1688079214; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=YidN+KwUmTWdbyFrHnnyxsnJooCAyuG4bQjhbQ7HDV4=; b=St00RI6BBeZoTRYiYebpZMLhogmcW847tF5qcQVAJ+SltOmlj6w08AaW MxSLPeXYgI1pTAv1flZDqz5iTPbevedyHhWeBHAX+Dhcx/8d+HwhdVBmo ysAJw651+ow5YWGFUJ2rED+/9lQuG2RK3o4pgsYJcVlAfcu7votuKZWfB MTbE3O84JYTKPHDGjGnhpB+xUOey69Wqhx3LTkRAE34ytmPj+5YbCn2/J QmyVSfhdIQ5+MjQiK91ND2AulK3RshXN4SPHiR627h1EwaL71Fztk99E/ u5IfKlYHZu6uprHCowjc5wTjdpjOienUgZgbQdVmZ0BiofLgn3RMyj21/ A==; X-IronPort-AV: E=McAfee;i="6400,9594,10393"; a="368498786" X-IronPort-AV: E=Sophos;i="5.92,232,1650956400"; d="scan'208";a="368498786" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jun 2022 15:53:32 -0700 X-IronPort-AV: E=Sophos;i="5.92,232,1650956400"; d="scan'208";a="917796275" Received: from divyamar-mobl2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.13.211]) by fmsmga005-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jun 2022 15:53:31 -0700 From: Mat Martineau To: mptcp@lists.linux.dev, pabeni@redhat.com Cc: Mat Martineau Subject: [PATCH mptcp-net v3 2/2] mptcp: Acquire the subflow socket lock before modifying MP_PRIO flags Date: Wed, 29 Jun 2022 15:53:27 -0700 Message-Id: <20220629225327.657202-3-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.37.0 In-Reply-To: <20220629225327.657202-1-mathew.j.martineau@linux.intel.com> References: <20220629225327.657202-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 Acked-by: Paolo Abeni --- 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 5ff93b73f33d..ca86c88f89e0 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -728,11 +728,13 @@ static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_= sock *msk, mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); 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; @@ -740,7 +742,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.37.0