From 945a2e7b766a7dc8f8c20595458e6186f2f82143 Mon Sep 17 00:00:00 2001 From: Changpeng Liu Date: Mon, 7 Feb 2022 17:20:18 +0800 Subject: [PATCH] nvmf/vfio-user: restore queue pair state and CQ reference count in destination VM The above values were added with shared CQ feature, and they are left when restore the CQs in destination VM. Change-Id: Ib1f28dad833da31e571eb2e2f0b5c81f0bf05a3b Signed-off-by: Changpeng Liu Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11419 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Aleksey Marchuk Reviewed-by: Jim Harris --- lib/nvmf/vfio_user.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/nvmf/vfio_user.c b/lib/nvmf/vfio_user.c index 1cde116b6..acd0c9f86 100644 --- a/lib/nvmf/vfio_user.c +++ b/lib/nvmf/vfio_user.c @@ -2532,13 +2532,14 @@ vfio_user_migr_ctrlr_construct_qps(struct nvmf_vfio_user_ctrlr *vu_ctrlr, uint16_t sqid, cqid; struct vfio_user_nvme_migr_qp migr_qp; void *addr; + uint32_t cqs_ref[NVMF_VFIO_USER_MAX_QPAIRS_PER_CTRLR] = {}; int ret; if (SPDK_DEBUGLOG_FLAG_ENABLED("nvmf_vfio")) { vfio_user_ctrlr_dump_migr_data("RESUME", migr_state); } - /* restore connected queue pairs */ + /* restore submission queues */ for (i = 0; i < NVMF_VFIO_USER_MAX_QPAIRS_PER_CTRLR; i++) { migr_qp = migr_state->qps[i]; @@ -2562,7 +2563,6 @@ vfio_user_migr_ctrlr_construct_qps(struct nvmf_vfio_user_ctrlr *vu_ctrlr, } sq = vu_ctrlr->sqs[sqid]; - sq->size = qsize; ret = alloc_sq_reqs(vu_ctrlr, sq); @@ -2572,6 +2572,7 @@ vfio_user_migr_ctrlr_construct_qps(struct nvmf_vfio_user_ctrlr *vu_ctrlr, } /* restore sq */ + sq->sq_state = VFIO_USER_SQ_CREATED; sq->cqid = migr_qp.sq.cqid; *sq_headp(sq) = migr_qp.sq.head; sq->mapping.prp1 = migr_qp.sq.dma_addr; @@ -2584,7 +2585,13 @@ vfio_user_migr_ctrlr_construct_qps(struct nvmf_vfio_user_ctrlr *vu_ctrlr, sqid, sq->mapping.prp1, sq->size); return -EFAULT; } + cqs_ref[sq->cqid]++; } + } + + /* restore completion queues */ + for (i = 0; i < NVMF_VFIO_USER_MAX_QPAIRS_PER_CTRLR; i++) { + migr_qp = migr_state->qps[i]; qsize = migr_qp.cq.size; if (qsize) { @@ -2607,6 +2614,8 @@ vfio_user_migr_ctrlr_construct_qps(struct nvmf_vfio_user_ctrlr *vu_ctrlr, cq->size = qsize; + cq->cq_state = VFIO_USER_CQ_CREATED; + cq->cq_ref = cqs_ref[cqid]; *cq_tailp(cq) = migr_qp.cq.tail; cq->mapping.prp1 = migr_qp.cq.dma_addr; cq->ien = migr_qp.cq.ien;