From: keith.busch@intel.com (Keith Busch)
Subject: [PATCH v2] nvme: Suspend all queues before deletion
Date: Thu, 4 Aug 2016 17:07:53 -0400 [thread overview]
Message-ID: <20160804210752.GA7159@localhost.localdomain> (raw)
In-Reply-To: <87h9b2k3fl.fsf_-_@linux.vnet.ibm.com>
On Tue, Aug 02, 2016@11:10:38PM -0300, Gabriel Krisman Bertazi wrote:
> Yes, that approach seems to be ok. Please take the tested v2 below, in
> which I apply your suggestion, as well as clean up a bit the code in
> nvme_disable_io_queues and simplify the logic a bit.
The new patch looks good to me.
> -- >8 --
> Subject: [PATCH v2] nvme: Suspend all queues before deletion
>
> When nvme_delete_queue fails in the first pass of the
> nvme_disable_io_queues() loop, we return early, failing to suspend all
> of the IO queues. Later, on the nvme_pci_disable path, this causes us
> to disable MSI without actually having freed all the IRQs, which
> triggers the BUG_ON in free_msi_irqs(), as show below.
>
> This patch refactors nvme_disable_io_queues to suspend all queues before
> start submitting delete queue commands. This way, we ensure that we
> have at least returned every IRQ before continuing with the removal
> path.
>
> [ 487.529200] kernel BUG at ../drivers/pci/msi.c:368!
> cpu 0x46: Vector: 700 (Program Check) at [c0000078c5b83650]
> pc: c000000000627a50: free_msi_irqs+0x90/0x200
> lr: c000000000627a40: free_msi_irqs+0x80/0x200
> sp: c0000078c5b838d0
> msr: 9000000100029033
> current = 0xc0000078c5b40000
> paca = 0xc000000002bd7600 softe: 0 irq_happened: 0x01
> pid = 1376, comm = kworker/70:1H
> kernel BUG at ../drivers/pci/msi.c:368!
> Linux version 4.7.0.mainline+ (root at iod76) (gcc version 5.3.1 20160413
> (Ubuntu/IBM 5.3.1-14ubuntu2.1) ) #104 SMP Fri Jul 29 09:20:17 CDT 2016
> enter ? for help
> [c0000078c5b83920] d0000000363b0cd8 nvme_dev_disable+0x208/0x4f0 [nvme]
> [c0000078c5b83a10] d0000000363b12a4 nvme_timeout+0xe4/0x250 [nvme]
> [c0000078c5b83ad0] c0000000005690e4 blk_mq_rq_timed_out+0x64/0x110
> [c0000078c5b83b40] c00000000056c930 bt_for_each+0x160/0x170
> [c0000078c5b83bb0] c00000000056d928 blk_mq_queue_tag_busy_iter+0x78/0x110
> [c0000078c5b83c00] c0000000005675d8 blk_mq_timeout_work+0xd8/0x1b0
> [c0000078c5b83c50] c0000000000e8cf0 process_one_work+0x1e0/0x590
> [c0000078c5b83ce0] c0000000000e9148 worker_thread+0xa8/0x660
> [c0000078c5b83d80] c0000000000f2090 kthread+0x110/0x130
> [c0000078c5b83e30] c0000000000095f0 ret_from_kernel_thread+0x5c/0x6c
>
> Signed-off-by: Gabriel Krisman Bertazi <krisman at linux.vnet.ibm.com>
> Cc: Brian King <brking at linux.vnet.ibm.com>
> Cc: Keith Busch <keith.busch at intel.com>
> Cc: linux-nvme at lists.infradead.org
> ---
> drivers/nvme/host/pci.c | 20 ++++++++------------
> 1 file changed, 8 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
> index befac5b..cf38fe4 100644
> --- a/drivers/nvme/host/pci.c
> +++ b/drivers/nvme/host/pci.c
> @@ -1561,15 +1561,10 @@ static void nvme_disable_io_queues(struct nvme_dev *dev)
> reinit_completion(&dev->ioq_wait);
> retry:
> timeout = ADMIN_TIMEOUT;
> - for (; i > 0; i--) {
> - struct nvme_queue *nvmeq = dev->queues[i];
> -
> - if (!pass)
> - nvme_suspend_queue(nvmeq);
> - if (nvme_delete_queue(nvmeq, opcode))
> + for (; i > 0; i--, sent++)
> + if (nvme_delete_queue(dev->queues[i], opcode))
> break;
> - ++sent;
> - }
> +
> while (sent--) {
> timeout = wait_for_completion_io_timeout(&dev->ioq_wait, timeout);
> if (timeout == 0)
> @@ -1716,11 +1711,12 @@ static void nvme_dev_disable(struct nvme_dev *dev, bool shutdown)
> nvme_stop_queues(&dev->ctrl);
> csts = readl(dev->bar + NVME_REG_CSTS);
> }
> +
> + for (i = dev->queue_count - 1; i > 0; i--)
> + nvme_suspend_queue(dev->queues[i]);
> +
> if (csts & NVME_CSTS_CFS || !(csts & NVME_CSTS_RDY)) {
> - for (i = dev->queue_count - 1; i >= 0; i--) {
> - struct nvme_queue *nvmeq = dev->queues[i];
> - nvme_suspend_queue(nvmeq);
> - }
> + nvme_suspend_queue(dev->queues[0]);
> } else {
> nvme_disable_io_queues(dev);
> nvme_disable_admin_queue(dev, shutdown);
> --
> 2.7.4
next prev parent reply other threads:[~2016-08-04 21:07 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-29 17:15 [PATCH] nvme: Suspend all queues before deletion Gabriel Krisman Bertazi
2016-08-02 22:23 ` Keith Busch
2016-08-03 2:10 ` [PATCH v2] " Gabriel Krisman Bertazi
2016-08-04 21:07 ` Keith Busch [this message]
2016-08-11 12:53 ` Gabriel Krisman Bertazi
2016-08-11 15:34 ` Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160804210752.GA7159@localhost.localdomain \
--to=keith.busch@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).