Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

nvme-pci: open-code polling logic in nvme_poll

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>

authored by

Sagi Grimberg and committed by
Jens Axboe
442e19b7 920d13a8

+21 -19
+21 -19
drivers/nvme/host/pci.c
··· 785 785 return false; 786 786 } 787 787 788 - static void __nvme_process_cq(struct nvme_queue *nvmeq, int *tag) 788 + static void nvme_process_cq(struct nvme_queue *nvmeq) 789 789 { 790 790 struct nvme_completion cqe; 791 791 int consumed = 0; ··· 793 793 while (nvme_read_cqe(nvmeq, &cqe)) { 794 794 nvme_handle_cqe(nvmeq, &cqe); 795 795 consumed++; 796 - 797 - if (tag && *tag == cqe.command_id) { 798 - *tag = -1; 799 - break; 800 - } 801 796 } 802 797 803 798 if (consumed) { 804 799 nvme_ring_cq_doorbell(nvmeq); 805 800 nvmeq->cqe_seen = 1; 806 801 } 807 - } 808 - 809 - static void nvme_process_cq(struct nvme_queue *nvmeq) 810 - { 811 - __nvme_process_cq(nvmeq, NULL); 812 802 } 813 803 814 804 static irqreturn_t nvme_irq(int irq, void *data) ··· 823 833 824 834 static int __nvme_poll(struct nvme_queue *nvmeq, unsigned int tag) 825 835 { 826 - if (nvme_cqe_valid(nvmeq, nvmeq->cq_head, nvmeq->cq_phase)) { 827 - spin_lock_irq(&nvmeq->q_lock); 828 - __nvme_process_cq(nvmeq, &tag); 829 - spin_unlock_irq(&nvmeq->q_lock); 836 + struct nvme_completion cqe; 837 + int found = 0, consumed = 0; 830 838 831 - if (tag == -1) 832 - return 1; 833 - } 839 + if (!nvme_cqe_valid(nvmeq, nvmeq->cq_head, nvmeq->cq_phase)) 840 + return 0; 834 841 835 - return 0; 842 + spin_lock_irq(&nvmeq->q_lock); 843 + while (nvme_read_cqe(nvmeq, &cqe)) { 844 + nvme_handle_cqe(nvmeq, &cqe); 845 + consumed++; 846 + 847 + if (tag == cqe.command_id) { 848 + found = 1; 849 + break; 850 + } 851 + } 852 + 853 + if (consumed) 854 + nvme_ring_cq_doorbell(nvmeq); 855 + spin_unlock_irq(&nvmeq->q_lock); 856 + 857 + return found; 836 858 } 837 859 838 860 static int nvme_poll(struct blk_mq_hw_ctx *hctx, unsigned int tag)