Received: by 2002:ab2:6991:0:b0:1f7:f6c3:9cb1 with SMTP id v17csp177169lqo; Tue, 7 May 2024 16:49:33 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCXPcsC2zK45EIxDSypopmcdekZBu6B9AKri7Cjt7X13nVwfH8DZgPz1nQLAgJCF+orYZEtvqzdAeCaoya9f40RNyzNOgN+sAfBwLvuGvw== X-Google-Smtp-Source: AGHT+IEeZRUFLyb2bXQBIJUaSPuzcRbqGP88nBM7IN+HCjIieXf9WyElZa2ySxxdl1HhG6GB2PiJ X-Received: by 2002:a50:9505:0:b0:572:a71e:b8fa with SMTP id 4fb4d7f45d1cf-5731d9d1b58mr859421a12.16.1715125772992; Tue, 07 May 2024 16:49:32 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1715125772; cv=pass; d=google.com; s=arc-20160816; b=fWvI37eaDhi04MbvTEonKT7RZWwEvm24n/sHHWGka//hHHjQ+ri7dj87nzV1VBj1ZL adNb8Umix97VfegB5kqK6mKEJeMko75Jwx99aWjkkVVti5tN6y++oN7jm+URba3h4NK7 3QaBEKfOs312M0cvvl8k/DzJBTXN7tEYRmAKH/4ZIEVl4krC+QaXMVIFZ3F9lHt4xVy/ 0KaM6LQNhicS5HW/cnP0FDL0+VmYStwE0II4a+44E1rsRgwsIj6fe6SpI5AWFDJl5xIy IT1eZ9QLkUitCpbgxOv+l5zZNu76v8+WbluirwjkZD0A4TgNDENlcDQj56cEjSLxQU9f PE/w== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=YzZx5vGA64jEjKBjseUs+M74lcCVh24eDRvumzjGYEU=; fh=wQltoHsUwAyQ0NGjRdaPW7tqDWGtR0H6oZS/FLNYGWQ=; b=RgwUNbar95vRBPdRHIeWq/Bmdt3RMPdLx2cfRNeVs5JEMaBUURzq13RxgkYZZZHJQv c5Woh66AG96DiEHOQ7TeaWlbhQVZ0HPC+JK8ID518HJyaTCQBMmFaeOvZ9hqylcMsfAM WsV6qkyttJ5wFAslZmiAqiDAEkGod49LVB00SYb+OyguM7/tKxDjwph0HY84YpC9i3lo zBzHUSqltZhIr2tfc/x7VY788tWhSFOZF1sJD3cQKHdGU66vPYnVaV47EUbD0vyVPc30 TXiyfgEoRF2Bjfc1v3o5egkUF48AJczcnEmq3LkWnfOliUEqFmRb+hng6GLrl9kj1RIq tm7Q==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=r2DyyH8w; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-172462-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-172462-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [2604:1380:4601:e00::3]) by mx.google.com with ESMTPS id u26-20020aa7d99a000000b005729dc2c49dsi6628896eds.198.2024.05.07.16.49.32 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 May 2024 16:49:32 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-172462-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) client-ip=2604:1380:4601:e00::3; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=r2DyyH8w; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-172462-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-172462-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org 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 am.mirrors.kernel.org (Postfix) with ESMTPS id B4FEC1F21F0A for ; Tue, 7 May 2024 23:49:32 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 897BF138490; Tue, 7 May 2024 23:13:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="r2DyyH8w" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 ADC291C9ED4; Tue, 7 May 2024 23:13:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715123601; cv=none; b=J0YwchCqljfngDkrCoO1z/c0Kk6w5KstL5uAUlB/9R+eSRschKMY3mXC1yGTeR6TpAZLGMW2ORMbHxVpLmX+axAxwwKdpvprMjEWdpHTdnkrV9e9HNDP3eZPuLvSqnFL0ulMghVu0xizkZP4FZEHi1dJhU1Xe9STSkRVH00WwiM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715123601; c=relaxed/simple; bh=HOFK1k5/G3H5LG+wE2AHumQWNVSavEuXqzk8rzQ3Irc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HAg1uRennCEXXeQ+Yxv5o23iqkDHP0vcGck7aI9DLe/GnTRjyGplphyNGwspzdeg3vPHvXF2TevnhkroO6QPLq8+VjhyVJmk/Gcd++iL3KHRLy3e+UuKstNoGttWkW5u0IPWnJnWVzLoa1QQtqevRySS5L+XLUaaOlbrmZYfMIY= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=r2DyyH8w; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 427CFC3277B; Tue, 7 May 2024 23:13:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1715123601; bh=HOFK1k5/G3H5LG+wE2AHumQWNVSavEuXqzk8rzQ3Irc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=r2DyyH8wtRKhSNcbpKzmnKN3v6WTYhJsBAhETEWZzDHYwv+qArb0owarFqfAD+JEm sYXCGlmdvJQZndemdPvebK4nV1ApDXLr7Aq4JnxrSkBn5G+LeV7ckBwGnt9e2t1SXP Lr2AX+R+6QVn5PWHbwMgrZLnpYicBZQZlEg1zGXQBplAT03QjjJraQwJ5ymsjEQw3n zYUrLUBeQRysQ+GJd6Kt6hhHZhu4L51J086tLCqPRuFzXhgW/0trGxIhr1ZKh4UnlC x+v/NU5IX1qq5YGOXiBTaqmIH5qye0laPTZopMdB3dEEMpTtnJT91gBn8YGBkNLFSt gFp3uFzcovbyQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Sagi Grimberg , Yi Zhang , Christoph Hellwig , Keith Busch , Sasha Levin , kch@nvidia.com, linux-nvme@lists.infradead.org Subject: [PATCH AUTOSEL 6.1 23/25] nvmet-tcp: fix possible memory leak when tearing down a controller Date: Tue, 7 May 2024 19:12:10 -0400 Message-ID: <20240507231231.394219-23-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240507231231.394219-1-sashal@kernel.org> References: <20240507231231.394219-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore X-stable-base: Linux 6.1.90 Content-Transfer-Encoding: 8bit From: Sagi Grimberg [ Upstream commit 6825bdde44340c5a9121f6d6fa25cc885bd9e821 ] When we teardown the controller, we wait for pending I/Os to complete (sq->ref on all queues to drop to zero) and then we go over the commands, and free their command buffers in case they are still fetching data from the host (e.g. processing nvme writes) and have yet to take a reference on the sq. However, we may miss the case where commands have failed before executing and are queued for sending a response, but will never occur because the queue socket is already down. In this case we may miss deallocating command buffers. Solve this by freeing all commands buffers as nvmet_tcp_free_cmd_buffers is idempotent anyways. Reported-by: Yi Zhang Tested-by: Yi Zhang Signed-off-by: Sagi Grimberg Reviewed-by: Christoph Hellwig Signed-off-by: Keith Busch Signed-off-by: Sasha Levin --- drivers/nvme/target/tcp.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c index 3480768274699..5556f55880411 100644 --- a/drivers/nvme/target/tcp.c +++ b/drivers/nvme/target/tcp.c @@ -297,6 +297,7 @@ static int nvmet_tcp_check_ddgst(struct nvmet_tcp_queue *queue, void *pdu) return 0; } +/* If cmd buffers are NULL, no operation is performed */ static void nvmet_tcp_free_cmd_buffers(struct nvmet_tcp_cmd *cmd) { kfree(cmd->iov); @@ -1437,13 +1438,9 @@ static void nvmet_tcp_free_cmd_data_in_buffers(struct nvmet_tcp_queue *queue) struct nvmet_tcp_cmd *cmd = queue->cmds; int i; - for (i = 0; i < queue->nr_cmds; i++, cmd++) { - if (nvmet_tcp_need_data_in(cmd)) - nvmet_tcp_free_cmd_buffers(cmd); - } - - if (!queue->nr_cmds && nvmet_tcp_need_data_in(&queue->connect)) - nvmet_tcp_free_cmd_buffers(&queue->connect); + for (i = 0; i < queue->nr_cmds; i++, cmd++) + nvmet_tcp_free_cmd_buffers(cmd); + nvmet_tcp_free_cmd_buffers(&queue->connect); } static void nvmet_tcp_release_queue_work(struct work_struct *w) -- 2.43.0