mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 10:04:04 +02:00
nvme-pci: Simplify nvme_poll_irqdisable
The timeout handler can use the existing nvme_poll() if it needs to check a polled queue, allowing nvme_poll_irqdisable() to handle only irq driven queues for the remaining callers. Signed-off-by: Keith Busch <kbusch@kernel.org>
This commit is contained in:
parent
324b494c28
commit
fa059b856a
|
|
@ -1020,30 +1020,18 @@ static irqreturn_t nvme_irq_check(int irq, void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Poll for completions any queue, including those not dedicated to polling.
|
* Poll for completions for any interrupt driven queue
|
||||||
* Can be called from any context.
|
* Can be called from any context.
|
||||||
*/
|
*/
|
||||||
static int nvme_poll_irqdisable(struct nvme_queue *nvmeq)
|
static void nvme_poll_irqdisable(struct nvme_queue *nvmeq)
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = to_pci_dev(nvmeq->dev->dev);
|
struct pci_dev *pdev = to_pci_dev(nvmeq->dev->dev);
|
||||||
int found;
|
|
||||||
|
|
||||||
/*
|
WARN_ON_ONCE(test_bit(NVMEQ_POLLED, &nvmeq->flags));
|
||||||
* For a poll queue we need to protect against the polling thread
|
|
||||||
* using the CQ lock. For normal interrupt driven threads we have
|
|
||||||
* to disable the interrupt to avoid racing with it.
|
|
||||||
*/
|
|
||||||
if (test_bit(NVMEQ_POLLED, &nvmeq->flags)) {
|
|
||||||
spin_lock(&nvmeq->cq_poll_lock);
|
|
||||||
found = nvme_process_cq(nvmeq);
|
|
||||||
spin_unlock(&nvmeq->cq_poll_lock);
|
|
||||||
} else {
|
|
||||||
disable_irq(pci_irq_vector(pdev, nvmeq->cq_vector));
|
|
||||||
found = nvme_process_cq(nvmeq);
|
|
||||||
enable_irq(pci_irq_vector(pdev, nvmeq->cq_vector));
|
|
||||||
}
|
|
||||||
|
|
||||||
return found;
|
disable_irq(pci_irq_vector(pdev, nvmeq->cq_vector));
|
||||||
|
nvme_process_cq(nvmeq);
|
||||||
|
enable_irq(pci_irq_vector(pdev, nvmeq->cq_vector));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nvme_poll(struct blk_mq_hw_ctx *hctx)
|
static int nvme_poll(struct blk_mq_hw_ctx *hctx)
|
||||||
|
|
@ -1232,7 +1220,11 @@ static enum blk_eh_timer_return nvme_timeout(struct request *req, bool reserved)
|
||||||
/*
|
/*
|
||||||
* Did we miss an interrupt?
|
* Did we miss an interrupt?
|
||||||
*/
|
*/
|
||||||
nvme_poll_irqdisable(nvmeq);
|
if (test_bit(NVMEQ_POLLED, &nvmeq->flags))
|
||||||
|
nvme_poll(req->mq_hctx);
|
||||||
|
else
|
||||||
|
nvme_poll_irqdisable(nvmeq);
|
||||||
|
|
||||||
if (blk_mq_request_completed(req)) {
|
if (blk_mq_request_completed(req)) {
|
||||||
dev_warn(dev->ctrl.device,
|
dev_warn(dev->ctrl.device,
|
||||||
"I/O %d QID %d timeout, completion polled\n",
|
"I/O %d QID %d timeout, completion polled\n",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user