From nobody Thu May 2 14:55:21 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp7382275jap; Tue, 14 Dec 2021 08:59:29 -0800 (PST) X-Google-Smtp-Source: ABdhPJzosSWI8KrLY+hJ3aT2/E1mS0W7SWvAbnnWyQ8uP3mUjgLMd1bmQdD3S33PlfbTtKeF3Ckr X-Received: by 2002:a05:622a:1055:: with SMTP id f21mr7109154qte.421.1639501169303; Tue, 14 Dec 2021 08:59:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639501169; cv=none; d=google.com; s=arc-20160816; b=XixNqUlL0ZNMS3aAY2h8uVoR4Cv49UHfP8yZBL9VPAQhv0qKMmH7Zu1WaCu35cgXxr wtmn6rtCKzvpERNC7LKLGLStv2P4TVIN0qhvphi+S0JWgCs3dW5dgfLMUr86fM61xfs6 pM1zyfmcXkj0g6U5POWBIF4f6YaExXr/267HzIRlvkT1SI2vjmN+rx8jJqPCUA6pYsJO 1Xx8EKXmrQ3CH/x9DtMCIJiN7BwGrw2JPNbCx832MhGkPWI5SjgSplhzhjw1N12GUF/L KcM3KftCrmY2rQETV7b4FphtSL6ylZqkiuvWuuvAJ0JVID5W8Ww5rsszUllcOpx9triO f0zQ== 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=aMR1hYkvoUwefVKooQD8Jdkgq7b6DI69kqlt/t+9Rd8=; b=sNiJGHUEVpaNT/L1xb22TjRX0qnAGfBHbm0wLqBMaTi7vbzrMiKDDAuhKeRcq+gwOt mr56BMObxlbOCIIopW4n/Zvi9RJVQUQaArPyY5jedbJzzsYVfzfv3X6xMZ4cEK7QWn8G QDqV9LRFIIrZmhWPi108WbOUqzfcQl/3q8MrhbCg/d0VyAfXBcSAPNABYXIauqLvN/01 dUZIgfujv6d4hGHGjNryBGdjjf5uHOcZbnIuuqkCK1gaXbmEoEmK7eNjucRkVBJB3pVS zb709iNtAll8DXQB9/PwNGRDGuGZF4TN+tpYqu6fqCE9z7M2Tq3QvpMc0yFbCakBozQn RIVA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=FHHlFKrV; spf=pass (google.com: domain of mptcp+bounces-2748-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2748-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 bp44si380802qkb.57.2021.12.14.08.59.29 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 14 Dec 2021 08:59:29 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2748-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=FHHlFKrV; spf=pass (google.com: domain of mptcp+bounces-2748-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2748-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 02EDC1C0B42 for ; Tue, 14 Dec 2021 16:59:29 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 959722CB2; Tue, 14 Dec 2021 16:59:26 +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 ADB7468 for ; Tue, 14 Dec 2021 16:59:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1639501162; 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=aMR1hYkvoUwefVKooQD8Jdkgq7b6DI69kqlt/t+9Rd8=; b=FHHlFKrVdcRJHeO3EPzdhg5Gk10FuUWt6rba86NcftiTlkf15HzracDUiNoZfi4m9uDjGG RTr1ZSUsdLdDwhHiD3KAg3LTX7hRWtFBzJJtMI40r4bvRomnckqeBjzLWJeTkZxAtVDyPy BjyXob/B03ToHJwciGwE0KkSv7Cac7k= 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-76-lgZzfA32Ms6pKbAY7OGMKQ-1; Tue, 14 Dec 2021 11:59:21 -0500 X-MC-Unique: lgZzfA32Ms6pKbAY7OGMKQ-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id AA37A760C5 for ; Tue, 14 Dec 2021 16:59:20 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id DC92C106A7AE for ; Tue, 14 Dec 2021 16:59:19 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH v6 mptcp-next 1/7] mptcp: fix per socket endpoint accounting. Date: Tue, 14 Dec 2021 17:58:51 +0100 Message-Id: <1d4b99ad2e25c5b37aa5a57314b154d41a4c401c.1639500873.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 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 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" Since full-mesh endpoint support, the reception of a single ADD_ADDR option can cause multiple subflows creation. When such option is accepted we increment 'add_addr_accepted' by one. When we received a paired RM_ADDR option, we deleted all the relevant subflows, decrementing 'add_addr_accepted' by one for each of them. We have a similar issue for 'local_addr_used' Fix them moving the pm endpoint accounting outside the subflow traversal. Fixes: 1a0d6136c5f0 ("mptcp: local addresses fullmesh") Signed-off-by: Paolo Abeni Reviewed-by: Mat Martineau --- net/mptcp/pm_netlink.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 3186d33b5208..d18b13e3e74c 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -710,6 +710,8 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp= _sock *msk, return; =20 for (i =3D 0; i < rm_list->nr; i++) { + bool removed =3D false; + list_for_each_entry_safe(subflow, tmp, &msk->conn_list, node) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); int how =3D RCV_SHUTDOWN | SEND_SHUTDOWN; @@ -729,15 +731,19 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mpt= cp_sock *msk, mptcp_close_ssk(sk, ssk, subflow); spin_lock_bh(&msk->pm.lock); =20 - if (rm_type =3D=3D MPTCP_MIB_RMADDR) { - msk->pm.add_addr_accepted--; - WRITE_ONCE(msk->pm.accept_addr, true); - } else if (rm_type =3D=3D MPTCP_MIB_RMSUBFLOW) { - msk->pm.local_addr_used--; - } + removed =3D true; msk->pm.subflows--; __MPTCP_INC_STATS(sock_net(sk), rm_type); } + if (!removed) + continue; + + if (rm_type =3D=3D MPTCP_MIB_RMADDR) { + msk->pm.add_addr_accepted--; + WRITE_ONCE(msk->pm.accept_addr, true); + } else if (rm_type =3D=3D MPTCP_MIB_RMSUBFLOW) { + msk->pm.local_addr_used--; + } } } =20 --=20 2.33.1 From nobody Thu May 2 14:55:21 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp7382238jap; Tue, 14 Dec 2021 08:59:28 -0800 (PST) X-Google-Smtp-Source: ABdhPJy17e1e+OnNLGU8R9SXMF9uYZhJvaQlzScD3TCBR4L+m1XlLlSWXXmIgQMiRM7mpPmMpXIZ X-Received: by 2002:ac8:5e89:: with SMTP id r9mr7173225qtx.70.1639501168072; Tue, 14 Dec 2021 08:59:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639501168; cv=none; d=google.com; s=arc-20160816; b=VBFRaFK+pd6mBJlRkEoq6+bHrcEkyPFJHUc6VCZ/qaa8slWbHgLwEoZcftAzxqbope uSnWZ7U5lJurvjDqUCccaYT83yoe0bGvydmzQB7uKNBSgqN1v4YXT+lekVOFrSKIgSct TBH0G75d7CEdtWB8ejMOH3yL8I5hffkyQi6gHrXe5AkfWXHfMTRMOmhdvyeJs97FK3iU 3O9pOaYIwrugqzgol7Ep0T1VAS4+zy7eVj1hdoPUOm0MNaiZlu0UzaUW6401aw1NtN2P y9PgzPI0UqchZNHS06USCDAT3j5qrXIva4/KUm4IAIJt3UzNv4tQnbJnyDoOKvW8rRLG Y5mA== 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=R1mY7UFdQVRSDeafvZWZ10zEPnX1i9Jjr2qNMeJH7g8=; b=vVkCCqsDAfOIQH6ImDuJJxkTx/Rgsu2rIjS7NeF+WlgIX22NeP1R9P0KSxQRybkpyn BJQDj9Gjj26CoWW1gWsrF0y1gZI5HlWEr8hrjA3iOld3VWkXBhj3RjWZBq4lddRp0xOt zfee0DyTUuI4GtRnBrMXrQj5k/viUo+uMMqzB5Pn+3aq8iqt07REgbA8eI0k/4TllBgW 9ng+3bS8XSYS5kuR9/D4XvGgFYTcBJ3tL6DlqKC0FMdTTpb57C7d2fTOlBnl8h9VM69p em9wTqf5XiWWvbC/F5+n3YH7/b9Bo8Vox5grhP1pZ25TjF/0T0ixiFgLi5A2yNYHuATj Cw6g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=gTCbeKHu; spf=pass (google.com: domain of mptcp+bounces-2747-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2747-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 n6si375719qkp.201.2021.12.14.08.59.27 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 14 Dec 2021 08:59:28 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2747-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=gTCbeKHu; spf=pass (google.com: domain of mptcp+bounces-2747-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2747-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 DC3851C08AB for ; Tue, 14 Dec 2021 16:59:27 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 79C362CAA; Tue, 14 Dec 2021 16:59:26 +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 D58812CB2 for ; Tue, 14 Dec 2021 16:59:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1639501164; 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=R1mY7UFdQVRSDeafvZWZ10zEPnX1i9Jjr2qNMeJH7g8=; b=gTCbeKHuU9XofQ833SJ4ySoX2FWHGwGs8Is8jV22dVkQAiUjPdXwfQkKLIwwR1SiWGg0Lv 48tWAT3YcKVdtqVTYjdpnZ3RlDBJdtqXDc+69E6p+hCMZJ8pisrMJqdcupIUR9pMalQLOI LAQ6pm0D2xbC9LKeZEevabjqFZ0PXIc= 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-524-oxJjpXLgOXuDQ4g6ZvsdSQ-1; Tue, 14 Dec 2021 11:59:22 -0500 X-MC-Unique: oxJjpXLgOXuDQ4g6ZvsdSQ-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D0280801AAB for ; Tue, 14 Dec 2021 16:59:21 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2706D106A7AE for ; Tue, 14 Dec 2021 16:59:20 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH v6 mptcp-next 2/7] mptcp: clean-up MPJ option writing. Date: Tue, 14 Dec 2021 17:58:52 +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.84 on 10.5.11.22 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" Check for all MPJ variant at once, this reduces the number of conditionals traversed on average and will simplify the next patch. No functional change intended. Signed-off-by: Paolo Abeni Reviewed-by: Mat Martineau --- net/mptcp/options.c | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/net/mptcp/options.c b/net/mptcp/options.c index 8a1020e4285c..7a6a39b71633 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -1381,27 +1381,29 @@ void mptcp_write_options(__be32 *ptr, const struct = tcp_sock *tp, =20 /* MPC is additionally mutually exclusive with MP_PRIO */ goto mp_capable_done; - } else if (OPTION_MPTCP_MPJ_SYN & opts->suboptions) { - *ptr++ =3D mptcp_option(MPTCPOPT_MP_JOIN, - TCPOLEN_MPTCP_MPJ_SYN, - opts->backup, opts->join_id); - put_unaligned_be32(opts->token, ptr); - ptr +=3D 1; - put_unaligned_be32(opts->nonce, ptr); - ptr +=3D 1; - } else if (OPTION_MPTCP_MPJ_SYNACK & opts->suboptions) { - *ptr++ =3D mptcp_option(MPTCPOPT_MP_JOIN, - TCPOLEN_MPTCP_MPJ_SYNACK, - opts->backup, opts->join_id); - put_unaligned_be64(opts->thmac, ptr); - ptr +=3D 2; - put_unaligned_be32(opts->nonce, ptr); - ptr +=3D 1; - } else if (OPTION_MPTCP_MPJ_ACK & opts->suboptions) { - *ptr++ =3D mptcp_option(MPTCPOPT_MP_JOIN, - TCPOLEN_MPTCP_MPJ_ACK, 0, 0); - memcpy(ptr, opts->hmac, MPTCPOPT_HMAC_LEN); - ptr +=3D 5; + } else if (OPTIONS_MPTCP_MPJ & opts->suboptions) { + if (OPTION_MPTCP_MPJ_SYN & opts->suboptions) { + *ptr++ =3D mptcp_option(MPTCPOPT_MP_JOIN, + TCPOLEN_MPTCP_MPJ_SYN, + opts->backup, opts->join_id); + put_unaligned_be32(opts->token, ptr); + ptr +=3D 1; + put_unaligned_be32(opts->nonce, ptr); + ptr +=3D 1; + } else if (OPTION_MPTCP_MPJ_SYNACK & opts->suboptions) { + *ptr++ =3D mptcp_option(MPTCPOPT_MP_JOIN, + TCPOLEN_MPTCP_MPJ_SYNACK, + opts->backup, opts->join_id); + put_unaligned_be64(opts->thmac, ptr); + ptr +=3D 2; + put_unaligned_be32(opts->nonce, ptr); + ptr +=3D 1; + } else { + *ptr++ =3D mptcp_option(MPTCPOPT_MP_JOIN, + TCPOLEN_MPTCP_MPJ_ACK, 0, 0); + memcpy(ptr, opts->hmac, MPTCPOPT_HMAC_LEN); + ptr +=3D 5; + } } else if (OPTION_MPTCP_ADD_ADDR & opts->suboptions) { u8 len =3D TCPOLEN_MPTCP_ADD_ADDR_BASE; u8 echo =3D MPTCP_ADDR_ECHO; --=20 2.33.1 From nobody Thu May 2 14:55:21 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp7382309jap; Tue, 14 Dec 2021 08:59:30 -0800 (PST) X-Google-Smtp-Source: ABdhPJy1sVlv1hxPmuyxtPxhc74P9FXxSQyciyxnyblDBFcvULbTHsI+rR3vY8YoU8OR5rr+zt37 X-Received: by 2002:a05:620a:414a:: with SMTP id k10mr5172125qko.489.1639501170544; Tue, 14 Dec 2021 08:59:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639501170; cv=none; d=google.com; s=arc-20160816; b=yxfq69yDzZ1iSK+/lnCpwpoKz0JQkinc15G8sDls9+Ed7oD0zQYAM54LBQSkFlq/9Q lx/jfPilBLQpKUCT9tj9Ur0fG1EVKfYhXYY90Ksg0ATcKgAdoKQEakUxIvpGFivavN4g bQKa4U2qT2bfmzL1+9wKj7A1hUrfAO1jBjq/YSjgu8AWreWypx89UJlrVLe0akUW/OMH jJKSU+RdaTJsWuPFHNPAsVh6Q8sThLEotelTGeuwWaUidANLjftO+QkBp7V53qOFx594 8O8W1hyCWPVWAYkVJq1ZhC1uYiPM1VdRZ7lQc0hOcJ6+OKYPOu+hxj9p2Vdg6DvpzRoU HMag== 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=Ohl5zYsWNwYXRSsrQGQXr/HuIfGyhAAwQj0p4h6+CCo=; b=MId/SHLwXodg4eWFkMpJ1ked7vTXxOPOPwF9mSZ5+LDGrYys8xJtmGTh2EKPwxsMUV w3nVTc50TFL+U+HYwyZFGuyXCzsHUziZo96t3wFTp2v7x1bJXeshFMqn4Yvgmts7uNyy Elcfdb55AunduVOGGQbuXB36amv99n8MDo3cOGkbaSp0O6r/nYtGEWH67QzE+NM9p9+j q+77jUaZqbeXCy8iSUFJrUkJXqmmYj0KoUg1jtKKRvGyK6b4AOORM+zmyyTx1xsH16p+ Hpqfbg9UvohCseDtWCukQFlxIlA5DwdHl8c9yTZ4SNSTDQduXv8DgfCyI2ZEfKHbbme7 Lpng== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=AuJxmHs+; spf=pass (google.com: domain of mptcp+bounces-2749-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2749-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 g10si284411qkk.661.2021.12.14.08.59.30 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 14 Dec 2021 08:59:30 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2749-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=AuJxmHs+; spf=pass (google.com: domain of mptcp+bounces-2749-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2749-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 2E7291C09F3 for ; Tue, 14 Dec 2021 16:59:30 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 11F862CAA; Tue, 14 Dec 2021 16:59:29 +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 2C8CD68 for ; Tue, 14 Dec 2021 16:59:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1639501166; 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=Ohl5zYsWNwYXRSsrQGQXr/HuIfGyhAAwQj0p4h6+CCo=; b=AuJxmHs++85aVZDJvQqPsCCSVbeQ8snvSdu7wxA4OhmUY8wp5aqVLOdzJfzV5xfkspCDOG ta5SSv93aNnykV8wIZjYkA9vfp9FfLEMqmwCri2DFB/nUgXPnV5e/mjE/gY/QGlomXepRv Sa1vI24ymVXeHJVXFBlRGuHm7ar9Ol0= 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-207-CcwWFxEtNWCid3yUGwclUQ-1; Tue, 14 Dec 2021 11:59:24 -0500 X-MC-Unique: CcwWFxEtNWCid3yUGwclUQ-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 1AD0B10B7440 for ; Tue, 14 Dec 2021 16:59:23 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5042A1059112 for ; Tue, 14 Dec 2021 16:59:22 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH v6 mptcp-next 3/7] mptcp: keep track of local endpoint still available for each msk Date: Tue, 14 Dec 2021 17:58:53 +0100 Message-Id: <5eaf8fbe74237b5decd5c1b7d87856b6a40e0a46.1639500873.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 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 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" Include into the path manager status a bitmap tracking the list of local endpoints still available - not yet used - for the relavant mptcp socket. Keep such map updated at endpoint creation/deleteion time, so that we can easily skip already used endpoint at local address selection time. The endpoint used by the initial subflow is lazyly accounted at subflow creation time: the usage bitmap is be up2date before endpoint selection and we avoid such unneeded task in some relevant scenarions - e.g. busy servers accepting incoming subflows but not creating any additional ones nor annuncing additional addresses. Overall this allows for fair local endpoints usage in case of subflow failure. As a side effect, this patch also enforces that each endpoint is used at most once for each mptcp connection. Signed-off-by: Paolo Abeni Reviewed-by: Mat Martineau --- v4 -> v5: - track MPC subflow, too - update self-tests accordingly v3 -> v4: - track the available (not yet used) id instead of the used ones - track both - cleanup duplication with id_bitmap --- net/mptcp/pm.c | 1 + net/mptcp/pm_netlink.c | 116 +++++++++++------- net/mptcp/protocol.c | 3 +- net/mptcp/protocol.h | 11 +- .../testing/selftests/net/mptcp/mptcp_join.sh | 5 +- 5 files changed, 86 insertions(+), 50 deletions(-) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 761995a34124..d6d22f18c418 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -376,6 +376,7 @@ void mptcp_pm_data_reset(struct mptcp_sock *msk) WRITE_ONCE(msk->pm.accept_subflow, false); WRITE_ONCE(msk->pm.remote_deny_join_id0, false); msk->pm.status =3D 0; + bitmap_fill(msk->pm.id_avail_bitmap, MAX_ADDR_ID + 1); =20 mptcp_pm_nl_data_init(msk); } diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index d18b13e3e74c..1be7f92e9fc8 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -38,9 +38,6 @@ struct mptcp_pm_add_entry { u8 retrans_times; }; =20 -#define MAX_ADDR_ID 255 -#define BITMAP_SZ DIV_ROUND_UP(MAX_ADDR_ID + 1, BITS_PER_LONG) - struct pm_nl_pernet { /* protects pernet updates */ spinlock_t lock; @@ -52,14 +49,14 @@ struct pm_nl_pernet { unsigned int local_addr_max; unsigned int subflows_max; unsigned int next_id; - unsigned long id_bitmap[BITMAP_SZ]; + DECLARE_BITMAP(id_bitmap, MAX_ADDR_ID + 1); }; =20 #define MPTCP_PM_ADDR_MAX 8 #define ADD_ADDR_RETRANS_MAX 3 =20 static bool addresses_equal(const struct mptcp_addr_info *a, - struct mptcp_addr_info *b, bool use_port) + const struct mptcp_addr_info *b, bool use_port) { bool addr_equals =3D false; =20 @@ -173,6 +170,9 @@ select_local_address(const struct pm_nl_pernet *pernet, if (!(entry->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW)) continue; =20 + if (!test_bit(entry->addr.id, msk->pm.id_avail_bitmap)) + continue; + if (entry->addr.family !=3D sk->sk_family) { #if IS_ENABLED(CONFIG_MPTCP_IPV6) if ((entry->addr.family =3D=3D AF_INET && @@ -183,23 +183,17 @@ select_local_address(const struct pm_nl_pernet *perne= t, continue; } =20 - /* avoid any address already in use by subflows and - * pending join - */ - if (!lookup_subflow_by_saddr(&msk->conn_list, &entry->addr)) { - ret =3D entry; - break; - } + ret =3D entry; + break; } rcu_read_unlock(); return ret; } =20 static struct mptcp_pm_addr_entry * -select_signal_address(struct pm_nl_pernet *pernet, unsigned int pos) +select_signal_address(struct pm_nl_pernet *pernet, struct mptcp_sock *msk) { struct mptcp_pm_addr_entry *entry, *ret =3D NULL; - int i =3D 0; =20 rcu_read_lock(); /* do not keep any additional per socket state, just signal @@ -208,12 +202,14 @@ select_signal_address(struct pm_nl_pernet *pernet, un= signed int pos) * can lead to additional addresses not being announced. */ list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) { + if (!test_bit(entry->addr.id, msk->pm.id_avail_bitmap)) + continue; + if (!(entry->flags & MPTCP_PM_ADDR_FLAG_SIGNAL)) continue; - if (i++ =3D=3D pos) { - ret =3D entry; - break; - } + + ret =3D entry; + break; } rcu_read_unlock(); return ret; @@ -257,9 +253,11 @@ EXPORT_SYMBOL_GPL(mptcp_pm_get_local_addr_max); =20 static void check_work_pending(struct mptcp_sock *msk) { - if (msk->pm.add_addr_signaled =3D=3D mptcp_pm_get_add_addr_signal_max(msk= ) && - (msk->pm.local_addr_used =3D=3D mptcp_pm_get_local_addr_max(msk) || - msk->pm.subflows =3D=3D mptcp_pm_get_subflows_max(msk))) + struct pm_nl_pernet *pernet =3D net_generic(sock_net((struct sock *)msk),= pm_nl_pernet_id); + + if (msk->pm.subflows =3D=3D mptcp_pm_get_subflows_max(msk) || + (find_next_and_bit(pernet->id_bitmap, msk->pm.id_avail_bitmap, MAX_AD= DR_ID + 1, 0) =3D=3D + MAX_ADDR_ID + 1)) WRITE_ONCE(msk->pm.work_pending, false); } =20 @@ -459,6 +457,35 @@ static unsigned int fill_remote_addresses_vec(struct m= ptcp_sock *msk, bool fullm return i; } =20 +static struct mptcp_pm_addr_entry * +__lookup_addr_by_id(struct pm_nl_pernet *pernet, unsigned int id) +{ + struct mptcp_pm_addr_entry *entry; + + list_for_each_entry(entry, &pernet->local_addr_list, list) { + if (entry->addr.id =3D=3D id) + return entry; + } + return NULL; +} + +static int +lookup_id_by_addr(struct pm_nl_pernet *pernet, const struct mptcp_addr_inf= o *addr) +{ + struct mptcp_pm_addr_entry *entry; + int ret =3D -1; + + rcu_read_lock(); + list_for_each_entry(entry, &pernet->local_addr_list, list) { + if (addresses_equal(&entry->addr, addr, entry->addr.port)) { + ret =3D entry->addr.id; + break; + } + } + rcu_read_unlock(); + return ret; +} + static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk) { struct sock *sk =3D (struct sock *)msk; @@ -474,6 +501,19 @@ static void mptcp_pm_create_subflow_or_signal_addr(str= uct mptcp_sock *msk) local_addr_max =3D mptcp_pm_get_local_addr_max(msk); subflows_max =3D mptcp_pm_get_subflows_max(msk); =20 + /* do lazy endpoint usage accounting for the MPC subflows */ + if (unlikely(!(msk->pm.status & BIT(MPTCP_PM_MPC_ENDPOINT_ACCOUNTED))) &&= msk->first) { + struct mptcp_addr_info local; + int mpc_id; + + local_address((struct sock_common *)msk->first, &local); + mpc_id =3D lookup_id_by_addr(pernet, &local); + if (mpc_id < 0) + __clear_bit(mpc_id, msk->pm.id_avail_bitmap); + + msk->pm.status |=3D BIT(MPTCP_PM_MPC_ENDPOINT_ACCOUNTED); + } + pr_debug("local %d:%d signal %d:%d subflows %d:%d\n", msk->pm.local_addr_used, local_addr_max, msk->pm.add_addr_signaled, add_addr_signal_max, @@ -481,21 +521,16 @@ static void mptcp_pm_create_subflow_or_signal_addr(st= ruct mptcp_sock *msk) =20 /* check first for announce */ if (msk->pm.add_addr_signaled < add_addr_signal_max) { - local =3D select_signal_address(pernet, - msk->pm.add_addr_signaled); + local =3D select_signal_address(pernet, msk); =20 if (local) { if (mptcp_pm_alloc_anno_list(msk, local)) { + __clear_bit(local->addr.id, msk->pm.id_avail_bitmap); msk->pm.add_addr_signaled++; mptcp_pm_announce_addr(msk, &local->addr, false); mptcp_pm_nl_addr_send_ack(msk); } - } else { - /* pick failed, avoid fourther attempts later */ - msk->pm.local_addr_used =3D add_addr_signal_max; } - - check_work_pending(msk); } =20 /* check if should create a new subflow */ @@ -509,19 +544,16 @@ static void mptcp_pm_create_subflow_or_signal_addr(st= ruct mptcp_sock *msk) int i, nr; =20 msk->pm.local_addr_used++; - check_work_pending(msk); nr =3D fill_remote_addresses_vec(msk, fullmesh, addrs); + if (nr) + __clear_bit(local->addr.id, msk->pm.id_avail_bitmap); spin_unlock_bh(&msk->pm.lock); for (i =3D 0; i < nr; i++) __mptcp_subflow_connect(sk, &local->addr, &addrs[i]); spin_lock_bh(&msk->pm.lock); - return; } - - /* lookup failed, avoid fourther attempts later */ - msk->pm.local_addr_used =3D local_addr_max; - check_work_pending(msk); } + check_work_pending(msk); } =20 static void mptcp_pm_nl_fully_established(struct mptcp_sock *msk) @@ -735,6 +767,7 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp= _sock *msk, msk->pm.subflows--; __MPTCP_INC_STATS(sock_net(sk), rm_type); } + __set_bit(rm_list->ids[1], msk->pm.id_avail_bitmap); if (!removed) continue; =20 @@ -764,6 +797,9 @@ void mptcp_pm_nl_work(struct mptcp_sock *msk) =20 msk_owned_by_me(msk); =20 + if (!(pm->status & MPTCP_PM_WORK_MASK)) + return; + spin_lock_bh(&msk->pm.lock); =20 pr_debug("msk=3D%p status=3D%x", msk, pm->status); @@ -1197,18 +1233,6 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *skb= , struct genl_info *info) return 0; } =20 -static struct mptcp_pm_addr_entry * -__lookup_addr_by_id(struct pm_nl_pernet *pernet, unsigned int id) -{ - struct mptcp_pm_addr_entry *entry; - - list_for_each_entry(entry, &pernet->local_addr_list, list) { - if (entry->addr.id =3D=3D id) - return entry; - } - return NULL; -} - int mptcp_pm_get_flags_and_ifindex_by_id(struct net *net, unsigned int id, u8 *flags, int *ifindex) { diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 4a8f2476cc75..63602c68f03d 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2508,8 +2508,7 @@ static void mptcp_worker(struct work_struct *work) =20 mptcp_check_fastclose(msk); =20 - if (msk->pm.status) - mptcp_pm_nl_work(msk); + mptcp_pm_nl_work(msk); =20 if (test_and_clear_bit(MPTCP_WORK_EOF, &msk->flags)) mptcp_check_for_eof(msk); diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 47d24478763c..e63fe60f70b8 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -173,16 +173,24 @@ enum mptcp_pm_status { MPTCP_PM_ADD_ADDR_SEND_ACK, MPTCP_PM_RM_ADDR_RECEIVED, MPTCP_PM_ESTABLISHED, - MPTCP_PM_ALREADY_ESTABLISHED, /* persistent status, set after ESTABLISHED= event */ MPTCP_PM_SUBFLOW_ESTABLISHED, + MPTCP_PM_ALREADY_ESTABLISHED, /* persistent status, set after ESTABLISHED= event */ + MPTCP_PM_MPC_ENDPOINT_ACCOUNTED /* persistent status, set after MPC local= address is + * accounted int id_avail_bitmap + */ }; =20 +/* Status bits below MPTCP_PM_ALREADY_ESTABLISHED need pm worker actions */ +#define MPTCP_PM_WORK_MASK ((1 << MPTCP_PM_ALREADY_ESTABLISHED) - 1) + enum mptcp_addr_signal_status { MPTCP_ADD_ADDR_SIGNAL, MPTCP_ADD_ADDR_ECHO, MPTCP_RM_ADDR_SIGNAL, }; =20 +#define MAX_ADDR_ID 255 + struct mptcp_pm_data { struct mptcp_addr_info local; struct mptcp_addr_info remote; @@ -201,6 +209,7 @@ struct mptcp_pm_data { u8 local_addr_used; u8 subflows; u8 status; + DECLARE_BITMAP(id_avail_bitmap, MAX_ADDR_ID + 1); struct mptcp_rm_list rm_list_tx; struct mptcp_rm_list rm_list_rx; }; diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testin= g/selftests/net/mptcp/mptcp_join.sh index 2684ef9c0d42..526b05771d08 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh @@ -1109,7 +1109,10 @@ signal_address_tests() ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags signal ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags signal run_tests $ns1 $ns2 10.0.1.1 - chk_add_nr 4 4 + + # the server will not signal the address teminating + # the MPC subflow + chk_add_nr 3 3 } =20 link_failure_tests() --=20 2.33.1 From nobody Thu May 2 14:55:21 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp7382337jap; Tue, 14 Dec 2021 08:59:31 -0800 (PST) X-Google-Smtp-Source: ABdhPJx+n5Y0k31nDiq4ZaUtRYMuT3i/yr8aKl1m1ZQVw2qhVC5yk5bG3GhW8L36Qzai+cJda+h6 X-Received: by 2002:ab0:b93:: with SMTP id c19mr6865989uak.2.1639501171445; Tue, 14 Dec 2021 08:59:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639501171; cv=none; d=google.com; s=arc-20160816; b=Ofk+T+0rvJFnW9x4YrOH5OTkBwAs7lnibrgP+qZHrHD8nZlAFKSLHKyxvc0oh0X0cm O+/38PX3Zoi/riE1kChyqf7+JvvPeHYzUxfN/wDXmVVnQTSp+laZx0d13EgfxR0pIT0z 1xw6rtT9/k0UWc/E4wa5pF8I7fnf2b9FrM3R2Ergs6XxVLIuQG6N0tNiFbG/cxn2gyNI Nnn0rjUDYY/UtLxQsEsaixHUJw878rhKiy0Xa9FVTi0bx4NOiUwYE8H6AAeKrwdX4Uo5 bHHJl8Zi3A33f/IyC7DCcLwBIsvnDZflPmi3HuZaV1fNbCYR7OKYNMT9IdkeTSXeYPxa lduQ== 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=YXKWaY06yqUZy5gXm7C2FQ1b73lSr4zfHsZ6PP+OS80=; b=sgyLwLkSyLy6o/n6jLaTZWfQxaBwT9Zqz/KIVtrBDVaxB+GLMbVhoOKsuAi9+B84Dg Yq3SIBq0FJBgkLdqa/7pyRSOlsdQb286J98XuPIh7pWCJNGEEo3011G63gB1o42uA9Ey r1kdcAwqcGwGv7SHl7syow/F+OjZgUpOC0n/i5Y+hJz0v1q3uRf3nWayRF1x9oDgY10E XZOO950Xv/5oQx1c18xtE01V3RjEG6c7Qg+FmrjPsylQr2kkX2jyCeksDrAi7ltvuViC ghk2P0RUKyTeDivl2GCkM4kQjmNuaMtVhK4T/fWRdl+hbP7cYvdUmPyFNrU1K0TQlW/j mHqA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=QlqjV6+8; spf=pass (google.com: domain of mptcp+bounces-2750-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2750-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. [147.75.69.165]) by mx.google.com with ESMTPS id 16si796754vkf.53.2021.12.14.08.59.31 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 14 Dec 2021 08:59:31 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2750-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; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=QlqjV6+8; spf=pass (google.com: domain of mptcp+bounces-2750-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2750-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 220733E0ECD for ; Tue, 14 Dec 2021 16:59:31 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6556C68; Tue, 14 Dec 2021 16:59:29 +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 D186E2CB3 for ; Tue, 14 Dec 2021 16:59:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1639501167; 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=YXKWaY06yqUZy5gXm7C2FQ1b73lSr4zfHsZ6PP+OS80=; b=QlqjV6+8OVmDYiEMPotB+o0MQczEGdmC2N3K01l9Fst0uUfc8K3lYxbt9aiuxsQc+mIJ+s 83NJNy+dgWRhyTADah2BNbVYdllSxFtwDLfcwo1IxfopQoJHCGEyTZn9Vvvm3JYRXUwV1G 2+VC60iwlPdC7SD3Fouweau6rPsfoRc= 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-150-fW0Iq88oOYe7Uo6gHLCTLg-1; Tue, 14 Dec 2021 11:59:25 -0500 X-MC-Unique: fW0Iq88oOYe7Uo6gHLCTLg-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 58665100F944 for ; Tue, 14 Dec 2021 16:59:24 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 89E28106A7AE for ; Tue, 14 Dec 2021 16:59:23 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH v6 mptcp-next 4/7] mptcp: do not block subflows creation on errors Date: Tue, 14 Dec 2021 17:58:54 +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.84 on 10.5.11.22 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" If the MPTCP configuration allows for multiple subflows creation, and the first additional subflows never reach the fully established status - e.g. due to packets drop or reset - the in kernel path manager do not move to the next subflow. This patch introduces a new PM helper to cope with MPJ subflow creation failure and delay and hook it where appropriate. Such helper triggers additional subflow creation, as needed and updates the PM subflow counter, if the current one is closing. Additionally start all the needed additional subflows as soon as the MPTCP socket is fully established, so we don't have to cope with slow MPJ handshake blocking the next subflow creation. Signed-off-by: Paolo Abeni Reviewed-by: Mat Martineau --- v5 -> v6: - start all the subflows at once. v3 -> v4: - fix 'subflows' underflow v2 -> v3: - fix compile warning (CI) v1 -> v2: - explicitly hook on subflow close instead of error notification - fix checkpatch issue (Mat) - introduce and use a new pm helper to cope with subflow close - update pm subflow counters on close --- net/mptcp/pm.c | 23 ++++++++++++-- net/mptcp/pm_netlink.c | 69 +++++++++++++++++++++++++----------------- net/mptcp/protocol.c | 6 ++++ net/mptcp/protocol.h | 4 ++- 4 files changed, 71 insertions(+), 31 deletions(-) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index d6d22f18c418..fac02ac195c7 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -172,9 +172,28 @@ void mptcp_pm_subflow_established(struct mptcp_sock *m= sk) spin_unlock_bh(&pm->lock); } =20 -void mptcp_pm_subflow_closed(struct mptcp_sock *msk, u8 id) +void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct sock= *ssk, + const struct mptcp_subflow_context *subflow) { - pr_debug("msk=3D%p", msk); + struct mptcp_pm_data *pm =3D &msk->pm; + bool update_subflows; + + update_subflows =3D (ssk->sk_state =3D=3D TCP_CLOSE) && + (subflow->request_join || subflow->mp_join); + if (!READ_ONCE(pm->work_pending) && !update_subflows) + return; + + spin_lock_bh(&pm->lock); + if (update_subflows) + pm->subflows--; + + /* Even if this subflow is not really established, tell the PM to try + * to pick the next ones, if possible. + */ + if (mptcp_pm_nl_check_work_pending(msk)) + mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED); + + spin_unlock_bh(&pm->lock); } =20 void mptcp_pm_add_addr_received(struct mptcp_sock *msk, diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 1be7f92e9fc8..33af358129cc 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -251,14 +251,17 @@ unsigned int mptcp_pm_get_local_addr_max(struct mptcp= _sock *msk) } EXPORT_SYMBOL_GPL(mptcp_pm_get_local_addr_max); =20 -static void check_work_pending(struct mptcp_sock *msk) +bool mptcp_pm_nl_check_work_pending(struct mptcp_sock *msk) { struct pm_nl_pernet *pernet =3D net_generic(sock_net((struct sock *)msk),= pm_nl_pernet_id); =20 if (msk->pm.subflows =3D=3D mptcp_pm_get_subflows_max(msk) || (find_next_and_bit(pernet->id_bitmap, msk->pm.id_avail_bitmap, MAX_AD= DR_ID + 1, 0) =3D=3D - MAX_ADDR_ID + 1)) + MAX_ADDR_ID + 1)) { WRITE_ONCE(msk->pm.work_pending, false); + return false; + } + return true; } =20 struct mptcp_pm_add_entry * @@ -427,6 +430,7 @@ static bool lookup_address_in_vec(struct mptcp_addr_inf= o *addrs, unsigned int nr static unsigned int fill_remote_addresses_vec(struct mptcp_sock *msk, bool= fullmesh, struct mptcp_addr_info *addrs) { + bool deny_id0 =3D READ_ONCE(msk->pm.remote_deny_join_id0); struct sock *sk =3D (struct sock *)msk, *ssk; struct mptcp_subflow_context *subflow; struct mptcp_addr_info remote =3D { 0 }; @@ -434,22 +438,28 @@ static unsigned int fill_remote_addresses_vec(struct = mptcp_sock *msk, bool fullm int i =3D 0; =20 subflows_max =3D mptcp_pm_get_subflows_max(msk); + remote_address((struct sock_common *)sk, &remote); =20 /* Non-fullmesh endpoint, fill in the single entry * corresponding to the primary MPC subflow remote address */ if (!fullmesh) { - remote_address((struct sock_common *)sk, &remote); + if (deny_id0) + return 0; + msk->pm.subflows++; addrs[i++] =3D remote; } else { mptcp_for_each_subflow(msk, subflow) { ssk =3D mptcp_subflow_tcp_sock(subflow); - remote_address((struct sock_common *)ssk, &remote); - if (!lookup_address_in_vec(addrs, i, &remote) && + remote_address((struct sock_common *)ssk, &addrs[i]); + if (deny_id0 && addresses_equal(&addrs[i], &remote, false)) + continue; + + if (!lookup_address_in_vec(addrs, i, &addrs[i]) && msk->pm.subflows < subflows_max) { msk->pm.subflows++; - addrs[i++] =3D remote; + i++; } } } @@ -503,12 +513,12 @@ static void mptcp_pm_create_subflow_or_signal_addr(st= ruct mptcp_sock *msk) =20 /* do lazy endpoint usage accounting for the MPC subflows */ if (unlikely(!(msk->pm.status & BIT(MPTCP_PM_MPC_ENDPOINT_ACCOUNTED))) &&= msk->first) { - struct mptcp_addr_info local; + struct mptcp_addr_info mpc_addr; int mpc_id; =20 - local_address((struct sock_common *)msk->first, &local); - mpc_id =3D lookup_id_by_addr(pernet, &local); - if (mpc_id < 0) + local_address((struct sock_common *)msk->first, &mpc_addr); + mpc_id =3D lookup_id_by_addr(pernet, &mpc_addr); + if (mpc_id >=3D 0) __clear_bit(mpc_id, msk->pm.id_avail_bitmap); =20 msk->pm.status |=3D BIT(MPTCP_PM_MPC_ENDPOINT_ACCOUNTED); @@ -534,26 +544,28 @@ static void mptcp_pm_create_subflow_or_signal_addr(st= ruct mptcp_sock *msk) } =20 /* check if should create a new subflow */ - if (msk->pm.local_addr_used < local_addr_max && - msk->pm.subflows < subflows_max && - !READ_ONCE(msk->pm.remote_deny_join_id0)) { + while (msk->pm.local_addr_used < local_addr_max && + msk->pm.subflows < subflows_max) { + struct mptcp_addr_info addrs[MPTCP_PM_ADDR_MAX]; + bool fullmesh; + int i, nr; + local =3D select_local_address(pernet, msk); - if (local) { - bool fullmesh =3D !!(local->flags & MPTCP_PM_ADDR_FLAG_FULLMESH); - struct mptcp_addr_info addrs[MPTCP_PM_ADDR_MAX]; - int i, nr; + if (!local) + break; =20 - msk->pm.local_addr_used++; - nr =3D fill_remote_addresses_vec(msk, fullmesh, addrs); - if (nr) - __clear_bit(local->addr.id, msk->pm.id_avail_bitmap); - spin_unlock_bh(&msk->pm.lock); - for (i =3D 0; i < nr; i++) - __mptcp_subflow_connect(sk, &local->addr, &addrs[i]); - spin_lock_bh(&msk->pm.lock); - } + fullmesh =3D !!(local->flags & MPTCP_PM_ADDR_FLAG_FULLMESH); + + msk->pm.local_addr_used++; + nr =3D fill_remote_addresses_vec(msk, fullmesh, addrs); + if (nr) + __clear_bit(local->addr.id, msk->pm.id_avail_bitmap); + spin_unlock_bh(&msk->pm.lock); + for (i =3D 0; i < nr; i++) + __mptcp_subflow_connect(sk, &local->addr, &addrs[i]); + spin_lock_bh(&msk->pm.lock); } - check_work_pending(msk); + mptcp_pm_nl_check_work_pending(msk); } =20 static void mptcp_pm_nl_fully_established(struct mptcp_sock *msk) @@ -760,11 +772,12 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mpt= cp_sock *msk, i, rm_list->ids[i], subflow->local_id, subflow->remote_id); spin_unlock_bh(&msk->pm.lock); mptcp_subflow_shutdown(sk, ssk, how); + + /* the following takes care of updating the subflows counter */ mptcp_close_ssk(sk, ssk, subflow); spin_lock_bh(&msk->pm.lock); =20 removed =3D true; - msk->pm.subflows--; __MPTCP_INC_STATS(sock_net(sk), rm_type); } __set_bit(rm_list->ids[1], msk->pm.id_avail_bitmap); diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 63602c68f03d..aa0a1fe749d9 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2351,6 +2351,12 @@ void mptcp_close_ssk(struct sock *sk, struct sock *s= sk, { if (sk->sk_state =3D=3D TCP_ESTABLISHED) mptcp_event(MPTCP_EVENT_SUB_CLOSED, mptcp_sk(sk), ssk, GFP_KERNEL); + + /* subflow aborted before reaching the fully_established status + * attempt the creation of the next subflow + */ + mptcp_pm_subflow_check_next(mptcp_sk(sk), ssk, subflow); + __mptcp_close_ssk(sk, ssk, subflow, MPTCP_CF_PUSH); } =20 diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index e63fe60f70b8..f38c93c7805c 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -744,7 +744,9 @@ void mptcp_pm_fully_established(struct mptcp_sock *msk,= const struct sock *ssk, bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk); void mptcp_pm_connection_closed(struct mptcp_sock *msk); void mptcp_pm_subflow_established(struct mptcp_sock *msk); -void mptcp_pm_subflow_closed(struct mptcp_sock *msk, u8 id); +bool mptcp_pm_nl_check_work_pending(struct mptcp_sock *msk); +void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct sock= *ssk, + const struct mptcp_subflow_context *subflow); void mptcp_pm_add_addr_received(struct mptcp_sock *msk, const struct mptcp_addr_info *addr); void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk, --=20 2.33.1 From nobody Thu May 2 14:55:21 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp7382429jap; Tue, 14 Dec 2021 08:59:35 -0800 (PST) X-Google-Smtp-Source: ABdhPJx8qx/DLL8xv+9NwhZovJEpZZXMYSOldyH0caY6h5jxur6c8FLaNWqxzBx3VzbpgkcAY0fj X-Received: by 2002:ab0:1303:: with SMTP id g3mr6439100uae.57.1639501175358; Tue, 14 Dec 2021 08:59:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639501175; cv=none; d=google.com; s=arc-20160816; b=T1JSzdIGonpL5A+aXxGbDx4bSMZxH5ED/I8jpnB52d3bF2gYAnDgNnWjupOn5xV+m6 pWSqnu2hPWqRfp1TeqYjBr/aS1xDN1QgiewARnafLrnl0YOXypSWKDBYsmxdatH1G+Z5 V2E83C4f65KfVa1zE+SsloETAE/Oo/7DCkOCx6QhnanKwf6ht1nIonSUGIW0tM8BmN6b Nt4WmoHzbzi+3ea5B7k7+hJ9dnXC8ox7C8popHB8RHQqxZQDR7yjsCGQWvoEKNZHPWLm v9LjikubPq/EHXKv5/mBCzrF53VOwxiis2Kafr3DWYg65/VNALwKHDNS3PwZdfpuvcYI i5wg== 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=DgdlSuzeRNv71/YXM6aQwiFApph7/9UQddkTsDjD5K4=; b=nYTwgf4BDJrPP1Y1d567KX1Abp4a5/DtAtrXpI7qUJPPTPN+Cb0YiO4U0pFgsRFx9b v5IB9ahOkdcrWasoFfeOBt54q33a11c3Rgu2pjdf7OafStE0LL1DnYJmNkqwqF+mhLrs l7i812W7dXlwILo4mjWNWJ+LoiwBqPQOXaNefpJInAje9nXqvHpEn/Gif1y8d2rBBElG UnnAhKaGORN36s6li1YCGGMMS3PSkUor2SpjanQdVfXrcMnTdviRj8OW8D8SqABv2d0Z sMVsS/igP4f9HRG5bywBmaesX88CWMVgcEILLuDSuNERzof5fxIKl6x5UQ3DSgBo+JmS FDTg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=cVWMHbPg; spf=pass (google.com: domain of mptcp+bounces-2753-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2753-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 u2si450528vsn.446.2021.12.14.08.59.35 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 14 Dec 2021 08:59:35 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2753-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=cVWMHbPg; spf=pass (google.com: domain of mptcp+bounces-2753-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2753-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 176A33E0F0A for ; Tue, 14 Dec 2021 16:59:35 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A713B2CAA; Tue, 14 Dec 2021 16:59:34 +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 76EDC68 for ; Tue, 14 Dec 2021 16:59:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1639501172; 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=DgdlSuzeRNv71/YXM6aQwiFApph7/9UQddkTsDjD5K4=; b=cVWMHbPgFGpyBslsicGaMK2t31RFz8ljUNktrdWqmrgTCQeL3eNAAWKGKoFX5mRo2KXzEP xCjevm9/CYdAWrcVtFRKM8Tb1stcwXpz2GqEgr2Xw+V0IrvjYzVzy15fWdINXc03nSCgPS QqnyZBgDPsOUMnE46nqa8pT29r11nd8= 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-670-al_ne4RENsKIAHxbH7qvNA-1; Tue, 14 Dec 2021 11:59:26 -0500 X-MC-Unique: al_ne4RENsKIAHxbH7qvNA-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 71943100F945 for ; Tue, 14 Dec 2021 16:59:25 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id CD5391059112 for ; Tue, 14 Dec 2021 16:59:24 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH v6 mptcp-next 5/7] selftests: mptcp: add tests for subflow creation failure Date: Tue, 14 Dec 2021 17:58: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 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 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" Verify that, when multiple endpoints are available, subflows creation proceed even when the first additional subflow creation fails - due to packet drop on the relevant link Signed-off-by: Paolo Abeni Reviewed-by: Mat Martineau --- v5 -> v6: - fix test cnt update v4 -> v5: - new test checking for wrong MPC reuse v3 -> v4: - use $() where applicable - Matt - fix typo in help() - Matt v1 -> v2: - add missing NF kconfig - add more test-cases (drop, later subflow creation) --- tools/testing/selftests/net/mptcp/config | 1 + .../testing/selftests/net/mptcp/mptcp_join.sh | 78 ++++++++++++++++++- 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/mptcp/config b/tools/testing/selft= ests/net/mptcp/config index 419e71560fd1..41e94e004bdc 100644 --- a/tools/testing/selftests/net/mptcp/config +++ b/tools/testing/selftests/net/mptcp/config @@ -18,4 +18,5 @@ CONFIG_NFT_TPROXY=3Dm CONFIG_NFT_SOCKET=3Dm CONFIG_IP_ADVANCED_ROUTER=3Dy CONFIG_IP_MULTIPLE_TABLES=3Dy +CONFIG_IP_NF_TARGET_REJECT=3Dm CONFIG_IPV6_MULTIPLE_TABLES=3Dy diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testin= g/selftests/net/mptcp/mptcp_join.sh index 526b05771d08..56fcc8b412fc 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh @@ -975,6 +975,22 @@ chk_link_usage() fi } =20 +wait_for_tw() +{ + local timeout_ms=3D$((timeout_poll * 1000)) + local time=3D0 + local ns=3D$1 + + while [ $time -lt $timeout_ms ]; do + local cnt=3D$(ip netns exec $ns ss -t state time-wait |wc -l) + + [ "$cnt" =3D 1 ] && return 1 + time=3D$((time + 100)) + sleep 0.1 + done + return 1 +} + subflows_tests() { reset @@ -1032,6 +1048,61 @@ subflows_tests() chk_join_nr "single subflow, dev" 1 1 1 } =20 +subflows_error_tests() +{ + # If a single subflow is configured, and matches the MPC src + # address, no additional subflow should be created + reset + ip netns exec $ns1 ./pm_nl_ctl limits 0 1 + ip netns exec $ns2 ./pm_nl_ctl limits 0 1 + ip netns exec $ns2 ./pm_nl_ctl add 10.0.1.2 flags subflow + run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow + chk_join_nr "no MPC address reuse with single endpoint" 0 0 0 + + # multiple subflows, with subflow creation error + reset + ip netns exec $ns1 ./pm_nl_ctl limits 0 2 + ip netns exec $ns2 ./pm_nl_ctl limits 0 2 + ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow + ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow + ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT + run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow + chk_join_nr "multiple subflows, with failing subflow" 1 1 1 + + # multiple subflows, with subflow timeout on MPJ + reset + ip netns exec $ns1 ./pm_nl_ctl limits 0 2 + ip netns exec $ns2 ./pm_nl_ctl limits 0 2 + ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow + ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow + ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j DROP + run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow + chk_join_nr "multiple subflows, with subflow timeout" 1 1 1 + + # multiple subflows, check that the endpoint corresponding to + # closed subflow (due to reset) is not reused if additional + # subflows are added later + reset + ip netns exec $ns1 ./pm_nl_ctl limits 0 1 + ip netns exec $ns2 ./pm_nl_ctl limits 0 1 + ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow + ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT + run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow & + + # updates in the child shell do not have any effect here, we + # need to bump the test counter for the above case + TEST_COUNT=3D$((TEST_COUNT)) + + # mpj subflow will be in TW after the reset + wait_for_tw $ns2 + ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow + wait + + # additional subflow could be created only if the PM select + # the later endpoint, skipping the already used one + chk_join_nr "multiple subflows, fair usage on close" 1 1 1 +} + signal_address_tests() { # add_address, unused @@ -1843,6 +1914,7 @@ fullmesh_tests() all_tests() { subflows_tests + subflows_error_tests signal_address_tests link_failure_tests add_addr_timeout_tests @@ -1862,6 +1934,7 @@ usage() { echo "mptcp_join usage:" echo " -f subflows_tests" + echo " -e subflows_error_tests" echo " -s signal_address_tests" echo " -l link_failure_tests" echo " -t add_addr_timeout_tests" @@ -1910,11 +1983,14 @@ if [ $do_all_tests -eq 1 ]; then exit $ret fi =20 -while getopts 'fsltra64bpkdmchCS' opt; do +while getopts 'fesltra64bpkdmchCS' opt; do case $opt in f) subflows_tests ;; + e) + subflows_error_tests + ;; s) signal_address_tests ;; --=20 2.33.1 From nobody Thu May 2 14:55:21 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp7382377jap; Tue, 14 Dec 2021 08:59:33 -0800 (PST) X-Google-Smtp-Source: ABdhPJy5kr5O6RA1C9Kn7ccF6Bojhcn+0XCy8GPliZOGE7jFx7JCzDV89HYDfC4iUCvhTCSNj5rJ X-Received: by 2002:a05:6122:54e:: with SMTP id y14mr122387vko.24.1639501173114; Tue, 14 Dec 2021 08:59:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639501173; cv=none; d=google.com; s=arc-20160816; b=WkYlkdJbZhgKH2Oi76DAzsurVsW1rQOGmtS5pf9x/6racvxrfZjstMkp+cIXd1bXoA wcmAni/+ORfeSwxyFBXKkGakKpPZ3ja4tf+jSo34XVfmKDZ+Oh3/FGjlVmjeoOBPZExb 7oK2rGtssHIfmC7kca/7fDo1ahYJor/OCj7cpQT+wJt6xTdMHNw+L0p6RbO09IUnVCpi KhfgP7nmakWcU1b6cZI/h+HEFxr2VXL+DV9RgsK1b22JsWu3l0r0U0FAOdqgGhbMSSn+ Z3T02cOKm3KPCstu0lNHCnKieprixuduU900D10m6qrg6tal8jkpz7wJHyqKvYTk1rd5 Preg== 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=BmGabouOdKJs0DH8MS+ejK0QZUelAuWtRVak8HTjc5Q=; b=BxkPQU0XkGSX483cZciEhPy5csjXUzHV43WFJ1gRLnQTCCRa8Gz0oYEi9S1pm3k+Pi bSec9sVxmSpI0/R9kvMDCmSArK72a7k7eSaPMA2Soc/x14RDB5HkCBSSN3azgGUKEhCR W7FswNYU9iRcCDzeuYiO5wE1MAtoiyF7XrHLHeppXu8RRwZEUN5epDW210WChh5HMdFN bgFQjGE03EdYskiu6Eh+ZYmXK3VyO9JQS30W60H/GWhOLBdqpt8y73+1vuAmdryoKpUQ 4HabV8cD3n/AmpfdLo6fOQ4mXbTaz/Rtb1CiC7s0NShoiBtKVInDkNLe4ylUojq8Q0nZ +LRg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=hdks1wwl; spf=pass (google.com: domain of mptcp+bounces-2751-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2751-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. [147.75.69.165]) by mx.google.com with ESMTPS id o12si434442vst.69.2021.12.14.08.59.32 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 14 Dec 2021 08:59:33 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2751-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; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=hdks1wwl; spf=pass (google.com: domain of mptcp+bounces-2751-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2751-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 697F53E0F55 for ; Tue, 14 Dec 2021 16:59:32 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id DF00E2CB2; Tue, 14 Dec 2021 16:59:30 +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 73E412CB3 for ; Tue, 14 Dec 2021 16:59:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1639501168; 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=BmGabouOdKJs0DH8MS+ejK0QZUelAuWtRVak8HTjc5Q=; b=hdks1wwlM57ImArkg/MEZCViS42r/Oupnc9hvFzbfki6k/9mnK3BnqXLAhcv5qvYZbl4Gn f8TEhHbRRj8I2zPdKKUHJxksezo6zTd1NEtJ2CPcPI4fnFKbRPl/svavcysFDRllfvZQBu YRath2PAD600+ki1pkzNypAwA6LgXHc= 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-116-5leZhE3cNwGaQZluYmHHBg-1; Tue, 14 Dec 2021 11:59:27 -0500 X-MC-Unique: 5leZhE3cNwGaQZluYmHHBg-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 8C2CB760C4 for ; Tue, 14 Dec 2021 16:59:26 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id CE3D31059112 for ; Tue, 14 Dec 2021 16:59:25 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH v6 mptcp-next 6/7] mptcp: cleanup MPJ subflow list handling Date: Tue, 14 Dec 2021 17:58:56 +0100 Message-Id: <71f6a006bcd7bd2a425273ef429df5775ddd8f2e.1639500873.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 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 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" We can simplify the join list handling leveraging the mptcp_release_cb(): if we can acquire the msk socket lock ad mptcp_finish_join time, move the new subflow directly into the conn_list, othewise place it on join_list and let the release_cb process such list. Since pending MPJ connection are now always processed in a timely way, we can avoid flushing the join list every time we have to process all the current subflows. Additionally we can now use the mptcp data lock to protect the join_list, removing the additional spin lock. Finally, the MPJ handshake is now always finalized under the msk socket lock, we can drop the additional synchronization between mptcp_finish_join() and mptcp_close(). Signed-off-by: Paolo Abeni Reviewed-by: Mat Martineau --- rfc -> v1: - fix list corruption in __mptcp_flush_join_list() - fix label name typo (Mat) --- net/mptcp/pm_netlink.c | 3 -- net/mptcp/protocol.c | 109 +++++++++++++++++------------------------ net/mptcp/protocol.h | 15 +----- net/mptcp/sockopt.c | 24 +++------ net/mptcp/subflow.c | 5 +- 5 files changed, 56 insertions(+), 100 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 33af358129cc..139c33171397 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -165,7 +165,6 @@ select_local_address(const struct pm_nl_pernet *pernet, msk_owned_by_me(msk); =20 rcu_read_lock(); - __mptcp_flush_join_list(msk); list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) { if (!(entry->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW)) continue; @@ -595,7 +594,6 @@ static unsigned int fill_local_addresses_vec(struct mpt= cp_sock *msk, subflows_max =3D mptcp_pm_get_subflows_max(msk); =20 rcu_read_lock(); - __mptcp_flush_join_list(msk); list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) { if (!(entry->flags & MPTCP_PM_ADDR_FLAG_FULLMESH)) continue; @@ -684,7 +682,6 @@ void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk) !mptcp_pm_should_rm_signal(msk)) return; =20 - __mptcp_flush_join_list(msk); subflow =3D list_first_entry_or_null(&msk->conn_list, typeof(*subflow), n= ode); if (subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index aa0a1fe749d9..e81fd46a43c4 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -808,47 +808,31 @@ void mptcp_data_ready(struct sock *sk, struct sock *s= sk) mptcp_data_unlock(sk); } =20 -static bool mptcp_do_flush_join_list(struct mptcp_sock *msk) +static bool __mptcp_finish_join(struct mptcp_sock *msk, struct sock *ssk) { - struct mptcp_subflow_context *subflow; - bool ret =3D false; - - if (likely(list_empty(&msk->join_list))) + if (((struct sock *)msk)->sk_state !=3D TCP_ESTABLISHED) return false; =20 - spin_lock_bh(&msk->join_list_lock); - list_for_each_entry(subflow, &msk->join_list, node) { - u32 sseq =3D READ_ONCE(subflow->setsockopt_seq); - - mptcp_propagate_sndbuf((struct sock *)msk, mptcp_subflow_tcp_sock(subflo= w)); - if (READ_ONCE(msk->setsockopt_seq) !=3D sseq) - ret =3D true; - } - list_splice_tail_init(&msk->join_list, &msk->conn_list); - spin_unlock_bh(&msk->join_list_lock); - - return ret; -} - -void __mptcp_flush_join_list(struct mptcp_sock *msk) -{ - if (likely(!mptcp_do_flush_join_list(msk))) - return; - - if (!test_and_set_bit(MPTCP_WORK_SYNC_SETSOCKOPT, &msk->flags)) - mptcp_schedule_work((struct sock *)msk); + mptcp_propagate_sndbuf((struct sock *)msk, ssk); + mptcp_sockopt_sync_locked(msk, ssk); + WRITE_ONCE(msk->allow_infinite_fallback, false); + return true; } =20 -static void mptcp_flush_join_list(struct mptcp_sock *msk) +static void __mptcp_flush_join_list(struct sock *sk) { - bool sync_needed =3D test_and_clear_bit(MPTCP_WORK_SYNC_SETSOCKOPT, &msk-= >flags); - - might_sleep(); + struct mptcp_subflow_context *tmp, *subflow; + struct mptcp_sock *msk =3D mptcp_sk(sk); =20 - if (!mptcp_do_flush_join_list(msk) && !sync_needed) - return; + list_for_each_entry_safe(subflow, tmp, &msk->join_list, node) { + struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); + bool slow =3D lock_sock_fast(ssk); =20 - mptcp_sockopt_sync_all(msk); + list_move_tail(&subflow->node, &msk->conn_list); + if (!__mptcp_finish_join(msk, ssk)) + mptcp_subflow_reset(ssk); + unlock_sock_fast(ssk, slow); + } } =20 static bool mptcp_timer_pending(struct sock *sk) @@ -1568,7 +1552,6 @@ void __mptcp_push_pending(struct sock *sk, unsigned i= nt flags) int ret =3D 0; =20 prev_ssk =3D ssk; - __mptcp_flush_join_list(msk); ssk =3D mptcp_subflow_get_send(msk); =20 /* First check. If the ssk has changed since @@ -1973,7 +1956,6 @@ static bool __mptcp_move_skbs(struct mptcp_sock *msk) unsigned int moved =3D 0; bool ret, done; =20 - mptcp_flush_join_list(msk); do { struct sock *ssk =3D mptcp_subflow_recv_lookup(msk); bool slowpath; @@ -2510,7 +2492,6 @@ static void mptcp_worker(struct work_struct *work) goto unlock; =20 mptcp_check_data_fin_ack(sk); - mptcp_flush_join_list(msk); =20 mptcp_check_fastclose(msk); =20 @@ -2548,8 +2529,6 @@ static int __mptcp_init_sock(struct sock *sk) { struct mptcp_sock *msk =3D mptcp_sk(sk); =20 - spin_lock_init(&msk->join_list_lock); - INIT_LIST_HEAD(&msk->conn_list); INIT_LIST_HEAD(&msk->join_list); INIT_LIST_HEAD(&msk->rtx_queue); @@ -2728,7 +2707,6 @@ static void __mptcp_check_send_data_fin(struct sock *= sk) } } =20 - mptcp_flush_join_list(msk); mptcp_for_each_subflow(msk, subflow) { struct sock *tcp_sk =3D mptcp_subflow_tcp_sock(subflow); =20 @@ -2761,12 +2739,7 @@ static void __mptcp_destroy_sock(struct sock *sk) =20 might_sleep(); =20 - /* be sure to always acquire the join list lock, to sync vs - * mptcp_finish_join(). - */ - spin_lock_bh(&msk->join_list_lock); - list_splice_tail_init(&msk->join_list, &msk->conn_list); - spin_unlock_bh(&msk->join_list_lock); + /* join list will be eventually flushed (with rst) at sock lock release t= ime*/ list_splice_init(&msk->conn_list, &conn_list); =20 sk_stop_timer(sk, &msk->sk.icsk_retransmit_timer); @@ -2869,8 +2842,6 @@ static int mptcp_disconnect(struct sock *sk, int flag= s) struct mptcp_subflow_context *subflow; struct mptcp_sock *msk =3D mptcp_sk(sk); =20 - mptcp_do_flush_join_list(msk); - inet_sk_state_store(sk, TCP_CLOSE); =20 mptcp_for_each_subflow(msk, subflow) { @@ -3103,6 +3074,8 @@ static void mptcp_release_cb(struct sock *sk) 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); if (!flags) break; =20 @@ -3115,6 +3088,8 @@ static void mptcp_release_cb(struct sock *sk) */ =20 spin_unlock_bh(&sk->sk_lock.slock); + if (flags & BIT(MPTCP_FLUSH_JOIN_LIST)) + __mptcp_flush_join_list(sk); if (flags & BIT(MPTCP_PUSH_PENDING)) __mptcp_push_pending(sk, 0); if (flags & BIT(MPTCP_RETRANSMIT)) @@ -3260,7 +3235,7 @@ bool mptcp_finish_join(struct sock *ssk) struct mptcp_sock *msk =3D mptcp_sk(subflow->conn); struct sock *parent =3D (void *)msk; struct socket *parent_sock; - bool ret; + bool ret =3D true; =20 pr_debug("msk=3D%p, subflow=3D%p", msk, subflow); =20 @@ -3273,24 +3248,32 @@ bool mptcp_finish_join(struct sock *ssk) if (!msk->pm.server_side) goto out; =20 - if (!mptcp_pm_allow_new_subflow(msk)) { - subflow->reset_reason =3D MPTCP_RST_EPROHIBIT; - return false; - } + if (!mptcp_pm_allow_new_subflow(msk)) + goto err_prohibited; =20 - /* active connections are already on conn_list, and we can't acquire - * msk lock here. - * use the join list lock as synchronization point and double-check - * msk status to avoid racing with __mptcp_destroy_sock() + if (WARN_ON_ONCE(!list_empty(&subflow->node))) + goto err_prohibited; + + /* active connections are already on conn_list. + * If we can't acquire msk socket lock here, let the release callback + * handle it */ - spin_lock_bh(&msk->join_list_lock); - ret =3D inet_sk_state_load(parent) =3D=3D TCP_ESTABLISHED; - if (ret && !WARN_ON_ONCE(!list_empty(&subflow->node))) { - list_add_tail(&subflow->node, &msk->join_list); + mptcp_data_lock(parent); + if (!sock_owned_by_user(parent)) { + ret =3D __mptcp_finish_join(msk, ssk); + if (ret) { + sock_hold(ssk); + list_add_tail(&subflow->node, &msk->conn_list); + } + } else { sock_hold(ssk); + list_add_tail(&subflow->node, &msk->join_list); + set_bit(MPTCP_FLUSH_JOIN_LIST, &msk->flags); } - spin_unlock_bh(&msk->join_list_lock); + mptcp_data_unlock(parent); + if (!ret) { +err_prohibited: subflow->reset_reason =3D MPTCP_RST_EPROHIBIT; return false; } @@ -3301,8 +3284,9 @@ bool mptcp_finish_join(struct sock *ssk) parent_sock =3D READ_ONCE(parent->sk_socket); if (parent_sock && !ssk->sk_socket) mptcp_sock_graft(ssk, parent_sock); + subflow->map_seq =3D READ_ONCE(msk->ack_seq); - WRITE_ONCE(msk->allow_infinite_fallback, false); + out: mptcp_event(MPTCP_EVENT_SUB_ESTABLISHED, msk, ssk, GFP_ATOMIC); return true; @@ -3567,7 +3551,6 @@ static int mptcp_stream_accept(struct socket *sock, s= truct socket *newsock, /* set ssk->sk_socket of accept()ed flows to mptcp socket. * This is needed so NOSPACE flag can be set from tcp stack. */ - mptcp_flush_join_list(msk); mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); =20 diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index f38c93c7805c..27a510b20996 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -120,7 +120,7 @@ #define MPTCP_CLEAN_UNA 7 #define MPTCP_ERROR_REPORT 8 #define MPTCP_RETRANSMIT 9 -#define MPTCP_WORK_SYNC_SETSOCKOPT 10 +#define MPTCP_FLUSH_JOIN_LIST 10 #define MPTCP_CONNECTED 11 =20 static inline bool before64(__u64 seq1, __u64 seq2) @@ -261,7 +261,6 @@ struct mptcp_sock { u8 recvmsg_inq:1, cork:1, nodelay:1; - spinlock_t join_list_lock; struct work_struct work; struct sk_buff *ooo_last_skb; struct rb_root out_of_order_queue; @@ -510,15 +509,6 @@ mptcp_subflow_get_mapped_dsn(const struct mptcp_subflo= w_context *subflow) return subflow->map_seq + mptcp_subflow_get_map_offset(subflow); } =20 -static inline void mptcp_add_pending_subflow(struct mptcp_sock *msk, - struct mptcp_subflow_context *subflow) -{ - sock_hold(mptcp_subflow_tcp_sock(subflow)); - spin_lock_bh(&msk->join_list_lock); - list_add_tail(&subflow->node, &msk->join_list); - spin_unlock_bh(&msk->join_list_lock); -} - void mptcp_subflow_process_delegated(struct sock *ssk); =20 static inline void mptcp_subflow_delegate(struct mptcp_subflow_context *su= bflow, int action) @@ -683,7 +673,6 @@ void __mptcp_data_acked(struct sock *sk); void __mptcp_error_report(struct sock *sk); void mptcp_subflow_eof(struct sock *sk); bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq, b= ool use_64bit); -void __mptcp_flush_join_list(struct mptcp_sock *msk); static inline bool mptcp_data_fin_enabled(const struct mptcp_sock *msk) { return READ_ONCE(msk->snd_data_fin_enable) && @@ -843,7 +832,7 @@ unsigned int mptcp_pm_get_subflows_max(struct mptcp_soc= k *msk); unsigned int mptcp_pm_get_local_addr_max(struct mptcp_sock *msk); =20 void mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk); -void mptcp_sockopt_sync_all(struct mptcp_sock *msk); +void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk); =20 static inline struct mptcp_ext *mptcp_get_ext(const struct sk_buff *skb) { diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index aa3fcd86dbe2..dacf3cee0027 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -1285,27 +1285,15 @@ void mptcp_sockopt_sync(struct mptcp_sock *msk, str= uct sock *ssk) } } =20 -void mptcp_sockopt_sync_all(struct mptcp_sock *msk) +void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk) { - struct mptcp_subflow_context *subflow; - struct sock *sk =3D (struct sock *)msk; - u32 seq; - - seq =3D sockopt_seq_reset(sk); + struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(ssk); =20 - mptcp_for_each_subflow(msk, subflow) { - struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); - u32 sseq =3D READ_ONCE(subflow->setsockopt_seq); + msk_owned_by_me(msk); =20 - if (sseq !=3D msk->setsockopt_seq) { - __mptcp_sockopt_sync(msk, ssk); - WRITE_ONCE(subflow->setsockopt_seq, seq); - } else if (sseq !=3D seq) { - WRITE_ONCE(subflow->setsockopt_seq, seq); - } + if (READ_ONCE(subflow->setsockopt_seq) !=3D msk->setsockopt_seq) { + sync_socket_options(msk, ssk); =20 - cond_resched(); + subflow->setsockopt_seq =3D msk->setsockopt_seq; } - - msk->setsockopt_seq =3D seq; } diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 0f90bd61de01..8716b9cb8040 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1446,7 +1446,8 @@ int __mptcp_subflow_connect(struct sock *sk, const st= ruct mptcp_addr_info *loc, subflow->request_bkup =3D !!(flags & MPTCP_PM_ADDR_FLAG_BACKUP); mptcp_info2sockaddr(remote, &addr, ssk->sk_family); =20 - mptcp_add_pending_subflow(msk, subflow); + sock_hold(ssk); + list_add_tail(&subflow->node, &msk->conn_list); err =3D kernel_connect(sf, (struct sockaddr *)&addr, addrlen, O_NONBLOCK); if (err && err !=3D -EINPROGRESS) goto failed_unlink; @@ -1458,9 +1459,7 @@ int __mptcp_subflow_connect(struct sock *sk, const st= ruct mptcp_addr_info *loc, return err; =20 failed_unlink: - spin_lock_bh(&msk->join_list_lock); list_del(&subflow->node); - spin_unlock_bh(&msk->join_list_lock); sock_put(mptcp_subflow_tcp_sock(subflow)); =20 failed: --=20 2.33.1 From nobody Thu May 2 14:55:21 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp7382404jap; Tue, 14 Dec 2021 08:59:34 -0800 (PST) X-Google-Smtp-Source: ABdhPJyXaU+17iW2wDqWV/ls78t5aZdc9csqjKIlMkXt8jxUip9RlIVYfucbiBMzUNyW6zqDnj9E X-Received: by 2002:a05:622a:647:: with SMTP id a7mr7011189qtb.593.1639501174281; Tue, 14 Dec 2021 08:59:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639501174; cv=none; d=google.com; s=arc-20160816; b=0vQ00SLO7xJhbhlK9xRymdoz8lDPLOpZ61mCAC5WoKXr2Gj9KzYKPuYnCZx0ZKvUXl ULL4geEvWzaJ7G8oHlDq3I31jCg46AmyTpMaTDtHJBFva1vz0EEBusxDiOAVLiy5IigZ aYFN+DqIbz7pjPXC5PsWJnq1INPAi9po0hfCVwNXvNitdmeeYSLySLF95w/0A9qqvfvz VyVmZZLUr/OqRL0ayTQ9/xsdHXUlu14xvGBg2WLfxPMt0MvzkskNNIU1l+EDySUumahB D0vpXIL+PM3MAZwBJSZffFE6BiXoQPlYj2G8vjUa41hvoCgLmbn/OGWN/PgbAhSeCAlR j04A== 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=8YuI/uDvj4vY19NJDIt/a4YbGC7RAmqqHwxoDJ4JN6M=; b=ngPrS5Y4SfNr4VZ/MytcvUzYJM19/FQ8I4ALEuRwzl5eum3SgFF8/G9psxZ+rwV/i8 ErlYEY8tWotVbngRGkCB89Pw7l+5M97Dj3fCf9GzLb59TflUuGaXb3qsHjPeWy8bbJGd trrBWT6mfbee3WKrkGpNHbRYXpEnm+8H1zzifhgM2+df2XxdGSIMS1JYPL1+3JKJOCBr s8qnEPhRZpm6vnKg9yFG6GMXFgRb+5l3VO0MmJw60Ir1EsEXnvSjIYCY8hZgBbD4R1Td HzvaT9eyNI6bUu5XoSCTiwn1yBCsQudNb2eNM9IyyD7PB9o1xGyuRk/9gFgJksEv1evL XEuQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=h2oNypV9; spf=pass (google.com: domain of mptcp+bounces-2752-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2752-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 u2si371878qvg.208.2021.12.14.08.59.34 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 14 Dec 2021 08:59:34 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2752-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=h2oNypV9; spf=pass (google.com: domain of mptcp+bounces-2752-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2752-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 EBFD81C08E9 for ; Tue, 14 Dec 2021 16:59:33 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 508DD2CB3; Tue, 14 Dec 2021 16:59:32 +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 2CF112CAA for ; Tue, 14 Dec 2021 16:59:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1639501170; 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=8YuI/uDvj4vY19NJDIt/a4YbGC7RAmqqHwxoDJ4JN6M=; b=h2oNypV9ToUF+m6HC4NvvHuB6v0zFsUwAGy1av46TN8VdQD0yEGh9AleWFAr9tRKQw1fyC fUm3xUU7EScEePjVC/ivKLm3Bs7EyxYMTj/pHZTuo0J5SmpkwXgKKtO7yY/w8wJGdrhMDR MQtU53PDijOQ/+reYsfT0VTKZOrwtu8= 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-549-kGomxQQ2MDGJiEQeT_DEgQ-1; Tue, 14 Dec 2021 11:59:29 -0500 X-MC-Unique: kGomxQQ2MDGJiEQeT_DEgQ-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 7711F1B18BC1 for ; Tue, 14 Dec 2021 16:59:27 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id D197A1059112 for ; Tue, 14 Dec 2021 16:59:26 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH v6 mptcp-next 7/7] mptcp: avoid atomic bit manipulation when possible Date: Tue, 14 Dec 2021 17:58:57 +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.84 on 10.5.11.22 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 Reviewed-by: Mat Martineau --- 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 e81fd46a43c4..334abea4be9c 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); @@ -2858,7 +2857,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; @@ -3041,7 +3042,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); @@ -3060,22 +3061,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 @@ -3086,7 +3087,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); @@ -3102,11 +3104,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); @@ -3148,7 +3150,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); } @@ -3268,7 +3270,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 27a510b20996..0459f164dc0b 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) { @@ -249,6 +251,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 8716b9cb8040..557ef71309b0 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 @@ -1279,7 +1279,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