]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
nvme-pci: open-code polling logic in nvme_poll
authorSagi Grimberg <sagi@grimberg.me>
Sun, 18 Jun 2017 14:28:10 +0000 (17:28 +0300)
committerJens Axboe <axboe@kernel.dk>
Wed, 28 Jun 2017 14:14:13 +0000 (08:14 -0600)
Given that the code is simple enough it seems better
then passing a tag by reference for each call site, also
we can now get rid of __nvme_process_cq.

Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Keith Busch <keith.busch@intel.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/nvme/host/pci.c

index d309b6c90511ce0098d05560964e76c674f11f4d..2a9ee769ce9e47dc117bfd70f570c776de13ee26 100644 (file)
@@ -785,7 +785,7 @@ static inline bool nvme_read_cqe(struct nvme_queue *nvmeq,
        return false;
 }
 
-static void __nvme_process_cq(struct nvme_queue *nvmeq, int *tag)
+static void nvme_process_cq(struct nvme_queue *nvmeq)
 {
        struct nvme_completion cqe;
        int consumed = 0;
@@ -793,11 +793,6 @@ static void __nvme_process_cq(struct nvme_queue *nvmeq, int *tag)
        while (nvme_read_cqe(nvmeq, &cqe)) {
                nvme_handle_cqe(nvmeq, &cqe);
                consumed++;
-
-               if (tag && *tag == cqe.command_id) {
-                       *tag = -1;
-                       break;
-               }
        }
 
        if (consumed) {
@@ -806,11 +801,6 @@ static void __nvme_process_cq(struct nvme_queue *nvmeq, int *tag)
        }
 }
 
-static void nvme_process_cq(struct nvme_queue *nvmeq)
-{
-       __nvme_process_cq(nvmeq, NULL);
-}
-
 static irqreturn_t nvme_irq(int irq, void *data)
 {
        irqreturn_t result;
@@ -833,16 +823,28 @@ static irqreturn_t nvme_irq_check(int irq, void *data)
 
 static int __nvme_poll(struct nvme_queue *nvmeq, unsigned int tag)
 {
-       if (nvme_cqe_valid(nvmeq, nvmeq->cq_head, nvmeq->cq_phase)) {
-               spin_lock_irq(&nvmeq->q_lock);
-               __nvme_process_cq(nvmeq, &tag);
-               spin_unlock_irq(&nvmeq->q_lock);
+       struct nvme_completion cqe;
+       int found = 0, consumed = 0;
 
-               if (tag == -1)
-                       return 1;
-       }
+       if (!nvme_cqe_valid(nvmeq, nvmeq->cq_head, nvmeq->cq_phase))
+               return 0;
 
-       return 0;
+       spin_lock_irq(&nvmeq->q_lock);
+       while (nvme_read_cqe(nvmeq, &cqe)) {
+               nvme_handle_cqe(nvmeq, &cqe);
+               consumed++;
+
+               if (tag == cqe.command_id) {
+                       found = 1;
+                       break;
+               }
+       }
+
+       if (consumed)
+               nvme_ring_cq_doorbell(nvmeq);
+       spin_unlock_irq(&nvmeq->q_lock);
+
+       return found;
 }
 
 static int nvme_poll(struct blk_mq_hw_ctx *hctx, unsigned int tag)