Received: by 2002:ac2:464d:0:0:0:0:0 with SMTP id s13csp3688548lfo; Mon, 23 May 2022 11:29:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyuTvTruIPkutlXx2mLUa49c5FmVjJYnWuZrdfX3elzndQlOuWbu+Z2gMWr7K274pvbge2L X-Received: by 2002:a17:902:b581:b0:161:5f37:6688 with SMTP id a1-20020a170902b58100b001615f376688mr23655746pls.145.1653330591923; Mon, 23 May 2022 11:29:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1653330591; cv=none; d=google.com; s=arc-20160816; b=hw35b5GVwxGnZNS0+08yWUhvxQ3ZqqXz6xVRO3yN0a6FK7Axug775JaccTuTrKCGRe LpCIFIqubEJANr9TxlF7rYKN1O37eea48m2zhN/Ebf4BQ15MqaQT9cYZITOePpOZsAgr EYL+JVZ/6DUgwx55eDwIMcfbZEqtGkPhC73qsCXCJowGFri0tapVHgPHfhD93aKw2V8t WxpfLCA6juoFUw3KzcS/LhU3hMBX/pwNaZqOJMk6MtqxTPelPlKFrXumG0sV8zhNud09 fE8816q/i//1dulqWXazvB7BbnUWlTDZ4whux7T3J0xACwIfxpgrcEP+UApkIzWTOMf5 MgIg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=HCvvdrXRUTT+KWpwEThNAtIzXZXkFBOKb9DFGO9YIEo=; b=bVITB2q1y47O5rJR1HbaE66Z4rtpDBXJH3ZJHdlilaK1e5jEIS8hcQTt4Yd5IjnWiQ tFuqxAVbQYt0Q1kxEcNsbk/WcMisSuHUBLJKz/oNq4eh+UsFIhI5Hh4xfhY4Rm51/jqt i2eh9ZWzcpPKqG7/k4x+YlAYVOk8szbAat/x8U4WyGQSgiAZGk3a2K3XpGl1PFV+F4XT UzpTMKra2IkAkC8Gcm7muz5KWn2tR3CDy+ZWt8l9GAaWC7qS8Qr48olz4WbXAqm8ZYQx q/NnEFPAuZ9y1l3K8iAINjcF/jqnwU7hbVMWSAE+GygSo8Mb1crbXU9F9GNfsuJJEe0A D3TQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=ECH6DjmY; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id nd10-20020a17090b4cca00b001df28d76a0bsi69772pjb.70.2022.05.23.11.29.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 May 2022 11:29:51 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=ECH6DjmY; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id BAF5B13B8DB; Mon, 23 May 2022 11:29:36 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242496AbiEWSBB (ORCPT + 99 others); Mon, 23 May 2022 14:01:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35944 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241245AbiEWRct (ORCPT ); Mon, 23 May 2022 13:32:49 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DD7BD6345; Mon, 23 May 2022 10:27:36 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 349D6B811FF; Mon, 23 May 2022 17:27:35 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8D36EC385A9; Mon, 23 May 2022 17:27:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1653326854; bh=BkwxpHcOxOEqZ97C+zcVcrK3VZuqEqDMwOlx6I9X0pU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ECH6DjmY9fJEYWad2WRO8oqSK7zo2iOAr2bUBI6Ob35wCOTXs0yHVvXAhBAWSaoff +nsKixAAKFUxu0pD4e6uuFoG7HMgVX53o588urqZBFpJRCt0I3mXy2zgBvQOEcuw+2 PlntQvNajMnII2fKvBBSKIx+Px60kbE6zq+SyGQc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Paolo Abeni , Mat Martineau , Jakub Kicinski , Sasha Levin Subject: [PATCH 5.17 079/158] mptcp: fix subflow accounting on close Date: Mon, 23 May 2022 19:03:56 +0200 Message-Id: <20220523165844.141773273@linuxfoundation.org> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220523165830.581652127@linuxfoundation.org> References: <20220523165830.581652127@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Paolo Abeni [ Upstream commit 95d686517884a403412b000361cee2b08b2ed1e6 ] If the PM closes a fully established MPJ subflow or the subflow creation errors out in it's early stage the subflows counter is not bumped accordingly. This change adds the missing accounting, additionally taking care of updating accordingly the 'accept_subflow' flag. Fixes: a88c9e496937 ("mptcp: do not block subflows creation on errors") Signed-off-by: Paolo Abeni Signed-off-by: Mat Martineau Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/mptcp/pm.c | 5 ++--- net/mptcp/protocol.h | 14 ++++++++++++++ net/mptcp/subflow.c | 12 +++++++++--- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 7bea318ac5f2..1eb83cbe8aae 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -178,14 +178,13 @@ void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct sock *ssk, struct mptcp_pm_data *pm = &msk->pm; bool update_subflows; - update_subflows = (ssk->sk_state == TCP_CLOSE) && - (subflow->request_join || subflow->mp_join); + update_subflows = 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--; + __mptcp_pm_close_subflow(msk); /* Even if this subflow is not really established, tell the PM to try * to pick the next ones, if possible. diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 85317ce38e3f..a1c845eb47bd 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -835,6 +835,20 @@ unsigned int mptcp_pm_get_add_addr_accept_max(struct mptcp_sock *msk); unsigned int mptcp_pm_get_subflows_max(struct mptcp_sock *msk); unsigned int mptcp_pm_get_local_addr_max(struct mptcp_sock *msk); +/* called under PM lock */ +static inline void __mptcp_pm_close_subflow(struct mptcp_sock *msk) +{ + if (--msk->pm.subflows < mptcp_pm_get_subflows_max(msk)) + WRITE_ONCE(msk->pm.accept_subflow, true); +} + +static inline void mptcp_pm_close_subflow(struct mptcp_sock *msk) +{ + spin_lock_bh(&msk->pm.lock); + __mptcp_pm_close_subflow(msk); + spin_unlock_bh(&msk->pm.lock); +} + void mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk); void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk); diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index bea47a1180dc..1d4d84efe8f5 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1380,20 +1380,20 @@ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc, struct sockaddr_storage addr; int remote_id = remote->id; int local_id = loc->id; + int err = -ENOTCONN; struct socket *sf; struct sock *ssk; u32 remote_token; int addrlen; int ifindex; u8 flags; - int err; if (!mptcp_is_fully_established(sk)) - return -ENOTCONN; + goto err_out; err = mptcp_subflow_create_socket(sk, &sf); if (err) - return err; + goto err_out; ssk = sf->sk; subflow = mptcp_subflow_ctx(ssk); @@ -1456,6 +1456,12 @@ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc, failed: subflow->disposable = 1; sock_release(sf); + +err_out: + /* we account subflows before the creation, and this failures will not + * be caught by sk_state_change() + */ + mptcp_pm_close_subflow(msk); return err; } -- 2.35.1