| From 1e640c6de543ad3457b7df736d7583b446a76d0c Mon Sep 17 00:00:00 2001 |
| From: Bijan Mottahedeh <bijan.mottahedeh@oracle.com> |
| Date: Wed, 26 Feb 2020 18:53:43 -0800 |
| Subject: [PATCH] nvme-pci: Hold cq_poll_lock while completing CQEs |
| |
| commit 9515743bfb39c61aaf3d4f3219a645c8d1fe9a0e upstream. |
| |
| Completions need to consumed in the same order the controller submitted |
| them, otherwise future completion entries may overwrite ones we haven't |
| handled yet. Hold the nvme queue's poll lock while completing new CQEs to |
| prevent another thread from freeing command tags for reuse out-of-order. |
| |
| Fixes: dabcefab45d3 ("nvme: provide optimized poll function for separate poll queues") |
| Signed-off-by: Bijan Mottahedeh <bijan.mottahedeh@oracle.com> |
| Reviewed-by: Sagi Grimberg <sagi@grimberg.me> |
| Reviewed-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Keith Busch <kbusch@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c |
| index 18c0588c5cd8..27eabb53cd00 100644 |
| --- a/drivers/nvme/host/pci.c |
| +++ b/drivers/nvme/host/pci.c |
| @@ -1097,9 +1097,9 @@ static int nvme_poll(struct blk_mq_hw_ctx *hctx) |
| |
| spin_lock(&nvmeq->cq_poll_lock); |
| found = nvme_process_cq(nvmeq, &start, &end, -1); |
| + nvme_complete_cqes(nvmeq, start, end); |
| spin_unlock(&nvmeq->cq_poll_lock); |
| |
| - nvme_complete_cqes(nvmeq, start, end); |
| return found; |
| } |
| |
| -- |
| 2.7.4 |
| |