|
Hannes Reinecke |
eb46a8 |
From: Keith Busch <kbusch@kernel.org>
|
|
Hannes Reinecke |
eb46a8 |
Date: Mon, 2 Mar 2020 08:45:04 -0800
|
|
Hannes Reinecke |
eb46a8 |
Subject: [PATCH] nvme-pci: Remove tag from process cq
|
|
Hannes Reinecke |
eb46a8 |
Git-commit: bf392a5dc02a9b796f3da89fc5bb42856aca64cb
|
|
Hannes Reinecke |
eb46a8 |
Patch-mainline: v5.7-rc1
|
|
Hannes Reinecke |
eb46a8 |
References: git-fixes
|
|
Hannes Reinecke |
eb46a8 |
|
|
Hannes Reinecke |
eb46a8 |
The only user for tagged completion was for timeout handling. That user,
|
|
Hannes Reinecke |
eb46a8 |
though, really only cares if the timed out command is completed, which
|
|
Hannes Reinecke |
eb46a8 |
we can safely check within the timeout handler.
|
|
Hannes Reinecke |
eb46a8 |
|
|
Hannes Reinecke |
eb46a8 |
Remove the tag check to simplify completion handling.
|
|
Hannes Reinecke |
eb46a8 |
|
|
Hannes Reinecke |
eb46a8 |
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
|
|
Hannes Reinecke |
eb46a8 |
Reviewed-by: Christoph Hellwig <hch@lst.de>
|
|
Hannes Reinecke |
eb46a8 |
Signed-off-by: Keith Busch <kbusch@kernel.org>
|
|
Hannes Reinecke |
eb46a8 |
Acked-by: Hannes Reinecke <hare@suse.com>
|
|
Hannes Reinecke |
eb46a8 |
---
|
|
Hannes Reinecke |
eb46a8 |
drivers/nvme/host/pci.c | 23 +++++++++++------------
|
|
Hannes Reinecke |
eb46a8 |
1 file changed, 11 insertions(+), 12 deletions(-)
|
|
Hannes Reinecke |
eb46a8 |
|
|
Hannes Reinecke |
eb46a8 |
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
|
|
Hannes Reinecke |
eb46a8 |
index cdc9b6149d38..98d8ddd7aa0f 100644
|
|
Hannes Reinecke |
eb46a8 |
--- a/drivers/nvme/host/pci.c
|
|
Hannes Reinecke |
eb46a8 |
+++ b/drivers/nvme/host/pci.c
|
|
Hannes Reinecke |
eb46a8 |
@@ -989,14 +989,13 @@ static inline void nvme_update_cq_head(struct nvme_queue *nvmeq)
|
|
Hannes Reinecke |
eb46a8 |
}
|
|
Hannes Reinecke |
eb46a8 |
|
|
Hannes Reinecke |
eb46a8 |
static inline int nvme_process_cq(struct nvme_queue *nvmeq, u16 *start,
|
|
Hannes Reinecke |
eb46a8 |
- u16 *end, unsigned int tag)
|
|
Hannes Reinecke |
eb46a8 |
+ u16 *end)
|
|
Hannes Reinecke |
eb46a8 |
{
|
|
Hannes Reinecke |
eb46a8 |
int found = 0;
|
|
Hannes Reinecke |
eb46a8 |
|
|
Hannes Reinecke |
eb46a8 |
*start = nvmeq->cq_head;
|
|
Hannes Reinecke |
eb46a8 |
while (nvme_cqe_pending(nvmeq)) {
|
|
Hannes Reinecke |
eb46a8 |
- if (tag == -1U || nvmeq->cqes[nvmeq->cq_head].command_id == tag)
|
|
Hannes Reinecke |
eb46a8 |
- found++;
|
|
Hannes Reinecke |
eb46a8 |
+ found++;
|
|
Hannes Reinecke |
eb46a8 |
nvme_update_cq_head(nvmeq);
|
|
Hannes Reinecke |
eb46a8 |
}
|
|
Hannes Reinecke |
eb46a8 |
*end = nvmeq->cq_head;
|
|
Hannes Reinecke |
eb46a8 |
@@ -1017,7 +1016,7 @@ static irqreturn_t nvme_irq(int irq, void *data)
|
|
Hannes Reinecke |
eb46a8 |
* the irq handler, even if that was on another CPU.
|
|
Hannes Reinecke |
eb46a8 |
*/
|
|
Hannes Reinecke |
eb46a8 |
rmb();
|
|
Hannes Reinecke |
eb46a8 |
- nvme_process_cq(nvmeq, &start, &end, -1);
|
|
Hannes Reinecke |
eb46a8 |
+ nvme_process_cq(nvmeq, &start, &end;;
|
|
Hannes Reinecke |
eb46a8 |
wmb();
|
|
Hannes Reinecke |
eb46a8 |
|
|
Hannes Reinecke |
eb46a8 |
if (start != end) {
|
|
Hannes Reinecke |
eb46a8 |
@@ -1040,7 +1039,7 @@ static irqreturn_t nvme_irq_check(int irq, void *data)
|
|
Hannes Reinecke |
eb46a8 |
* Poll for completions any queue, including those not dedicated to polling.
|
|
Hannes Reinecke |
eb46a8 |
* Can be called from any context.
|
|
Hannes Reinecke |
eb46a8 |
*/
|
|
Hannes Reinecke |
eb46a8 |
-static int nvme_poll_irqdisable(struct nvme_queue *nvmeq, unsigned int tag)
|
|
Hannes Reinecke |
eb46a8 |
+static int nvme_poll_irqdisable(struct nvme_queue *nvmeq)
|
|
Hannes Reinecke |
eb46a8 |
{
|
|
Hannes Reinecke |
eb46a8 |
struct pci_dev *pdev = to_pci_dev(nvmeq->dev->dev);
|
|
Hannes Reinecke |
eb46a8 |
u16 start, end;
|
|
Hannes Reinecke |
eb46a8 |
@@ -1053,11 +1052,11 @@ static int nvme_poll_irqdisable(struct nvme_queue *nvmeq, unsigned int tag)
|
|
Hannes Reinecke |
eb46a8 |
*/
|
|
Hannes Reinecke |
eb46a8 |
if (test_bit(NVMEQ_POLLED, &nvmeq->flags)) {
|
|
Hannes Reinecke |
eb46a8 |
spin_lock(&nvmeq->cq_poll_lock);
|
|
Hannes Reinecke |
eb46a8 |
- found = nvme_process_cq(nvmeq, &start, &end, tag);
|
|
Hannes Reinecke |
eb46a8 |
+ found = nvme_process_cq(nvmeq, &start, &end;;
|
|
Hannes Reinecke |
eb46a8 |
spin_unlock(&nvmeq->cq_poll_lock);
|
|
Hannes Reinecke |
eb46a8 |
} else {
|
|
Hannes Reinecke |
eb46a8 |
disable_irq(pci_irq_vector(pdev, nvmeq->cq_vector));
|
|
Hannes Reinecke |
eb46a8 |
- found = nvme_process_cq(nvmeq, &start, &end, tag);
|
|
Hannes Reinecke |
eb46a8 |
+ found = nvme_process_cq(nvmeq, &start, &end;;
|
|
Hannes Reinecke |
eb46a8 |
enable_irq(pci_irq_vector(pdev, nvmeq->cq_vector));
|
|
Hannes Reinecke |
eb46a8 |
}
|
|
Hannes Reinecke |
eb46a8 |
|
|
Hannes Reinecke |
eb46a8 |
@@ -1075,8 +1074,7 @@ static int nvme_poll(struct blk_mq_hw_ctx *hctx)
|
|
Hannes Reinecke |
eb46a8 |
return 0;
|
|
Hannes Reinecke |
eb46a8 |
|
|
Hannes Reinecke |
eb46a8 |
spin_lock(&nvmeq->cq_poll_lock);
|
|
Hannes Reinecke |
eb46a8 |
- found = nvme_process_cq(nvmeq, &start, &end, -1);
|
|
Hannes Reinecke |
eb46a8 |
- nvme_complete_cqes(nvmeq, start, end);
|
|
Hannes Reinecke |
eb46a8 |
+ found = nvme_process_cq(nvmeq, &start, &end;;
|
|
Hannes Reinecke |
eb46a8 |
spin_unlock(&nvmeq->cq_poll_lock);
|
|
Hannes Reinecke |
eb46a8 |
|
|
Hannes Reinecke |
eb46a8 |
return found;
|
|
Hannes Reinecke |
eb46a8 |
@@ -1253,7 +1251,8 @@ static enum blk_eh_timer_return nvme_timeout(struct request *req, bool reserved)
|
|
Hannes Reinecke |
eb46a8 |
/*
|
|
Hannes Reinecke |
eb46a8 |
* Did we miss an interrupt?
|
|
Hannes Reinecke |
eb46a8 |
*/
|
|
Hannes Reinecke |
eb46a8 |
- if (nvme_poll_irqdisable(nvmeq, req->tag)) {
|
|
Hannes Reinecke |
eb46a8 |
+ nvme_poll_irqdisable(nvmeq);
|
|
Hannes Reinecke |
eb46a8 |
+ if (blk_mq_request_completed(req)) {
|
|
Hannes Reinecke |
eb46a8 |
dev_warn(dev->ctrl.device,
|
|
Hannes Reinecke |
eb46a8 |
"I/O %d QID %d timeout, completion polled\n",
|
|
Hannes Reinecke |
eb46a8 |
req->tag, nvmeq->qid);
|
|
Hannes Reinecke |
eb46a8 |
@@ -1396,7 +1395,7 @@ static void nvme_disable_admin_queue(struct nvme_dev *dev, bool shutdown)
|
|
Hannes Reinecke |
eb46a8 |
else
|
|
Hannes Reinecke |
eb46a8 |
nvme_disable_ctrl(&dev->ctrl);
|
|
Hannes Reinecke |
eb46a8 |
|
|
Hannes Reinecke |
eb46a8 |
- nvme_poll_irqdisable(nvmeq, -1);
|
|
Hannes Reinecke |
eb46a8 |
+ nvme_poll_irqdisable(nvmeq);
|
|
Hannes Reinecke |
eb46a8 |
}
|
|
Hannes Reinecke |
eb46a8 |
|
|
Hannes Reinecke |
eb46a8 |
/*
|
|
Hannes Reinecke |
eb46a8 |
@@ -1411,7 +1410,7 @@ static void nvme_reap_pending_cqes(struct nvme_dev *dev)
|
|
Hannes Reinecke |
eb46a8 |
int i;
|
|
Hannes Reinecke |
eb46a8 |
|
|
Hannes Reinecke |
eb46a8 |
for (i = dev->ctrl.queue_count - 1; i > 0; i--) {
|
|
Hannes Reinecke |
eb46a8 |
- nvme_process_cq(&dev->queues[i], &start, &end, -1);
|
|
Hannes Reinecke |
eb46a8 |
+ nvme_process_cq(&dev->queues[i], &start, &end;;
|
|
Hannes Reinecke |
eb46a8 |
nvme_complete_cqes(&dev->queues[i], start, end);
|
|
Hannes Reinecke |
eb46a8 |
}
|
|
Hannes Reinecke |
eb46a8 |
}
|
|
Hannes Reinecke |
eb46a8 |
--
|
|
Hannes Reinecke |
eb46a8 |
2.29.2
|
|
Hannes Reinecke |
eb46a8 |
|