|
Hannes Reinecke |
259ebb |
From: Keith Busch <kbusch@kernel.org>
|
|
Hannes Reinecke |
259ebb |
Date: Wed, 4 Mar 2020 09:17:01 -0800
|
|
Hannes Reinecke |
259ebb |
Subject: [PATCH] nvme-pci: Simplify nvme_poll_irqdisable
|
|
Hannes Reinecke |
259ebb |
Git-commit: fa059b856a593a7bddd4d3779ae8ab1380e05d91
|
|
Hannes Reinecke |
259ebb |
Patch-mainline: v5.7-rc1
|
|
Hannes Reinecke |
259ebb |
References: git-fixes
|
|
Hannes Reinecke |
259ebb |
|
|
Hannes Reinecke |
259ebb |
The timeout handler can use the existing nvme_poll() if it needs to
|
|
Hannes Reinecke |
259ebb |
check a polled queue, allowing nvme_poll_irqdisable() to handle only
|
|
Hannes Reinecke |
259ebb |
irq driven queues for the remaining callers.
|
|
Hannes Reinecke |
259ebb |
|
|
Hannes Reinecke |
259ebb |
Signed-off-by: Keith Busch <kbusch@kernel.org>
|
|
Hannes Reinecke |
259ebb |
Acked-by: Hannes Reinecke <hare@suse.com>
|
|
Hannes Reinecke |
259ebb |
---
|
|
Hannes Reinecke |
259ebb |
drivers/nvme/host/pci.c | 30 +++++++++++-------------------
|
|
Hannes Reinecke |
259ebb |
1 file changed, 11 insertions(+), 19 deletions(-)
|
|
Hannes Reinecke |
259ebb |
|
|
Hannes Reinecke |
259ebb |
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
|
|
Hannes Reinecke |
259ebb |
index 02f22c63adcf..f45e26e6af7e 100644
|
|
Hannes Reinecke |
259ebb |
--- a/drivers/nvme/host/pci.c
|
|
Hannes Reinecke |
259ebb |
+++ b/drivers/nvme/host/pci.c
|
|
Hannes Reinecke |
259ebb |
@@ -1020,30 +1020,18 @@ static irqreturn_t nvme_irq_check(int irq, void *data)
|
|
Hannes Reinecke |
259ebb |
}
|
|
Hannes Reinecke |
259ebb |
|
|
Hannes Reinecke |
259ebb |
/*
|
|
Hannes Reinecke |
259ebb |
- * Poll for completions any queue, including those not dedicated to polling.
|
|
Hannes Reinecke |
259ebb |
+ * Poll for completions for any interrupt driven queue
|
|
Hannes Reinecke |
259ebb |
* Can be called from any context.
|
|
Hannes Reinecke |
259ebb |
*/
|
|
Hannes Reinecke |
259ebb |
-static int nvme_poll_irqdisable(struct nvme_queue *nvmeq)
|
|
Hannes Reinecke |
259ebb |
+static void nvme_poll_irqdisable(struct nvme_queue *nvmeq)
|
|
Hannes Reinecke |
259ebb |
{
|
|
Hannes Reinecke |
259ebb |
struct pci_dev *pdev = to_pci_dev(nvmeq->dev->dev);
|
|
Hannes Reinecke |
259ebb |
- int found;
|
|
Hannes Reinecke |
259ebb |
|
|
Hannes Reinecke |
259ebb |
- /*
|
|
Hannes Reinecke |
259ebb |
- * For a poll queue we need to protect against the polling thread
|
|
Hannes Reinecke |
259ebb |
- * using the CQ lock. For normal interrupt driven threads we have
|
|
Hannes Reinecke |
259ebb |
- * to disable the interrupt to avoid racing with it.
|
|
Hannes Reinecke |
259ebb |
- */
|
|
Hannes Reinecke |
259ebb |
- if (test_bit(NVMEQ_POLLED, &nvmeq->flags)) {
|
|
Hannes Reinecke |
259ebb |
- spin_lock(&nvmeq->cq_poll_lock);
|
|
Hannes Reinecke |
259ebb |
- found = nvme_process_cq(nvmeq);
|
|
Hannes Reinecke |
259ebb |
- spin_unlock(&nvmeq->cq_poll_lock);
|
|
Hannes Reinecke |
259ebb |
- } else {
|
|
Hannes Reinecke |
259ebb |
- disable_irq(pci_irq_vector(pdev, nvmeq->cq_vector));
|
|
Hannes Reinecke |
259ebb |
- found = nvme_process_cq(nvmeq);
|
|
Hannes Reinecke |
259ebb |
- enable_irq(pci_irq_vector(pdev, nvmeq->cq_vector));
|
|
Hannes Reinecke |
259ebb |
- }
|
|
Hannes Reinecke |
259ebb |
+ WARN_ON_ONCE(test_bit(NVMEQ_POLLED, &nvmeq->flags));
|
|
Hannes Reinecke |
259ebb |
|
|
Hannes Reinecke |
259ebb |
- return found;
|
|
Hannes Reinecke |
259ebb |
+ disable_irq(pci_irq_vector(pdev, nvmeq->cq_vector));
|
|
Hannes Reinecke |
259ebb |
+ nvme_process_cq(nvmeq);
|
|
Hannes Reinecke |
259ebb |
+ enable_irq(pci_irq_vector(pdev, nvmeq->cq_vector));
|
|
Hannes Reinecke |
259ebb |
}
|
|
Hannes Reinecke |
259ebb |
|
|
Hannes Reinecke |
259ebb |
static int nvme_poll(struct blk_mq_hw_ctx *hctx)
|
|
Hannes Reinecke |
259ebb |
@@ -1232,7 +1220,11 @@ static enum blk_eh_timer_return nvme_timeout(struct request *req, bool reserved)
|
|
Hannes Reinecke |
259ebb |
/*
|
|
Hannes Reinecke |
259ebb |
* Did we miss an interrupt?
|
|
Hannes Reinecke |
259ebb |
*/
|
|
Hannes Reinecke |
259ebb |
- nvme_poll_irqdisable(nvmeq);
|
|
Hannes Reinecke |
259ebb |
+ if (test_bit(NVMEQ_POLLED, &nvmeq->flags))
|
|
Hannes Reinecke |
259ebb |
+ nvme_poll(req->mq_hctx);
|
|
Hannes Reinecke |
259ebb |
+ else
|
|
Hannes Reinecke |
259ebb |
+ nvme_poll_irqdisable(nvmeq);
|
|
Hannes Reinecke |
259ebb |
+
|
|
Hannes Reinecke |
259ebb |
if (blk_mq_request_completed(req)) {
|
|
Hannes Reinecke |
259ebb |
dev_warn(dev->ctrl.device,
|
|
Hannes Reinecke |
259ebb |
"I/O %d QID %d timeout, completion polled\n",
|
|
Hannes Reinecke |
259ebb |
--
|
|
Hannes Reinecke |
259ebb |
2.29.2
|
|
Hannes Reinecke |
259ebb |
|