nvme: don't disable local ints for polled queue mq-maps
authorJens Axboe <axboe@kernel.dk>
Wed, 31 Oct 2018 19:18:49 +0000 (13:18 -0600)
committerJens Axboe <axboe@kernel.dk>
Wed, 7 Nov 2018 16:19:31 +0000 (09:19 -0700)
A polled queued doesn't trigger interrupts, so it's always safe
to grab the queue lock without disabling interrupts.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/nvme/host/pci.c

index 6aa86dfcb32c126376ee369d68b8e67412e4949a..341aeab24ccd6ec7aa13e1d885c1b6954037c9e0 100644 (file)
@@ -1061,15 +1061,26 @@ static irqreturn_t nvme_irq_check(int irq, void *data)
 
 static int __nvme_poll(struct nvme_queue *nvmeq, unsigned int tag)
 {
+       unsigned long __maybe_unused flags; /* gcc 7.x fail */
        u16 start, end;
-       bool found;
+       bool found, has_irq;
 
        if (!nvme_cqe_pending(nvmeq))
                return 0;
 
-       spin_lock_irq(&nvmeq->cq_lock);
+       /*
+        * Polled queue doesn't have an IRQ, no need to disable ints
+        */
+       has_irq = !nvmeq->polled;
+       if (has_irq)
+               local_irq_save(flags);
+
+       spin_lock(&nvmeq->cq_lock);
        found = nvme_process_cq(nvmeq, &start, &end, tag);
-       spin_unlock_irq(&nvmeq->cq_lock);
+       spin_unlock(&nvmeq->cq_lock);
+
+       if (has_irq)
+               local_irq_restore(flags);
 
        nvme_complete_cqes(nvmeq, start, end);
        return found;