Received: by 2002:ac0:950c:0:0:0:0:0 with SMTP id f12csp2307341imc; Tue, 12 Mar 2019 11:03:42 -0700 (PDT) X-Google-Smtp-Source: APXvYqwFyY9zhHM+IUt8cTzj9Y6EZoSLzaMN6Pe0Y4CsapR4oXb/XN4vctJnI22f3javqa4aL8dM X-Received: by 2002:a63:9246:: with SMTP id s6mr35661151pgn.349.1552413822014; Tue, 12 Mar 2019 11:03:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1552413822; cv=none; d=google.com; s=arc-20160816; b=mSK7gM9bdwFhqM4CpaTY1I869Sug4ygaXBC3ftqm9W2UcKa+OqU5dgBj9jNerjwvky F9qagDCnkhP4Sd39j1PAazdLzLPOGZ1Wue54/EVQd3iFBt64aKxEdm9XthmDfucD45Hn Ea56bX2HKfTQxJHjt876zDj4Kfd47eYWcttNCWOsxKFjz6riaOk97IdM+33JkuT1Q3hQ voRS1cZWADIvF3pdV4S87vISmx/Ptsm4DWpe3UqzU+7CTUyTjo1DQfkBSUb+EmNQbhml Xe21M+5Ti++U/ndKUvdNIsI4QT0es1Mm100ul5xHC235+FzBWzwCzBkUOaVCGP+76y2O jOOA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=aMqPPOcm6i2hHgso/BZiGOqj23olqVzi1DvvLYND5FI=; b=zme8UXJB+ymaGc9K0z62IcDhvMiKXppmmSzzXbs2W2j/nBtm0UsXrSBG2s13fS1Sua ptv6tcDoTUnjtWUbdBchg7zIlsO+AxgIdLcC2qyXLUWmxEu9Eu40XbC2jIbD9u0FD5R7 eTwaV+V9uTojW3q1ilfHCP3yoI0LzMZ7WS4CT8jZRPvy/soWbyANGIC3uYtmF5SnX7V/ AhxDGUmr+cFHI2JBqUqG8Ld0VxXQhJOhHnpobNZde3MsSvnM7mpwkmnpMpf6TrEI/OVB 50aaWVXcwjRhPSS8e/ffziynVZCFU1gqy62jkudlEVGSCeCFq1Xdn5IaIAnWLC3M6gzL uDCg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ddaJ0yFa; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c5si6750402plr.243.2019.03.12.11.03.24; Tue, 12 Mar 2019 11:03:42 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ddaJ0yFa; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728156AbfCLSBK (ORCPT + 99 others); Tue, 12 Mar 2019 14:01:10 -0400 Received: from mail.kernel.org ([198.145.29.99]:49536 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727836AbfCLRNO (ORCPT ); Tue, 12 Mar 2019 13:13:14 -0400 Received: from localhost (unknown [104.133.8.98]) (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 0343B2173C; Tue, 12 Mar 2019 17:13:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1552410794; bh=0T1emm7mQBrnaGKqurFeEz9gj4zC4k9+L53L5pSrExk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ddaJ0yFa5hqgANOyJKPdIJhD5OdCzzNft0+4c4cIT+w5mnvs9a2C23Hp3bycKJikY N0Y14X8PzNFce7KfsNJVzvUdoV4ik6oDUOvgKiSmwOXi0CbD7ikY7uOG2nrbTV6s8a NS77bSXcglSNuhn1oJIXPTufBA806SHAI9hAQPFk= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Wen Xiong , Keith Busch , Chaitanya Kulkarni , Christoph Hellwig , Sasha Levin Subject: [PATCH 4.20 139/171] nvme: lock NS list changes while handling command effects Date: Tue, 12 Mar 2019 10:08:39 -0700 Message-Id: <20190312170359.636858395@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190312170347.868927101@linuxfoundation.org> References: <20190312170347.868927101@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.20-stable review patch. If anyone has any objections, please let me know. ------------------ [ Upstream commit e7ad43c3eda6a1690c4c3c341f95dc1c6898da83 ] If a controller supports the NS Change Notification, the namespace scan_work is automatically triggered after attaching a new namespace. Occasionally the namespace scan_work may append the new namespace to the list before the admin command effects handling is completed. The effects handling unfreezes namespaces, but if it unfreezes the newly attached namespace, its request_queue freeze depth will be off and we'll hit the warning in blk_mq_unfreeze_queue(). On the next namespace add, we will fail to freeze that queue due to the previous bad accounting and deadlock waiting for frozen. Fix that by preventing scan work from altering the namespace list while command effects handling needs to pair freeze with unfreeze. Reported-by: Wen Xiong Tested-by: Wen Xiong Signed-off-by: Keith Busch Reviewed-by: Chaitanya Kulkarni Signed-off-by: Christoph Hellwig Signed-off-by: Sasha Levin --- drivers/nvme/host/core.c | 8 +++++++- drivers/nvme/host/nvme.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 5f9a5ef93969..21d7b646c73d 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -1182,6 +1182,7 @@ static u32 nvme_passthru_start(struct nvme_ctrl *ctrl, struct nvme_ns *ns, * effects say only one namespace is affected. */ if (effects & (NVME_CMD_EFFECTS_LBCC | NVME_CMD_EFFECTS_CSE_MASK)) { + mutex_lock(&ctrl->scan_lock); nvme_start_freeze(ctrl); nvme_wait_freeze(ctrl); } @@ -1210,8 +1211,10 @@ static void nvme_passthru_end(struct nvme_ctrl *ctrl, u32 effects) */ if (effects & NVME_CMD_EFFECTS_LBCC) nvme_update_formats(ctrl); - if (effects & (NVME_CMD_EFFECTS_LBCC | NVME_CMD_EFFECTS_CSE_MASK)) + if (effects & (NVME_CMD_EFFECTS_LBCC | NVME_CMD_EFFECTS_CSE_MASK)) { nvme_unfreeze(ctrl); + mutex_unlock(&ctrl->scan_lock); + } if (effects & NVME_CMD_EFFECTS_CCC) nvme_init_identify(ctrl); if (effects & (NVME_CMD_EFFECTS_NIC | NVME_CMD_EFFECTS_NCC)) @@ -3300,6 +3303,7 @@ static void nvme_scan_work(struct work_struct *work) if (nvme_identify_ctrl(ctrl, &id)) return; + mutex_lock(&ctrl->scan_lock); nn = le32_to_cpu(id->nn); if (ctrl->vs >= NVME_VS(1, 1, 0) && !(ctrl->quirks & NVME_QUIRK_IDENTIFY_CNS)) { @@ -3308,6 +3312,7 @@ static void nvme_scan_work(struct work_struct *work) } nvme_scan_ns_sequential(ctrl, nn); out_free_id: + mutex_unlock(&ctrl->scan_lock); kfree(id); down_write(&ctrl->namespaces_rwsem); list_sort(NULL, &ctrl->namespaces, ns_cmp); @@ -3550,6 +3555,7 @@ int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct device *dev, ctrl->state = NVME_CTRL_NEW; spin_lock_init(&ctrl->lock); + mutex_init(&ctrl->scan_lock); INIT_LIST_HEAD(&ctrl->namespaces); init_rwsem(&ctrl->namespaces_rwsem); ctrl->dev = dev; diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 6ffa99a10a60..5274881f9141 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -153,6 +153,7 @@ struct nvme_ctrl { enum nvme_ctrl_state state; bool identified; spinlock_t lock; + struct mutex scan_lock; const struct nvme_ctrl_ops *ops; struct request_queue *admin_q; struct request_queue *connect_q; -- 2.19.1