From nobody Fri Mar 29 09:03:52 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:d02:0:0:0:0 with SMTP id q2csp393761jaj; Wed, 1 Sep 2021 10:16:07 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyPXTNYKZZ7/9/yg0KPqAJKUQ6ax6xLUyEUz6AB5suwWkmMv3ZpERtQmKBwAEmeJsG9kgt4 X-Received: by 2002:a67:2dc6:: with SMTP id t189mr481386vst.49.1630516567152; Wed, 01 Sep 2021 10:16:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1630516567; cv=none; d=google.com; s=arc-20160816; b=tFfP5+aDMJVeijpkNSm8Ewk8JuWb2iVuG4k2n5gYolUVq8CqSUX2JoNl4TOJucduyT FOmQAuA87jUBRKRoe0M8eOme7w9KdFkPvFeLn8glKuW/Jz+xQmEhAlRk5GQZTG1YbFsl OWvOfZXQvaOGhQYcdlKuOyaKI8OgK3+Dx5F6UctuXo+QtMvenOjmo/qWfNiXUsUwMYwb LLXsfw62WgcODr9zaeD1vwIABgvicqx9hUPEtjkrubNKebAPYQNM4Jgq/UmHwIRNpN+y mTQGn6HWXhQDTGXItoE7mKA/1mnUvLrKsWGphhA1JQ4qyCj6TT6BTjQJdrHZsjEgvEwu OHMw== 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; bh=ZX/ivUzbyMm+GwJSAuyMxLmVm1rEjmcMmOI5rTJsCQo=; b=chGJEwWQN4ZeFit2OuaHHcmAtbN2YgNYMG3S07KTGlXabcRk4vFfmzp6W8sre0ZskG vuOfcfPbA1762XghGoG718O0qb0sukcvrExSVIzVD6MQ7g+7nGnHIhpi7UNYHBBDB73p d7jA7DYVnT3MgjKR302IuFHOycrcaN3r6lICHF9uln+dRWZrRGrSGToj5bTInMWyh0YI fjdolA/ibLoCPpgB66B+T1FPfmJnSxtTTsp1a5d/NlsrSnnYhjmAf+aTgzHXAs4MXk5l TvYTG2TeVmhANkJHUpOhuwWow/FJFKeokx6EKNhqdF8Gb28qmPfxQrLpvD/1gBIKoHIk Ko0w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-1803-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-1803-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [147.75.69.165]) by mx.google.com with ESMTPS id v3si312230vse.180.2021.09.01.10.16.07 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 01 Sep 2021 10:16:07 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-1803-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; spf=pass (google.com: domain of mptcp+bounces-1803-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-1803-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=fail (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 sjc.edge.kernel.org (Postfix) with ESMTPS id D34583E0F44 for ; Wed, 1 Sep 2021 17:16:06 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 3D2953FD5; Wed, 1 Sep 2021 17:16:05 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 0724572 for ; Wed, 1 Sep 2021 17:16:03 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10094"; a="279823958" X-IronPort-AV: E=Sophos;i="5.84,370,1620716400"; d="scan'208";a="279823958" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Sep 2021 10:15:42 -0700 X-IronPort-AV: E=Sophos;i="5.84,370,1620716400"; d="scan'208";a="645852934" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.212.226.118]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Sep 2021 10:15:42 -0700 From: Mat Martineau To: netdev@vger.kernel.org Cc: Paolo Abeni , davem@davemloft.net, kuba@kernel.org, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Florian Westphal , Mat Martineau Subject: [PATCH net v3 1/2] mptcp: fix possible divide by zero Date: Wed, 1 Sep 2021 10:15:36 -0700 Message-Id: <20210901171537.121255-2-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210901171537.121255-1-mathew.j.martineau@linux.intel.com> References: <20210901171537.121255-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" From: Paolo Abeni Florian noted that if mptcp_alloc_tx_skb() allocation fails in __mptcp_push_pending(), we can end-up invoking mptcp_push_release()/tcp_push() with a zero mss, causing a divide by 0 error. This change addresses the issue refactoring the skb allocation code checking if skb collapsing will happen for sure and doing the skb allocation only after such check. Skb allocation will now happen only after the call to tcp_send_mss() which correctly initializes mss_now. As side bonuses we now fill the skb tx cache only when needed, and this also clean-up a bit the output path. v1 -> v2: - use lockdep_assert_held_once() - Jakub - fix indentation - Jakub Reported-by: Florian Westphal Fixes: 724cfd2ee8aa ("mptcp: allocate TX skbs in msk context") Signed-off-by: Paolo Abeni Signed-off-by: Mat Martineau --- net/mptcp/protocol.c | 76 ++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 41 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index ade648c3512b..a4c6e37e07c9 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1003,6 +1003,13 @@ static void mptcp_wmem_uncharge(struct sock *sk, int= size) msk->wmem_reserved +=3D size; } =20 +static void __mptcp_mem_reclaim_partial(struct sock *sk) +{ + lockdep_assert_held_once(&sk->sk_lock.slock); + __mptcp_update_wmem(sk); + sk_mem_reclaim_partial(sk); +} + static void mptcp_mem_reclaim_partial(struct sock *sk) { struct mptcp_sock *msk =3D mptcp_sk(sk); @@ -1094,12 +1101,8 @@ static void __mptcp_clean_una(struct sock *sk) msk->recovery =3D false; =20 out: - if (cleaned) { - if (tcp_under_memory_pressure(sk)) { - __mptcp_update_wmem(sk); - sk_mem_reclaim_partial(sk); - } - } + if (cleaned && tcp_under_memory_pressure(sk)) + __mptcp_mem_reclaim_partial(sk); =20 if (snd_una =3D=3D READ_ONCE(msk->snd_nxt) && !msk->recovery) { if (mptcp_timer_pending(sk) && !mptcp_data_fin_enabled(msk)) @@ -1179,6 +1182,7 @@ struct mptcp_sendmsg_info { u16 limit; u16 sent; unsigned int flags; + bool data_lock_held; }; =20 static int mptcp_check_allowed_size(struct mptcp_sock *msk, u64 data_seq, @@ -1250,17 +1254,17 @@ static bool __mptcp_alloc_tx_skb(struct sock *sk, s= truct sock *ssk, gfp_t gfp) return false; } =20 -static bool mptcp_must_reclaim_memory(struct sock *sk, struct sock *ssk) +static bool mptcp_alloc_tx_skb(struct sock *sk, struct sock *ssk, bool dat= a_lock_held) { - return !ssk->sk_tx_skb_cache && - tcp_under_memory_pressure(sk); -} + gfp_t gfp =3D data_lock_held ? GFP_ATOMIC : sk->sk_allocation; =20 -static bool mptcp_alloc_tx_skb(struct sock *sk, struct sock *ssk) -{ - if (unlikely(mptcp_must_reclaim_memory(sk, ssk))) - mptcp_mem_reclaim_partial(sk); - return __mptcp_alloc_tx_skb(sk, ssk, sk->sk_allocation); + if (unlikely(tcp_under_memory_pressure(sk))) { + if (data_lock_held) + __mptcp_mem_reclaim_partial(sk); + else + mptcp_mem_reclaim_partial(sk); + } + return __mptcp_alloc_tx_skb(sk, ssk, gfp); } =20 /* note: this always recompute the csum on the whole skb, even @@ -1284,7 +1288,7 @@ static int mptcp_sendmsg_frag(struct sock *sk, struct= sock *ssk, bool zero_window_probe =3D false; struct mptcp_ext *mpext =3D NULL; struct sk_buff *skb, *tail; - bool can_collapse =3D false; + bool must_collapse =3D false; int size_bias =3D 0; int avail_size; size_t ret =3D 0; @@ -1304,16 +1308,24 @@ static int mptcp_sendmsg_frag(struct sock *sk, stru= ct sock *ssk, * SSN association set here */ mpext =3D skb_ext_find(skb, SKB_EXT_MPTCP); - can_collapse =3D (info->size_goal - skb->len > 0) && - mptcp_skb_can_collapse_to(data_seq, skb, mpext); - if (!can_collapse) { + if (!mptcp_skb_can_collapse_to(data_seq, skb, mpext)) { TCP_SKB_CB(skb)->eor =3D 1; - } else { + goto alloc_skb; + } + + must_collapse =3D (info->size_goal - skb->len > 0) && + (skb_shinfo(skb)->nr_frags < sysctl_max_skb_frags); + if (must_collapse) { size_bias =3D skb->len; avail_size =3D info->size_goal - skb->len; } } =20 +alloc_skb: + if (!must_collapse && !ssk->sk_tx_skb_cache && + !mptcp_alloc_tx_skb(sk, ssk, info->data_lock_held)) + return 0; + /* Zero window and all data acked? Probe. */ avail_size =3D mptcp_check_allowed_size(msk, data_seq, avail_size); if (avail_size =3D=3D 0) { @@ -1343,7 +1355,6 @@ static int mptcp_sendmsg_frag(struct sock *sk, struct= sock *ssk, if (skb =3D=3D tail) { TCP_SKB_CB(tail)->tcp_flags &=3D ~TCPHDR_PSH; mpext->data_len +=3D ret; - WARN_ON_ONCE(!can_collapse); WARN_ON_ONCE(zero_window_probe); goto out; } @@ -1530,15 +1541,6 @@ void __mptcp_push_pending(struct sock *sk, unsigned = int flags) if (ssk !=3D prev_ssk) lock_sock(ssk); =20 - /* keep it simple and always provide a new skb for the - * subflow, even if we will not use it when collapsing - * on the pending one - */ - if (!mptcp_alloc_tx_skb(sk, ssk)) { - mptcp_push_release(sk, ssk, &info); - goto out; - } - ret =3D mptcp_sendmsg_frag(sk, ssk, dfrag, &info); if (ret <=3D 0) { mptcp_push_release(sk, ssk, &info); @@ -1571,7 +1573,9 @@ void __mptcp_push_pending(struct sock *sk, unsigned i= nt flags) static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk) { struct mptcp_sock *msk =3D mptcp_sk(sk); - struct mptcp_sendmsg_info info; + struct mptcp_sendmsg_info info =3D { + .data_lock_held =3D true, + }; struct mptcp_data_frag *dfrag; struct sock *xmit_ssk; int len, copied =3D 0; @@ -1597,13 +1601,6 @@ static void __mptcp_subflow_push_pending(struct sock= *sk, struct sock *ssk) goto out; } =20 - if (unlikely(mptcp_must_reclaim_memory(sk, ssk))) { - __mptcp_update_wmem(sk); - sk_mem_reclaim_partial(sk); - } - if (!__mptcp_alloc_tx_skb(sk, ssk, GFP_ATOMIC)) - goto out; - ret =3D mptcp_sendmsg_frag(sk, ssk, dfrag, &info); if (ret <=3D 0) goto out; @@ -2409,9 +2406,6 @@ static void __mptcp_retrans(struct sock *sk) info.sent =3D 0; info.limit =3D READ_ONCE(msk->csum_enabled) ? dfrag->data_len : dfrag->al= ready_sent; while (info.sent < info.limit) { - if (!mptcp_alloc_tx_skb(sk, ssk)) - break; - ret =3D mptcp_sendmsg_frag(sk, ssk, dfrag, &info); if (ret <=3D 0) break; --=20 2.33.0 From nobody Fri Mar 29 09:03:52 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:d02:0:0:0:0 with SMTP id q2csp393738jaj; Wed, 1 Sep 2021 10:16:05 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzBXeX6lzrc4DEqk9MWYeHM90w0Ndu0r/curkFg7OPJQ+0QwFkZqp86wxyXe5NGGT4F13nH X-Received: by 2002:a0c:da8d:: with SMTP id z13mr779485qvj.53.1630516565530; Wed, 01 Sep 2021 10:16:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1630516565; cv=none; d=google.com; s=arc-20160816; b=snVab8XzWEmufQmD09syVKIGoIyw1AKyaD8a15+l+lYIRwpTdF4cS8sWMHy0DqwI9k kcfwgeagTshZHMKSVPcbBVdkgmUPTwBmcEWYc86knDG515UUECGikpkMQmvCXmKBWDYi TXa4oq0w8nH4s0hP8+3zQSQqUlpYQzb72uXK0FaaJbbjmQL9+bQRVPYGiCKRs23I0pIb cZrwpN+tmwNb3Ucmb1YvuzHEIpRAti9BR4D9RmT/Ul6dAHgWcBvduBlj9QGydGezkSOj 0MIVnkIG1vtbG6/JquSfYeFQ08PnZKjSy/LhDPTIFPNfbS+fJ+cB7Fb6TvB5JSDpxqVQ OF2g== 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; bh=BHU/Hn0Yxt0gaV9TmeE76iukahnQfW7ZIOy2ipCjhL0=; b=QaYUn2SY/pr0wtjwc7cNbIDXPEweqs6E8TVBaCtq4nb7AyUVwCR8dRPi4gnIIEDCvC 3e04pSuRsTNreElqtnMfMczjfueDPUrePRVAFgWDIcVnCU5fLb53kHR4RV4gtuBEqAOY PCOYlAP8vhavLWOJh0vSfS2FjlazYKltKbskH2MCLwwMeOdYgj4w2KEyb/INuJghiyzj ob0D2aml5Vftefy6Q78pxYc9PAJ5F5keJZSIzOCfg6KBkgnj4MGVD3mcIksQjtd7IyYo 9dp/yGGj4Bb1N/ZqSk+h64MWhfIOLDgDPFIz6u2wox+/PqncUe8rY+o8tBCblsa2j524 XFGg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of mptcp+bounces-1801-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-1801-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.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 o4si25664qtl.347.2021.09.01.10.16.05 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 01 Sep 2021 10:16:05 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-1801-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; spf=pass (google.com: domain of mptcp+bounces-1801-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-1801-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=fail (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 ewr.edge.kernel.org (Postfix) with ESMTPS id 1F5D31C043E for ; Wed, 1 Sep 2021 17:16:05 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id C67B13FC4; Wed, 1 Sep 2021 17:16:03 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 A34D272 for ; Wed, 1 Sep 2021 17:16:02 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10094"; a="279823962" X-IronPort-AV: E=Sophos;i="5.84,370,1620716400"; d="scan'208";a="279823962" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Sep 2021 10:15:42 -0700 X-IronPort-AV: E=Sophos;i="5.84,370,1620716400"; d="scan'208";a="645852936" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.212.226.118]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Sep 2021 10:15:42 -0700 From: Mat Martineau To: netdev@vger.kernel.org Cc: Matthieu Baerts , davem@davemloft.net, kuba@kernel.org, mptcp@lists.linux.dev, pabeni@redhat.com, Mat Martineau Subject: [PATCH net v3 2/2] selftests: mptcp: clean tmp files in simult_flows Date: Wed, 1 Sep 2021 10:15:37 -0700 Message-Id: <20210901171537.121255-3-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210901171537.121255-1-mathew.j.martineau@linux.intel.com> References: <20210901171537.121255-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" From: Matthieu Baerts '$cin' and '$sin' variables are local to a function: they are then not available from the cleanup trap. Instead, we need to use '$large' and '$small' that are not local and defined just before setting the trap. Without this patch, running this script in a loop might cause a: write: No space left on device issue. Fixes: 1a418cb8e888 ("mptcp: simult flow self-tests") Acked-by: Paolo Abeni Signed-off-by: Matthieu Baerts Signed-off-by: Mat Martineau --- tools/testing/selftests/net/mptcp/simult_flows.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/simult_flows.sh b/tools/test= ing/selftests/net/mptcp/simult_flows.sh index fd63ebfe9a2b..910d8126af8f 100755 --- a/tools/testing/selftests/net/mptcp/simult_flows.sh +++ b/tools/testing/selftests/net/mptcp/simult_flows.sh @@ -22,8 +22,8 @@ usage() { =20 cleanup() { - rm -f "$cin" "$cout" - rm -f "$sin" "$sout" + rm -f "$cout" "$sout" + rm -f "$large" "$small" rm -f "$capout" =20 local netns --=20 2.33.0