From 5118878c37f0308bead9d30f1dd7cab16e9cc2a1 Mon Sep 17 00:00:00 2001 From: Changpeng Liu Date: Sun, 7 Feb 2021 23:26:29 +0800 Subject: [PATCH] nvmf/vfio-user: use stack variable for acq_map insert_queue() will copy it to internal data structure, so that before successful map we don't need to consider the error path. Change-Id: Id7ea2ef73da7914ea430ea568e7981657016d3f7 Signed-off-by: Changpeng Liu Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6310 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Jim Harris --- lib/nvmf/vfio_user.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/nvmf/vfio_user.c b/lib/nvmf/vfio_user.c index 549bafe77..d56323e58 100644 --- a/lib/nvmf/vfio_user.c +++ b/lib/nvmf/vfio_user.c @@ -417,13 +417,15 @@ insert_queue(struct nvmf_vfio_user_ctrlr *ctrlr, struct nvme_q *q, static int asq_map(struct nvmf_vfio_user_ctrlr *ctrlr) { - struct nvme_q q; - const struct spdk_nvmf_registers *regs = spdk_nvmf_ctrlr_get_regs(ctrlr->qp[0]->qpair.ctrlr); + struct nvme_q q = {}; + const struct spdk_nvmf_registers *regs; assert(ctrlr != NULL); + assert(ctrlr->qp[0] != NULL); assert(ctrlr->qp[0]->sq.addr == NULL); /* XXX ctrlr->asq == 0 is a valid memory address */ + regs = spdk_nvmf_ctrlr_get_regs(ctrlr->qp[0]->qpair.ctrlr); q.size = regs->aqa.bits.asqs + 1; q.head = ctrlr->doorbells[0] = 0; q.cqid = 0; @@ -490,30 +492,28 @@ cq_tail_advance(struct nvme_q *q) static int acq_map(struct nvmf_vfio_user_ctrlr *ctrlr) { - struct nvme_q *q; + struct nvme_q q = {}; const struct spdk_nvmf_registers *regs; assert(ctrlr != NULL); assert(ctrlr->qp[0] != NULL); assert(ctrlr->qp[0]->cq.addr == NULL); - q = &ctrlr->qp[0]->cq; regs = spdk_nvmf_ctrlr_get_regs(ctrlr->qp[0]->qpair.ctrlr); assert(regs != NULL); - assert(regs->acq != 0); - q->size = regs->aqa.bits.acqs + 1; - q->tail = 0; - q->addr = map_one(ctrlr->endpoint->vfu_ctx, regs->acq, - q->size * sizeof(struct spdk_nvme_cpl), &q->sg, &q->iov); - if (q->addr == NULL) { + q.size = regs->aqa.bits.acqs + 1; + q.tail = 0; + q.addr = map_one(ctrlr->endpoint->vfu_ctx, regs->acq, + q.size * sizeof(struct spdk_nvme_cpl), &q.sg, &q.iov); + if (q.addr == NULL) { SPDK_ERRLOG("Map ACQ failed, ACQ %"PRIx64", errno %d\n", regs->acq, errno); return -1; } - memset(q->addr, 0, q->size * sizeof(struct spdk_nvme_cpl)); - q->is_cq = true; - q->ien = true; - insert_queue(ctrlr, q, true, 0); + memset(q.addr, 0, q.size * sizeof(struct spdk_nvme_cpl)); + q.is_cq = true; + q.ien = true; + insert_queue(ctrlr, &q, true, 0); return 0; }