From: Keith Busch <kbusch@kernel.org>
To: linux-nvme@lists.infradead.org
Cc: sagi@grimberg.me, bigeasy@linutronix.de, ming.lei@redhat.com,
Keith Busch <kbusch@kernel.org>,
tglx@linutronix.de, hch@lst.de
Subject: [PATCHv3 1/4] nvme/pci: Disable interrupts for threaded handler
Date: Tue, 10 Dec 2019 02:56:19 +0900 [thread overview]
Message-ID: <20191209175622.1964-2-kbusch@kernel.org> (raw)
In-Reply-To: <20191209175622.1964-1-kbusch@kernel.org>
The nvme driver had always left the device in a state capable of sending
more interrupts while completions were being handled in the thread.
Re-entering the primary handler disrupts the threaded handler since
they run on the same CPU. The primary handler may also be detected as
spurious when it returns IRQ_WAKE_THREAD if the threaded handler does
not finish frequently enough due to completing many requests.
Disable the irq to ensure the primary handler will not be re-entered while
the threaded handler is running. Use the nvme specific interrupt mask
set/clear registers for MSI and legacy, and rely on the irq_flow_handler
to mask the interrupt for MSIx.
Signed-off-by: Keith Busch <kbusch@kernel.org>
---
drivers/nvme/host/pci.c | 26 ++++++++++++++++++++++----
1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index 365a2ddbeaa7..a0138e3ca0b9 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -1036,12 +1036,30 @@ static irqreturn_t nvme_irq(int irq, void *data)
return ret;
}
+static irqreturn_t nvme_irq_thread(int irq, void *data)
+{
+ struct nvme_queue *nvmeq = data;
+ irqreturn_t ret = nvme_irq(irq, data);
+
+ if (!to_pci_dev(nvmeq->dev->dev)->msix_enabled)
+ writel(1 << nvmeq->cq_vector, nvmeq->dev->bar + NVME_REG_INTMC);
+
+ enable_irq(irq);
+ return ret;
+}
+
static irqreturn_t nvme_irq_check(int irq, void *data)
{
struct nvme_queue *nvmeq = data;
- if (nvme_cqe_pending(nvmeq))
- return IRQ_WAKE_THREAD;
- return IRQ_NONE;
+
+ if (!nvme_cqe_pending(nvmeq))
+ return IRQ_NONE;
+
+ if (!to_pci_dev(nvmeq->dev->dev)->msix_enabled)
+ writel(1 << nvmeq->cq_vector, nvmeq->dev->bar + NVME_REG_INTMS);
+
+ disable_irq_nosync(irq);
+ return IRQ_WAKE_THREAD;
}
/*
@@ -1499,7 +1517,7 @@ static int queue_request_irq(struct nvme_queue *nvmeq)
if (use_threaded_interrupts) {
return pci_request_irq(pdev, nvmeq->cq_vector, nvme_irq_check,
- nvme_irq, nvmeq, "nvme%dq%d", nr, nvmeq->qid);
+ nvme_irq_thread, nvmeq, "nvme%dq%d", nr, nvmeq->qid);
} else {
return pci_request_irq(pdev, nvmeq->cq_vector, nvme_irq,
NULL, nvmeq, "nvme%dq%d", nr, nvmeq->qid);
--
2.21.0
_______________________________________________
linux-nvme mailing list
linux-nvme@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-nvme
next prev parent reply other threads:[~2019-12-09 17:57 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-09 17:56 [PATCHv3 0/4] nvme pci interrupt handling improvements Keith Busch
2019-12-09 17:56 ` Keith Busch [this message]
2019-12-10 15:12 ` [PATCHv3 1/4] nvme/pci: Disable interrupts for threaded handler Daniel Wagner
2019-12-10 15:28 ` Sebastian Andrzej Siewior
2019-12-10 15:54 ` Keith Busch
2019-12-10 16:44 ` Daniel Wagner
2019-12-10 16:57 ` Keith Busch
2019-12-10 17:11 ` Daniel Wagner
2019-12-12 9:09 ` Christoph Hellwig
2019-12-12 15:53 ` Keith Busch
2019-12-09 17:56 ` [PATCHv3 2/4] nvme/pci: Complete commands from primary handler Keith Busch
2019-12-10 20:00 ` Sagi Grimberg
2019-12-10 20:25 ` Keith Busch
2019-12-10 21:14 ` Sagi Grimberg
2019-12-11 17:35 ` Keith Busch
2019-12-12 0:40 ` Sagi Grimberg
2019-12-12 1:02 ` Keith Busch
2019-12-12 22:55 ` Ming Lei
2019-12-12 23:30 ` Keith Busch
2019-12-13 0:52 ` Ming Lei
2019-12-12 9:14 ` Christoph Hellwig
2019-12-09 17:56 ` [PATCHv3 3/4] nvme/pci: Remove use_threaded_interrupts Keith Busch
2019-12-12 9:14 ` Christoph Hellwig
2019-12-12 15:45 ` Keith Busch
2019-12-18 7:29 ` Ming Lei
2019-12-18 15:50 ` Keith Busch
2019-12-19 1:10 ` Ming Lei
2019-12-09 17:56 ` [PATCHv3 4/4] nvme/pci: Poll threaded completions Keith Busch
2019-12-10 17:43 ` Daniel Wagner
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=20191209175622.1964-2-kbusch@kernel.org \
--to=kbusch@kernel.org \
--cc=bigeasy@linutronix.de \
--cc=hch@lst.de \
--cc=linux-nvme@lists.infradead.org \
--cc=ming.lei@redhat.com \
--cc=sagi@grimberg.me \
--cc=tglx@linutronix.de \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.