From nobody Fri Apr 19 23:23:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp2168750jap; Fri, 19 Nov 2021 06:28:48 -0800 (PST) X-Google-Smtp-Source: ABdhPJyZahTPAAdx6qRGV9VMe7st572zZN97/zlcU5Iqad9qN9GT73/pCgs+9MwC7Y8bqPC8O7gL X-Received: by 2002:a17:90b:4d90:: with SMTP id oj16mr107209pjb.2.1637332127978; Fri, 19 Nov 2021 06:28:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1637332127; cv=none; d=google.com; s=arc-20160816; b=M6fhqHkW1TZoZimoShL/52E9H1JpLmenlgZK1gsPeAYBAbWhjEFM8b/pGtOg3xSsov YsNYplD66+SqjOfZRSd2PsrSE/daz9ZEPPZVo+ooOdHK/aEq5OOSTR0Nw54LVIBmP4zy aCVc/bTAYJKAKfYaCjqDOGO+fYEybNFdq2EvGUAnw83hZt6/51VLib1HrkDjeQ7KAF1g dFHGbDoMSiRQsAyaor+IaaonrCjbHR8j1t5pvlVXdwZQ4a6P/dFQDu5YZbL4y/w4jnq1 3B92lfCzFjdLq34m+e6XMnocJbotuE7sCu6FMb6eCAwyY4699UzuUcQIswFL2pHA/8h6 l92A== 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=iNIjVdNfrH1EBdflai/IJbkOIg9YwNJFT/WnhVIR6xY=; b=Y2EZ5OdqIX6PDVKzFpOBhrTj88oXuHJFfWxLKevxcermisOR5GP+Ik4jPaJ/5Me7Ur BBZ+CXFr3XbQzWtfl8kKvwOhvMlf4L9+JUD4n9X4wgDkNA1glxfobsfdJfV21iX94/x/ x5OUfHpN97K6oAnKA4bugTKMpxkT4A3yVUXYYh4H0ybKXSBDG29eFVpyIzNzKRApCh2w wxqPNjZneAmzxQBbq6ohWFK7og78eqLiOze35xpkQc/D8SPkHToDiJ5xOa4w268IU7c6 FOi7fEnIFat+LNc4vCt1WakHE28BWkT6yRjIAK3jPlYWMZwV96M71LgsQdYoBw7UwhUO oAlQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=DsiyH8G0; spf=pass (google.com: domain of mptcp+bounces-2477-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2477-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 i20si6813110pgm.286.2021.11.19.06.28.47 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 Nov 2021 06:28:47 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2477-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=DsiyH8G0; spf=pass (google.com: domain of mptcp+bounces-2477-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2477-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 9CD0A1C0A68 for ; Fri, 19 Nov 2021 14:28:47 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B768172; Fri, 19 Nov 2021 14:28:45 +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.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 099702C87 for ; Fri, 19 Nov 2021 14:28:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1637332123; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=iNIjVdNfrH1EBdflai/IJbkOIg9YwNJFT/WnhVIR6xY=; b=DsiyH8G09gGV1i7XBSVNeA5SyYW2gO2CGF/eEZdWmpcQCUugj9lB8tZPv2klJ7ro/3uABN ip1QpvqXUoy+Nimhkvv8A2asW5lYoREu5vM1GVu1eSjMqLqj43zFIIdd2sPbtm/5c91fet dBI2SIbwXjZcctTw+CmjfvcDy62j2v4= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-177-JRDxYi44Of6EnXS1JfR1Sg-1; Fri, 19 Nov 2021 09:28:39 -0500 X-MC-Unique: JRDxYi44Of6EnXS1JfR1Sg-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 736B518125C9; Fri, 19 Nov 2021 14:28:38 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.193.42]) by smtp.corp.redhat.com (Postfix) with ESMTP id 80A2660657; Fri, 19 Nov 2021 14:28:37 +0000 (UTC) From: Paolo Abeni To: netdev@vger.kernel.org Cc: mptcp@lists.linux.dev, Eric Dumazet Subject: [PATCH net 1/2] mptcp: fix delack timer Date: Fri, 19 Nov 2021 15:27:54 +0100 Message-Id: <3168be19fb4e9c79ff5fe1af1b0b700c39770c43.1637331462.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 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Content-Type: text/plain; charset="utf-8" From: Eric Dumazet To compute the rtx timeout schedule_3rdack_retransmission() does multiple things in the wrong way: srtt_us is measured in usec/8 and the timeout itself is an absolute value. Fixes: ec3edaa7ca6ce02f ("mptcp: Add handling of outgoing MP_JOIN requests") Acked-by: Paolo Abeni Reviewed-by: Mat Martineau @linux.intel.com> Signed-off-by: Eric Dumazet Acked-by: David S. Miller --- net/mptcp/options.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/net/mptcp/options.c b/net/mptcp/options.c index 7c3420afb1a0..2e9b73eeeeb5 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -434,9 +434,10 @@ static void schedule_3rdack_retransmission(struct sock= *sk) =20 /* reschedule with a timeout above RTT, as we must look only for drop */ if (tp->srtt_us) - timeout =3D tp->srtt_us << 1; + timeout =3D usecs_to_jiffies(tp->srtt_us >> (3 - 1)); else timeout =3D TCP_TIMEOUT_INIT; + timeout +=3D jiffies; =20 WARN_ON_ONCE(icsk->icsk_ack.pending & ICSK_ACK_TIMER); icsk->icsk_ack.pending |=3D ICSK_ACK_SCHED | ICSK_ACK_TIMER; --=20 2.33.1 From nobody Fri Apr 19 23:23:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp2168740jap; Fri, 19 Nov 2021 06:28:47 -0800 (PST) X-Google-Smtp-Source: ABdhPJxEXK08XNEO33zcdZHEDu1U2VLI3M0a3r86Rlf2FzGUnS3mzklxHHdze/QvlGhwEniKCEy5 X-Received: by 2002:a05:6a00:2405:b0:44c:1ec3:8dbe with SMTP id z5-20020a056a00240500b0044c1ec38dbemr23119515pfh.33.1637332127423; Fri, 19 Nov 2021 06:28:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1637332127; cv=none; d=google.com; s=arc-20160816; b=dyk5qL6nE9uP24oF/HBqhmd7vEMJ78A68tqHUdz73jBAtEA3PjZwHpM33OSAZk1wF1 2Ln8R/goqK6SvbuDdc536B54FTi16WdaJ8cJJGV6vfB/3tA5e58I0IqELGQaDZi7jVm4 JMdV/kL0mbspzfWGri7dcrv3hV07vJyvxRxNWNZuPIY5NykTyMaVCYJdJj63b+Z0rTp9 SwHo+zfQyioopN+2vH6haRcpAw0cjOesLpBWz+dsFolD9Kt3vC54UJm4ytNZn52OUIuA 6NDbdfOPHu4Z274inHiViNHhU+XK623moMO6n8RGo1R0TcfA/NZ4UoV8dNgCTAZwDq41 CYsA== 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=INrXqMb0xiO+aKaGY2oTx0ddF5jN369v/Mx6mmDiDI0=; b=uIYbp8s8QuG9nJGmpz4Ax52Ni4P2dCdTm9bRxKPdEuUrdWWB6WbIDn7FOFCmoh4VWq szePr45b7n2VLVkoImNuftMd+WWn3lnNwI4VnnCwxGfaie9/c7wzN6YerVRRRMytX+ex vK/l3A0XhvkeWzUYZfwuijr90jRQ3D79Zcky6WM9RWaGtFdZfOVFC7PmnZCLtGwOWoJN SAl0bXUKSY/2QwQ+V56pNrxo9kqIqIkzaspXQ7H4tWCJY9j9bZ5O3Jdb6dDo89yLLsoB YMdPAjPSpyqjwHuS0WKc3smYSG5cVA1qko/th1vA4h8M6rBM47FOPE5IUaw7CHQx4a/7 QnhQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b="YvC5/AjL"; spf=pass (google.com: domain of mptcp+bounces-2476-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2476-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 ck7si9002450pjb.1.2021.11.19.06.28.47 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 Nov 2021 06:28:47 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2476-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="YvC5/AjL"; spf=pass (google.com: domain of mptcp+bounces-2476-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2476-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 82DED1C0AF3 for ; Fri, 19 Nov 2021 14:28:46 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id ED27D2C83; Fri, 19 Nov 2021 14:28:44 +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.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 8920772 for ; Fri, 19 Nov 2021 14:28:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1637332122; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=INrXqMb0xiO+aKaGY2oTx0ddF5jN369v/Mx6mmDiDI0=; b=YvC5/AjL83UbKSy3UyqaifPs4NAc0M+fhDreNhCpzFp6xfXkBgGQeKvoZ55LDm8W/73GXk Zp8CT9v9yul3hgsLSNjQQPsb3yV78PDiUwxbtrqNcPC1yIRuw1/trHETNV+4L91AttTo2e ykrEmqIPna+QmQfKX5k4LydsWalpxF4= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-391-9Inxx5nVMkagwHz25Pe05w-1; Fri, 19 Nov 2021 09:28:41 -0500 X-MC-Unique: 9Inxx5nVMkagwHz25Pe05w-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id F3661100C661; Fri, 19 Nov 2021 14:28:39 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.193.42]) by smtp.corp.redhat.com (Postfix) with ESMTP id CEA18604CC; Fri, 19 Nov 2021 14:28:38 +0000 (UTC) From: Paolo Abeni To: netdev@vger.kernel.org Cc: mptcp@lists.linux.dev, Eric Dumazet Subject: [PATCH net 2/2] mptcp: use delegate action to schedule 3rd ack retrans Date: Fri, 19 Nov 2021 15:27:55 +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 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Content-Type: text/plain; charset="utf-8" Scheduling a delack in mptcp_established_options_mp() is not a good idea: such function is called by tcp_send_ack() and the pending delayed ack will be cleared shortly after by the tcp_event_ack_sent() call in __tcp_transmit_skb(). Instead use the mptcp delegated action infrastructure to schedule the delayed ack after the current bh processing completes. Additionally moves the schedule_3rdack_retransmission() helper into protocol.c to avoid making it visible in a different compilation unit. Fixes: ec3edaa7ca6ce02f ("mptcp: Add handling of outgoing MP_JOIN requests") Reviewed-by: Mat Martineau @linux.intel.com> Signed-off-by: Paolo Abeni Acked-by: David S. Miller --- net/mptcp/options.c | 33 ++++++++-------------------- net/mptcp/protocol.c | 51 ++++++++++++++++++++++++++++++++++++-------- net/mptcp/protocol.h | 17 ++++++++------- 3 files changed, 60 insertions(+), 41 deletions(-) diff --git a/net/mptcp/options.c b/net/mptcp/options.c index 2e9b73eeeeb5..fe98e4f475ba 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -422,29 +422,6 @@ bool mptcp_syn_options(struct sock *sk, const struct s= k_buff *skb, return false; } =20 -/* MP_JOIN client subflow must wait for 4th ack before sending any data: - * TCP can't schedule delack timer before the subflow is fully established. - * MPTCP uses the delack timer to do 3rd ack retransmissions - */ -static void schedule_3rdack_retransmission(struct sock *sk) -{ - struct inet_connection_sock *icsk =3D inet_csk(sk); - struct tcp_sock *tp =3D tcp_sk(sk); - unsigned long timeout; - - /* reschedule with a timeout above RTT, as we must look only for drop */ - if (tp->srtt_us) - timeout =3D usecs_to_jiffies(tp->srtt_us >> (3 - 1)); - else - timeout =3D TCP_TIMEOUT_INIT; - timeout +=3D jiffies; - - WARN_ON_ONCE(icsk->icsk_ack.pending & ICSK_ACK_TIMER); - icsk->icsk_ack.pending |=3D ICSK_ACK_SCHED | ICSK_ACK_TIMER; - icsk->icsk_ack.timeout =3D timeout; - sk_reset_timer(sk, &icsk->icsk_delack_timer, timeout); -} - static void clear_3rdack_retransmission(struct sock *sk) { struct inet_connection_sock *icsk =3D inet_csk(sk); @@ -527,7 +504,15 @@ static bool mptcp_established_options_mp(struct sock *= sk, struct sk_buff *skb, *size =3D TCPOLEN_MPTCP_MPJ_ACK; pr_debug("subflow=3D%p", subflow); =20 - schedule_3rdack_retransmission(sk); + /* we can use the full delegate action helper only from BH context + * If we are in process context - sk is flushing the backlog at + * socket lock release time - just set the appropriate flag, will + * be handled by the release callback + */ + if (sock_owned_by_user(sk)) + set_bit(MPTCP_DELEGATE_ACK, &subflow->delegated_status); + else + mptcp_subflow_delegate(subflow, MPTCP_DELEGATE_ACK); return true; } return false; diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index b7e32e316738..c82a76d2d0bf 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1596,7 +1596,8 @@ static void __mptcp_subflow_push_pending(struct sock = *sk, struct sock *ssk) if (!xmit_ssk) goto out; if (xmit_ssk !=3D ssk) { - mptcp_subflow_delegate(mptcp_subflow_ctx(xmit_ssk)); + mptcp_subflow_delegate(mptcp_subflow_ctx(xmit_ssk), + MPTCP_DELEGATE_SEND); goto out; } =20 @@ -2943,7 +2944,7 @@ void __mptcp_check_push(struct sock *sk, struct sock = *ssk) if (xmit_ssk =3D=3D ssk) __mptcp_subflow_push_pending(sk, ssk); else if (xmit_ssk) - mptcp_subflow_delegate(mptcp_subflow_ctx(xmit_ssk)); + mptcp_subflow_delegate(mptcp_subflow_ctx(xmit_ssk), MPTCP_DELEGATE_SEND= ); } else { set_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->flags); } @@ -2993,18 +2994,50 @@ static void mptcp_release_cb(struct sock *sk) __mptcp_update_rmem(sk); } =20 +/* MP_JOIN client subflow must wait for 4th ack before sending any data: + * TCP can't schedule delack timer before the subflow is fully established. + * MPTCP uses the delack timer to do 3rd ack retransmissions + */ +static void schedule_3rdack_retransmission(struct sock *ssk) +{ + struct inet_connection_sock *icsk =3D inet_csk(ssk); + struct tcp_sock *tp =3D tcp_sk(ssk); + unsigned long timeout; + + if (mptcp_subflow_ctx(ssk)->fully_established) + return; + + /* reschedule with a timeout above RTT, as we must look only for drop */ + if (tp->srtt_us) + timeout =3D usecs_to_jiffies(tp->srtt_us >> (3 - 1)); + else + timeout =3D TCP_TIMEOUT_INIT; + timeout +=3D jiffies; + + WARN_ON_ONCE(icsk->icsk_ack.pending & ICSK_ACK_TIMER); + icsk->icsk_ack.pending |=3D ICSK_ACK_SCHED | ICSK_ACK_TIMER; + icsk->icsk_ack.timeout =3D timeout; + sk_reset_timer(ssk, &icsk->icsk_delack_timer, timeout); +} + void mptcp_subflow_process_delegated(struct sock *ssk) { struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(ssk); struct sock *sk =3D subflow->conn; =20 - mptcp_data_lock(sk); - if (!sock_owned_by_user(sk)) - __mptcp_subflow_push_pending(sk, ssk); - else - set_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->flags); - mptcp_data_unlock(sk); - mptcp_subflow_delegated_done(subflow); + if (test_bit(MPTCP_DELEGATE_SEND, &subflow->delegated_status)) { + mptcp_data_lock(sk); + if (!sock_owned_by_user(sk)) + __mptcp_subflow_push_pending(sk, ssk); + else + set_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->flags); + mptcp_data_unlock(sk); + mptcp_subflow_delegated_done(subflow, MPTCP_DELEGATE_SEND); + } + if (test_bit(MPTCP_DELEGATE_ACK, &subflow->delegated_status)) { + schedule_3rdack_retransmission(ssk); + mptcp_subflow_delegated_done(subflow, MPTCP_DELEGATE_ACK); + } } =20 static int mptcp_hash(struct sock *sk) diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 67a61ac48b20..d87cc040352e 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -387,6 +387,7 @@ struct mptcp_delegated_action { DECLARE_PER_CPU(struct mptcp_delegated_action, mptcp_delegated_actions); =20 #define MPTCP_DELEGATE_SEND 0 +#define MPTCP_DELEGATE_ACK 1 =20 /* MPTCP subflow context */ struct mptcp_subflow_context { @@ -492,23 +493,23 @@ static inline void mptcp_add_pending_subflow(struct m= ptcp_sock *msk, =20 void mptcp_subflow_process_delegated(struct sock *ssk); =20 -static inline void mptcp_subflow_delegate(struct mptcp_subflow_context *su= bflow) +static inline void mptcp_subflow_delegate(struct mptcp_subflow_context *su= bflow, int action) { struct mptcp_delegated_action *delegated; bool schedule; =20 + /* the caller held the subflow bh socket lock */ + lockdep_assert_in_softirq(); + /* The implied barrier pairs with mptcp_subflow_delegated_done(), and * ensures the below list check sees list updates done prior to status * bit changes */ - if (!test_and_set_bit(MPTCP_DELEGATE_SEND, &subflow->delegated_status)) { + if (!test_and_set_bit(action, &subflow->delegated_status)) { /* still on delegated list from previous scheduling */ if (!list_empty(&subflow->delegated_node)) return; =20 - /* the caller held the subflow bh socket lock */ - lockdep_assert_in_softirq(); - delegated =3D this_cpu_ptr(&mptcp_delegated_actions); schedule =3D list_empty(&delegated->head); list_add_tail(&subflow->delegated_node, &delegated->head); @@ -533,16 +534,16 @@ mptcp_subflow_delegated_next(struct mptcp_delegated_a= ction *delegated) =20 static inline bool mptcp_subflow_has_delegated_action(const struct mptcp_s= ubflow_context *subflow) { - return test_bit(MPTCP_DELEGATE_SEND, &subflow->delegated_status); + return !!READ_ONCE(subflow->delegated_status); } =20 -static inline void mptcp_subflow_delegated_done(struct mptcp_subflow_conte= xt *subflow) +static inline void mptcp_subflow_delegated_done(struct mptcp_subflow_conte= xt *subflow, int action) { /* pairs with mptcp_subflow_delegate, ensures delegate_node is updated be= fore * touching the status bit */ smp_wmb(); - clear_bit(MPTCP_DELEGATE_SEND, &subflow->delegated_status); + clear_bit(action, &subflow->delegated_status); } =20 int mptcp_is_enabled(const struct net *net); --=20 2.33.1