[PATCH] nvmet-rdma: recheck queue state is LIVE in state lock in recv done
Ruozhu Li
david.li at jaguarmicro.com
Mon Feb 10 19:45:43 PST 2025
The queue state checking in nvmet_rdma_recv_done is not in queue state
lock.Queue state can transfer to LIVE in cm establish handler between
state checking and state lock here, cause a silent drop of nvme connect
cmd.
Recheck queue state whether in LIVE state in state lock to prevent this
issue.
Signed-off-by: Ruozhu Li <david.li at jaguarmicro.com>
---
drivers/nvme/target/rdma.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/drivers/nvme/target/rdma.c b/drivers/nvme/target/rdma.c
index 1afd93026f9b..9f9e51fbfe49 100644
--- a/drivers/nvme/target/rdma.c
+++ b/drivers/nvme/target/rdma.c
@@ -1042,12 +1042,16 @@ static void nvmet_rdma_recv_done(struct ib_cq *cq, struct ib_wc *wc)
unsigned long flags;
spin_lock_irqsave(&queue->state_lock, flags);
- if (queue->state == NVMET_RDMA_Q_CONNECTING)
- list_add_tail(&rsp->wait_list, &queue->rsp_wait_list);
- else
- nvmet_rdma_put_rsp(rsp);
+ if (queue->state != NVMET_RDMA_Q_LIVE) {
+ if (queue->state == NVMET_RDMA_Q_CONNECTING)
+ list_add_tail(&rsp->wait_list, &queue->rsp_wait_list);
+ else
+ nvmet_rdma_put_rsp(rsp);
+
+ spin_unlock_irqrestore(&queue->state_lock, flags);
+ return;
+ }
spin_unlock_irqrestore(&queue->state_lock, flags);
- return;
}
nvmet_rdma_handle_command(queue, rsp);
--
2.43.0
More information about the Linux-nvme
mailing list