Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp383554pxx; Wed, 28 Oct 2020 07:10:27 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzOPIh/6rLnZP2gRIWVivkPqLRlbAB67FnZ3xMqp5M1xRQYG7x62qMV8Ad4nFD/d8crhMhx X-Received: by 2002:a50:f316:: with SMTP id p22mr8085629edm.201.1603894227176; Wed, 28 Oct 2020 07:10:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603894227; cv=none; d=google.com; s=arc-20160816; b=oJhEg3s1Ke3fpOCtRzbkqxTmGR0cMNbj3AP7txmlkTEdvi+DeZIWYIKxQx8M1Bd9zU QvVttQ3vA2mSzsX52TocdOdPpYarBkeeIAbI+09uzS0zbynjyoLJhmaZs2FWrSwbR7H9 CCfy/oBhL1XqV8ZWu3Sz1jVnJM3XoUdtUqOMJtUuCVarKp6DpOn3s2x6tU7NVPJ6y2ft yscdFsVAsaM8TO6pLwez7z11byGfrYSZLs8Vv7Dp0YCXcU4B/tGZEKdji9aWp9I06Jox +jAHut850nOzhu2pdd85dMy9HaBUqapMxxacfulnXUtZdOsLhAgOaZyvyKQtzyv+GXjy dR6w== 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=9UqEN5KXi/u0eGrIQlX2fnkETrBtjm4J1ZiRaAlBCLM=; b=IPBvH5aL/X4T4QoU6mnvL4SKDAM05vM3gNxMQ3wNau8hZ9z8ZaqjRQLJ5z7CY3JO8V 0rwStWw8Sf94CiXvznDMgLKbsroQVBpJEEbTgJ4b5BEjTDepmh/IEzSU1aLB6SW8fjEB DcOur7gaAsGE3snGZospBSU+/DShT3vOSWf89llXTWq1JZ+BRHFMlfN32yE562qV9Jm6 bGrOkr4o7MrsCA1fi72lnwgvYFVwWe2K2q5d6B5chZOEQ2L0AiTONQm4DsApn5ZIQjDX Up2CiPYc47rxovae8LBFT0ydmlui8TdZwkYDozJ/Cd/cxpdp1EPSDH1+kAVpAGXQTzkO fxwg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=NcqXUV99; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id dk22si2709939edb.258.2020.10.28.07.10.04; Wed, 28 Oct 2020 07:10:27 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=NcqXUV99; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1801056AbgJ0P5o (ORCPT + 99 others); Tue, 27 Oct 2020 11:57:44 -0400 Received: from mail.kernel.org ([198.145.29.99]:55798 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758183AbgJ0PS1 (ORCPT ); Tue, 27 Oct 2020 11:18:27 -0400 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 5D39020728; Tue, 27 Oct 2020 15:18:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1603811906; bh=bTbXeaSUUJjjNZ3irmxSRiAwKGJsYIbIChZWk9p/miQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NcqXUV99ga0/QLvuFXoxqu+U2trjn4rtfymYFoLyMIi/g2kT0p8aQc0JE7JdwQ0x6 iKzLoLw5zwmSubS+v/Qy9GiX6qmnfyg4QzxNFkgDNtG6EegaxHB6ErYvi4P8LeFFcU tV4+YdYVO5BzKGMKVTVEOLWHHPp2nWjULuc6aXyE= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Mat Martineau , Paolo Abeni , Jakub Kicinski Subject: [PATCH 5.9 007/757] mptcp: subflows garbage collection Date: Tue, 27 Oct 2020 14:44:17 +0100 Message-Id: <20201027135450.868591758@linuxfoundation.org> X-Mailer: git-send-email 2.29.1 In-Reply-To: <20201027135450.497324313@linuxfoundation.org> References: <20201027135450.497324313@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Paolo Abeni [ Upstream commit 0e4f35d7880157ceccf0a58377d778b02762af82 ] The msk can close MP_JOIN subflows if the initial handshake fails. Currently such subflows are kept alive in the conn_list until the msk itself is closed. Beyond the wasted memory, we could end-up sending the DATA_FIN and the DATA_FIN ack on such socket, even after a reset. Fixes: 43b54c6ee382 ("mptcp: Use full MPTCP-level disconnect state machine") Reviewed-by: Mat Martineau Signed-off-by: Paolo Abeni Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- net/mptcp/protocol.c | 17 +++++++++++++++++ net/mptcp/protocol.h | 1 + net/mptcp/subflow.c | 6 ++++++ 3 files changed, 24 insertions(+) --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1383,6 +1383,20 @@ static void pm_work(struct mptcp_sock *m spin_unlock_bh(&msk->pm.lock); } +static void __mptcp_close_subflow(struct mptcp_sock *msk) +{ + struct mptcp_subflow_context *subflow, *tmp; + + list_for_each_entry_safe(subflow, tmp, &msk->conn_list, node) { + struct sock *ssk = mptcp_subflow_tcp_sock(subflow); + + if (inet_sk_state_load(ssk) != TCP_CLOSE) + continue; + + __mptcp_close_ssk((struct sock *)msk, ssk, subflow, 0); + } +} + static void mptcp_worker(struct work_struct *work) { struct mptcp_sock *msk = container_of(work, struct mptcp_sock, work); @@ -1400,6 +1414,9 @@ static void mptcp_worker(struct work_str mptcp_clean_una(sk); mptcp_check_data_fin_ack(sk); __mptcp_flush_join_list(msk); + if (test_and_clear_bit(MPTCP_WORK_CLOSE_SUBFLOW, &msk->flags)) + __mptcp_close_subflow(msk); + __mptcp_move_skbs(msk); if (msk->pm.status) --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -90,6 +90,7 @@ #define MPTCP_WORK_RTX 2 #define MPTCP_WORK_EOF 3 #define MPTCP_FALLBACK_DONE 4 +#define MPTCP_WORK_CLOSE_SUBFLOW 5 struct mptcp_options_received { u64 sndr_key; --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -272,9 +272,15 @@ static bool subflow_thmac_valid(struct m void mptcp_subflow_reset(struct sock *ssk) { + struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); + struct sock *sk = subflow->conn; + tcp_set_state(ssk, TCP_CLOSE); tcp_send_active_reset(ssk, GFP_ATOMIC); tcp_done(ssk); + if (!test_and_set_bit(MPTCP_WORK_CLOSE_SUBFLOW, &mptcp_sk(sk)->flags) && + schedule_work(&mptcp_sk(sk)->work)) + sock_hold(sk); } static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb)