Received: by 2002:a17:90a:9307:0:0:0:0 with SMTP id p7csp3962297pjo; Tue, 3 Mar 2020 10:09:25 -0800 (PST) X-Google-Smtp-Source: ADFU+vvhieZrGfnsiU/YNBv0Ct8ldJ7dnb6P1ynWzxbyJ+/F4semmXUErffsIgl42bq2yGhA5djp X-Received: by 2002:aca:db43:: with SMTP id s64mr3164119oig.144.1583258965619; Tue, 03 Mar 2020 10:09:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1583258965; cv=none; d=google.com; s=arc-20160816; b=M3tW/8Sx6IoSTxYK/Wa0utrJYkOTQPYexyzDEA94rXpjhBJT9xopXNdr3Y0twedaDT xpAyXEQyFowsqv8Ar/jdG2+jyMq8h1aehy23rfU8oI9B7HeFoccoik7ZBcksORrjd6HZ SLNBxaymTFpYi2UZYmqBT3S/Nrq4Jyocn397Tqj7seU8QPLE0CQZACS0z72O95icSxJr HTmIw7G/mMXQ3gEI/S2wUZYCV0iCWTW+HtPETCM8n9dzAfLZ/omkbjoCusz7v/bZsZqp oaGO9R2Z6TvdHF9L5MqqhHHwaDQbavVNsbmjvK88Z7UR8JwnEU5ChwW1toxgv7g/4o3G MWCw== 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=ZAPp5eqBKs+4D/yrCEGunHlZ0ovzU0NCTnDVE6mPJAY=; b=y7Zuzz4J3C8vMg0Ffj/rbw/gXs91GcUtbwf+qKx8nH/A0FNhvQ4qhb4VqmVMaV5V2m ldB4JhoxQAZum/chnxRxAnofkLfx3UHlf4h0pX1a5c7fx/uFOvMl5lWOlerc7q3m0vp+ QnemThuRKQAM+NTZQUUYaCedWwirSMF26w0jTR9c1dSbqjbMcqqxFR92hbBym6roC0im 3XXRSzOtqs9N3mtJizJCyUo3zERSyE3zAdqaeH0v+xOmW8ww1AtQBhJHkVMWG2VTGiXs sPCDzIxFVzY5Ph8uah6IojmrAuDpERdRaRnaZ2ahPnZTdrHTXlLELeTCDwjeSzLyEm5s 3BEg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="SD1ub3E/"; 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 g10si5719665otk.137.2020.03.03.10.09.12; Tue, 03 Mar 2020 10:09:25 -0800 (PST) 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="SD1ub3E/"; 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 S1732115AbgCCRzC (ORCPT + 99 others); Tue, 3 Mar 2020 12:55:02 -0500 Received: from mail.kernel.org ([198.145.29.99]:36216 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732603AbgCCRy4 (ORCPT ); Tue, 3 Mar 2020 12:54:56 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (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 96228214D8; Tue, 3 Mar 2020 17:54:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1583258095; bh=0floEeYV5OcdfQt5e4jA+XcdcYbsg8OUsbnx7OWpz4o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SD1ub3E/5j3wxK5wABZZLI5K4+JAxEutsDQezTweAA7zAW2D75wEUAp4NzhpMzLui oNZLb+vUsO8YTXObNpkeKOLv/cSuzMKSEH0LIsn4zJIyoX8nSVj3VObly5H9PCajRT co+TRAC/uPV7vnv0r2n46HPvqgs2NxEsXdN0MGNs= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Sagi Grimberg , Christoph Hellwig , Keith Busch , Jens Axboe , Sasha Levin Subject: [PATCH 5.4 069/152] nvme/pci: move cqe check after device shutdown Date: Tue, 3 Mar 2020 18:42:47 +0100 Message-Id: <20200303174310.299974528@linuxfoundation.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200303174302.523080016@linuxfoundation.org> References: <20200303174302.523080016@linuxfoundation.org> User-Agent: quilt/0.66 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 From: Keith Busch [ Upstream commit fa46c6fb5d61b1f17b06d7c6ef75478b576304c7 ] Many users have reported nvme triggered irq_startup() warnings during shutdown. The driver uses the nvme queue's irq to synchronize scanning for completions, and enabling an interrupt affined to only offline CPUs triggers the alarming warning. Move the final CQE check to after disabling the device and all registered interrupts have been torn down so that we do not have any IRQ to synchronize. Link: https://bugzilla.kernel.org/show_bug.cgi?id=206509 Reviewed-by: Sagi Grimberg Reviewed-by: Christoph Hellwig Signed-off-by: Keith Busch Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- drivers/nvme/host/pci.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index f34a56d588d31..ff2003c16be34 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -1407,6 +1407,23 @@ static void nvme_disable_admin_queue(struct nvme_dev *dev, bool shutdown) nvme_poll_irqdisable(nvmeq, -1); } +/* + * Called only on a device that has been disabled and after all other threads + * that can check this device's completion queues have synced. This is the + * last chance for the driver to see a natural completion before + * nvme_cancel_request() terminates all incomplete requests. + */ +static void nvme_reap_pending_cqes(struct nvme_dev *dev) +{ + u16 start, end; + int i; + + for (i = dev->ctrl.queue_count - 1; i > 0; i--) { + nvme_process_cq(&dev->queues[i], &start, &end, -1); + nvme_complete_cqes(&dev->queues[i], start, end); + } +} + static int nvme_cmb_qdepth(struct nvme_dev *dev, int nr_io_queues, int entry_size) { @@ -2241,11 +2258,6 @@ static bool __nvme_disable_io_queues(struct nvme_dev *dev, u8 opcode) if (timeout == 0) return false; - /* handle any remaining CQEs */ - if (opcode == nvme_admin_delete_cq && - !test_bit(NVMEQ_DELETE_ERROR, &nvmeq->flags)) - nvme_poll_irqdisable(nvmeq, -1); - sent--; if (nr_queues) goto retry; @@ -2434,6 +2446,7 @@ static void nvme_dev_disable(struct nvme_dev *dev, bool shutdown) nvme_suspend_io_queues(dev); nvme_suspend_queue(&dev->queues[0]); nvme_pci_disable(dev); + nvme_reap_pending_cqes(dev); blk_mq_tagset_busy_iter(&dev->tagset, nvme_cancel_request, &dev->ctrl); blk_mq_tagset_busy_iter(&dev->admin_tagset, nvme_cancel_request, &dev->ctrl); -- 2.20.1