From nobody Sun Feb 8 21:48:08 2026 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp4789710jap; Mon, 6 Dec 2021 09:35:02 -0800 (PST) X-Google-Smtp-Source: ABdhPJz9ZR5s8LWVf9vOC7jZIlptO51Xv31spgaSjPAlKJQOz+F2vSxaFrPQ1Y45Dj0ztAwjq9PZ X-Received: by 2002:a17:902:e852:b0:143:8152:26c7 with SMTP id t18-20020a170902e85200b00143815226c7mr45439658plg.75.1638812102347; Mon, 06 Dec 2021 09:35:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1638812102; cv=none; d=google.com; s=arc-20160816; b=lZxnpQGwjNT7dyE7cdk9r7/n4GAAR/OoBDzr239v1AfcWPEO1dawg4YBC9akk2XDTH rzxUR8iRNuVoCVVUcPKZxlfcd1KEAE2xPTNCZP3t1tOpdPW3zjUUWA7E51vhCxrzVMWX fR7vt5aP0KFeaZb0ISqt+Ydc+NniKJUrYDTn20WKLFjJkMJ09uLmmzj/ecvb5f+QWs6c ra4tS8t0tHeSRnjXo/m36gkDWZ6yqcCMobbtKyC695WvKQTW+km9RhUVUUTA83IILxYJ p0krQmMCAzdXnT/uzBOnM0GxruPVilWqyEdsoujVm2BM7Y6KsGyOjHZ7TANV7gC6jGKC 17vQ== 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=iqOgRXddF588gihmpOScUBIy3djtxZknyPx0u3WZ/oU=; b=CeU41CHnBFOnOTn80DMS06DutdpjKFDsphiFhVn0Pwy0QIIENrEsOZ95xqR4UzNtUR TlNla2nr7sWrw4e/QjjR13SLDG2DQWDR8GwhTWbtaCZPCIFCsLpN9PZR9rZ6bbegCuS1 Yfb/JtPIKTqAs7JBYZRmvwDNTicnZZV33RZrXFqqtAzVOUIaQkMup5rsclTgwH3R2uEk rmtdpLZanwNmg4dc0Ij4ilDLpOuUvhHx+fRh75WVAPxGzCL6kSURFLopBybfzIezoQbE 1ZjmIlKYj7ap+Hswhl3xqwnQ19UiEds0HYVUV/vf7WvAoJ3ZdwXgZQ3LlOCG7PTKNgGQ ReFQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=JelzMk3l; spf=pass (google.com: domain of mptcp+bounces-2659-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2659-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. [2604:1380:1000:8100::1]) by mx.google.com with ESMTPS id b3si18405469pgw.18.2021.12.06.09.35.02 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 06 Dec 2021 09:35:02 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2659-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) client-ip=2604:1380:1000:8100::1; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=JelzMk3l; spf=pass (google.com: domain of mptcp+bounces-2659-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2659-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 DDC643E0E63 for ; Mon, 6 Dec 2021 17:35:01 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E42592C9E; Mon, 6 Dec 2021 17:34:59 +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 B889D68 for ; Mon, 6 Dec 2021 17:34:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1638812097; 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=iqOgRXddF588gihmpOScUBIy3djtxZknyPx0u3WZ/oU=; b=JelzMk3lTZcb0pVaCwGllz+pn1qWTywWiSSu9eCZ2wTQkVF1w+s7Ovz6+/ytE2POWGiBQu umSlILrB+XB0XX0Rghj5nCyuCTh/HZ2xz5Iyz4L4FNJzoXiQyUC0PQbToK5TG2N1/QLH3b 9xdDpIgnJ3aFWEMS2yqBjyr0Wd/4EfY= 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-568-uQolgJYMOMCQAdEnPfC0dA-1; Mon, 06 Dec 2021 12:34:56 -0500 X-MC-Unique: uQolgJYMOMCQAdEnPfC0dA-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B62DF81EE62 for ; Mon, 6 Dec 2021 17:34:55 +0000 (UTC) Received: from gerbillo.fritz.box (unknown [10.39.194.111]) by smtp.corp.redhat.com (Postfix) with ESMTP id 245CD4ABAF for ; Mon, 6 Dec 2021 17:34:54 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next 2/2] mptcp: avoid atomic bit manipulation when possible Date: Mon, 6 Dec 2021 18:34:47 +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.13 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 the msk->flags bitmask carries both state for the mptcp_release_cb() - mostly touched under the mptcp data lock - and others state info touched even outside such lock scope. As a consequence, msk->flags is always manipulated with atomic operations. This change splits such bitmask in two separate fields, so that we use plain bit oper operations when touching the cb-related info. The MPTCP_PUSH_PENDING bit needs additional care, as it is the only CB related field currently accessed either under the mptcp data lock or the mptcp socket lock. Let's add another mask just for such bit's sake. Signed-off-by: Paolo Abeni --- net/mptcp/protocol.c | 46 +++++++++++++++++++++++--------------------- net/mptcp/protocol.h | 18 ++++++++++------- net/mptcp/subflow.c | 4 ++-- 3 files changed, 37 insertions(+), 31 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 38651c80b321..42c382d0eb01 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -763,7 +763,7 @@ static bool move_skbs_to_msk(struct mptcp_sock *msk, st= ruct sock *ssk) if (!sock_owned_by_user(sk)) __mptcp_error_report(sk); else - set_bit(MPTCP_ERROR_REPORT, &msk->flags); + __set_bit(MPTCP_ERROR_REPORT, &msk->cb_flags); } =20 /* If the moves have caught up with the DATA_FIN sequence number @@ -1529,9 +1529,8 @@ static void mptcp_update_post_push(struct mptcp_sock = *msk, =20 void mptcp_check_and_set_pending(struct sock *sk) { - if (mptcp_send_head(sk) && - !test_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->flags)) - set_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->flags); + if (mptcp_send_head(sk)) + mptcp_sk(sk)->push_pending |=3D MPTCP_PUSH_PENDING; } =20 void __mptcp_push_pending(struct sock *sk, unsigned int flags) @@ -2146,7 +2145,7 @@ static void mptcp_retransmit_timer(struct timer_list = *t) mptcp_schedule_work(sk); } else { /* delegate our work to tcp_release_cb() */ - set_bit(MPTCP_RETRANSMIT, &msk->flags); + __set_bit(MPTCP_RETRANSMIT, &msk->cb_flags); } bh_unlock_sock(sk); sock_put(sk); @@ -2859,7 +2858,9 @@ static int mptcp_disconnect(struct sock *sk, int flag= s) =20 mptcp_destroy_common(msk); msk->last_snd =3D NULL; - msk->flags =3D 0; + WRITE_ONCE(msk->flags, 0); + msk->cb_flags =3D 0; + msk->push_pending =3D 0; msk->recovery =3D false; msk->can_ack =3D false; msk->fully_established =3D false; @@ -3040,7 +3041,7 @@ void __mptcp_data_acked(struct sock *sk) if (!sock_owned_by_user(sk)) __mptcp_clean_una(sk); else - set_bit(MPTCP_CLEAN_UNA, &mptcp_sk(sk)->flags); + __set_bit(MPTCP_CLEAN_UNA, &mptcp_sk(sk)->cb_flags); =20 if (mptcp_pending_data_fin_ack(sk)) mptcp_schedule_work(sk); @@ -3059,22 +3060,22 @@ void __mptcp_check_push(struct sock *sk, struct soc= k *ssk) else if (xmit_ssk) mptcp_subflow_delegate(mptcp_subflow_ctx(xmit_ssk), MPTCP_DELEGATE_SEND= ); } else { - set_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->flags); + __set_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->cb_flags); } } =20 +#define MPTCP_FLAGS_PROCESS_CTX_NEED (MPTCP_PUSH_PENDING | \ + MPTCP_RETRANSMIT | \ + MPTCP_FLUSH_JOIN_LIST) + /* processes deferred events and flush wmem */ static void mptcp_release_cb(struct sock *sk) { + struct mptcp_sock *msk =3D mptcp_sk(sk); + for (;;) { - unsigned long flags =3D 0; - - if (test_and_clear_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->flags)) - flags |=3D BIT(MPTCP_PUSH_PENDING); - if (test_and_clear_bit(MPTCP_RETRANSMIT, &mptcp_sk(sk)->flags)) - flags |=3D BIT(MPTCP_RETRANSMIT); - if (test_and_clear_bit(MPTCP_FLUSH_JOIN_LIST, &mptcp_sk(sk)->flags)) - flags |=3D BIT(MPTCP_FLUSH_JOIN_LIST); + unsigned long flags =3D (msk->cb_flags & MPTCP_FLAGS_PROCESS_CTX_NEED) | + msk->push_pending; if (!flags) break; =20 @@ -3085,7 +3086,8 @@ static void mptcp_release_cb(struct sock *sk) * datapath acquires the msk socket spinlock while helding * the subflow socket lock */ - + msk->push_pending =3D 0; + msk->cb_flags &=3D ~flags; spin_unlock_bh(&sk->sk_lock.slock); if (flags & BIT(MPTCP_FLUSH_JOIN_LIST)) __mptcp_flush_join_list(sk); @@ -3101,11 +3103,11 @@ static void mptcp_release_cb(struct sock *sk) /* be sure to set the current sk state before tacking actions * depending on sk_state */ - if (test_and_clear_bit(MPTCP_CONNECTED, &mptcp_sk(sk)->flags)) + if (__test_and_clear_bit(MPTCP_CONNECTED, &msk->cb_flags)) __mptcp_set_connected(sk); - if (test_and_clear_bit(MPTCP_CLEAN_UNA, &mptcp_sk(sk)->flags)) + if (__test_and_clear_bit(MPTCP_CLEAN_UNA, &msk->cb_flags)) __mptcp_clean_una_wakeup(sk); - if (test_and_clear_bit(MPTCP_ERROR_REPORT, &mptcp_sk(sk)->flags)) + if (__test_and_clear_bit(MPTCP_ERROR_REPORT, &msk->cb_flags)) __mptcp_error_report(sk); =20 __mptcp_update_rmem(sk); @@ -3147,7 +3149,7 @@ void mptcp_subflow_process_delegated(struct sock *ssk) if (!sock_owned_by_user(sk)) __mptcp_subflow_push_pending(sk, ssk); else - set_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->flags); + __set_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->cb_flags); mptcp_data_unlock(sk); mptcp_subflow_delegated_done(subflow, MPTCP_DELEGATE_SEND); } @@ -3267,7 +3269,7 @@ bool mptcp_finish_join(struct sock *ssk) } else { sock_hold(ssk); list_add_tail(&subflow->node, &msk->join_list); - set_bit(MPTCP_FLUSH_JOIN_LIST, &msk->flags); + __set_bit(MPTCP_FLUSH_JOIN_LIST, &msk->cb_flags); } mptcp_data_unlock(parent); =20 diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 4a140aec68b3..fca045f1936f 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -110,18 +110,20 @@ /* MPTCP TCPRST flags */ #define MPTCP_RST_TRANSIENT BIT(0) =20 -/* MPTCP socket flags */ +/* MPTCP socket atomic flags */ #define MPTCP_NOSPACE 1 #define MPTCP_WORK_RTX 2 #define MPTCP_WORK_EOF 3 #define MPTCP_FALLBACK_DONE 4 #define MPTCP_WORK_CLOSE_SUBFLOW 5 -#define MPTCP_PUSH_PENDING 6 -#define MPTCP_CLEAN_UNA 7 -#define MPTCP_ERROR_REPORT 8 -#define MPTCP_RETRANSMIT 9 -#define MPTCP_FLUSH_JOIN_LIST 10 -#define MPTCP_CONNECTED 11 + +/* MPTCP socket release cb flags */ +#define MPTCP_PUSH_PENDING 1 +#define MPTCP_CLEAN_UNA 2 +#define MPTCP_ERROR_REPORT 3 +#define MPTCP_RETRANSMIT 4 +#define MPTCP_FLUSH_JOIN_LIST 5 +#define MPTCP_CONNECTED 6 =20 static inline bool before64(__u64 seq1, __u64 seq2) { @@ -243,6 +245,8 @@ struct mptcp_sock { u32 token; int rmem_released; unsigned long flags; + unsigned long cb_flags; + unsigned long push_pending; bool recovery; /* closing subflow write queue reinjected */ bool can_ack; bool fully_established; diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 536a322a6fd0..09225b57c7f6 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -388,7 +388,7 @@ static void mptcp_set_connected(struct sock *sk) if (!sock_owned_by_user(sk)) __mptcp_set_connected(sk); else - set_bit(MPTCP_CONNECTED, &mptcp_sk(sk)->flags); + __set_bit(MPTCP_CONNECTED, &mptcp_sk(sk)->cb_flags); mptcp_data_unlock(sk); } =20 @@ -1280,7 +1280,7 @@ static void subflow_error_report(struct sock *ssk) if (!sock_owned_by_user(sk)) __mptcp_error_report(sk); else - set_bit(MPTCP_ERROR_REPORT, &mptcp_sk(sk)->flags); + __set_bit(MPTCP_ERROR_REPORT, &mptcp_sk(sk)->cb_flags); mptcp_data_unlock(sk); } =20 --=20 2.33.1