Received: by 2002:ac0:950c:0:0:0:0:0 with SMTP id f12csp2302548imc; Tue, 12 Mar 2019 10:58:17 -0700 (PDT) X-Google-Smtp-Source: APXvYqwbFFZtBSF8QjFnB1zyBTLWRFz6TdI6QtfCMOaHyH6Q8zwRMOJEtsAKi4K6yIskOmKOjlOC X-Received: by 2002:a65:4bcc:: with SMTP id p12mr15384995pgr.187.1552413497814; Tue, 12 Mar 2019 10:58:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1552413497; cv=none; d=google.com; s=arc-20160816; b=mq3gKWt8LimHRjrAj+DJGL4T2BBWrnnY/yDVHA1pAladV3qYvCbWtk2IO31vGbJZ6r xidBh30VfZ4Feo25opkREGgo2/q+QJGG8GrpzQwnYsytqbcp9IWcXYdE+NeLMTLND7Rz L66/lX8yUm+jpWjOj0UQY77LwzMVI/iQZxd9K9vZberd+acs3Nyc3SRin9LCNMext9i3 6JUh7bNI4JaXlAheBGmnrHpW+nfoBdO9hNtPRfC3C5H6W7OfwWw+vEmWI4z0Qhi7d7Yo kraVj7dkilimn7TT7RXhFsVdeqUCM/tmPTysPOop+kKBtSmNukYQL9AE/rzZLBgyN4pX l4cA== 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=Q07JWn82Y/ZfcLvroiK+GiBzUS9WUBNUCsIujnQ8xco=; b=WnOd/jdVDIFTAgAOvqXG/Q2A8/z+WNnL9fAV7LNrL4j+xjPrExlJAt1fJ3oDEUOBlx Jtp8yJwX/zskS/LePDOvYgGmkzNgofZrSyH+kTR4bHdP9Pou2gyY7eSooQ5PUkOloQVn 46f24kqDtlGeTtq1eOgz/4RSFuxPiyHTYSZ0D1QFa6H5IQhxSeDydHhhyFQFCo/o28ku OTGMhd+wj4JsZJVJRugWN6JObGHgWwxtYLbJSn+vYRVwjqjQ8givTHmbxQyJ615BJltJ x8lUnOefBWkQNKTIRv2c2W2qYHFK0uy26qghbWEwIl1PUsJ/F2sDCcWLXkwMtDKnKHRj LTeQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=H0lIBGg5; 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 i6si7785466pgq.423.2019.03.12.10.58.01; Tue, 12 Mar 2019 10:58:17 -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=H0lIBGg5; 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 S1728107AbfCLRNt (ORCPT + 99 others); Tue, 12 Mar 2019 13:13:49 -0400 Received: from mail.kernel.org ([198.145.29.99]:49744 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727846AbfCLRNP (ORCPT ); Tue, 12 Mar 2019 13:13:15 -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 B7AC3217D4; Tue, 12 Mar 2019 17:13:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1552410794; bh=jysny0CJvbkdU9dyemd/IHq1zGEhrE+kX6yxwDMZZxA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=H0lIBGg5juPD2jjSnHQ6SSd+LoCWdkE1PDOuj6DFJOBcC+jTzdqte4/k7U7p1gSJw qaZvbxlJ+LX6lL9+bUrbnR2ak6pQbDRw961mB+PILprESm3OUzT5wrTkb1oPNJOdjz 4a/hOzes06d1hpJqplJCYIF0BUttoCi0SV8jZfEw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Alex Gagniuc , Keith Busch , Alex Gagniuc , Christoph Hellwig , Sasha Levin Subject: [PATCH 4.20 140/171] nvme-pci: fix rapid add remove sequence Date: Tue, 12 Mar 2019 10:08:40 -0700 Message-Id: <20190312170359.715739642@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 5c959d73dba6495ec01d04c206ee679d61ccb2b0 ] A surprise removal may fail to tear down request queues if it is racing with the initial asynchronous probe. If that happens, the remove path won't see the queue resources to tear down, and the controller reset path may create a new request queue on a removed device, but will not be able to make forward progress, deadlocking the pci removal. Protect setting up non-blocking resources from a shutdown by holding the same mutex, and transition to the CONNECTING state after these resources are initialized so the probe path may see the dead controller state before dispatching new IO. Link: https://bugzilla.kernel.org/show_bug.cgi?id=202081 Reported-by: Alex Gagniuc Signed-off-by: Keith Busch Tested-by: Alex Gagniuc Signed-off-by: Christoph Hellwig Signed-off-by: Sasha Levin --- drivers/nvme/host/pci.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index c0d01048ce4d..439b9f4eb246 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -2280,16 +2280,7 @@ static void nvme_reset_work(struct work_struct *work) if (dev->ctrl.ctrl_config & NVME_CC_ENABLE) nvme_dev_disable(dev, false); - /* - * Introduce CONNECTING state from nvme-fc/rdma transports to mark the - * initializing procedure here. - */ - if (!nvme_change_ctrl_state(&dev->ctrl, NVME_CTRL_CONNECTING)) { - dev_warn(dev->ctrl.device, - "failed to mark controller CONNECTING\n"); - goto out; - } - + mutex_lock(&dev->shutdown_lock); result = nvme_pci_enable(dev); if (result) goto out; @@ -2308,6 +2299,17 @@ static void nvme_reset_work(struct work_struct *work) */ dev->ctrl.max_hw_sectors = NVME_MAX_KB_SZ << 1; dev->ctrl.max_segments = NVME_MAX_SEGS; + mutex_unlock(&dev->shutdown_lock); + + /* + * Introduce CONNECTING state from nvme-fc/rdma transports to mark the + * initializing procedure here. + */ + if (!nvme_change_ctrl_state(&dev->ctrl, NVME_CTRL_CONNECTING)) { + dev_warn(dev->ctrl.device, + "failed to mark controller CONNECTING\n"); + goto out; + } result = nvme_init_identify(&dev->ctrl); if (result) -- 2.19.1