From c75dfb4201ba475dd454122c699544fc18c6c96e Mon Sep 17 00:00:00 2001 From: yidong0635 Date: Mon, 22 Jun 2020 05:05:01 -0400 Subject: [PATCH] nvme/perf: Free resources when abnormal exit. There are anbormal cases, from callocated nvme qpairs until connect io qpairs successfully . We should free these resources when abnormal exit, and codes just return there. Signed-off-by: yidong0635 Change-Id: I08de9c1fe1757a11a118ebedc326d81e2c68b077 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/2985 Tested-by: SPDK CI Jenkins Community-CI: Mellanox Build Bot Reviewed-by: Shuhei Matsumoto Reviewed-by: Changpeng Liu --- examples/nvme/perf/perf.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/examples/nvme/perf/perf.c b/examples/nvme/perf/perf.c index 6aecd0de4..2a36e9ee9 100644 --- a/examples/nvme/perf/perf.c +++ b/examples/nvme/perf/perf.c @@ -612,7 +612,7 @@ nvme_init_ns_worker_ctx(struct ns_worker_ctx *ns_ctx) ns_ctx->u.nvme.group = spdk_nvme_poll_group_create(NULL); if (ns_ctx->u.nvme.group == NULL) { - return -1; + goto poll_group_failed; } group = ns_ctx->u.nvme.group; @@ -622,21 +622,35 @@ nvme_init_ns_worker_ctx(struct ns_worker_ctx *ns_ctx) qpair = ns_ctx->u.nvme.qpair[i]; if (!qpair) { printf("ERROR: spdk_nvme_ctrlr_alloc_io_qpair failed\n"); - return -1; + goto qpair_failed; } if (spdk_nvme_poll_group_add(group, qpair)) { printf("ERROR: unable to add I/O qpair to poll group.\n"); - return -1; + spdk_nvme_ctrlr_free_io_qpair(qpair); + goto qpair_failed; } if (spdk_nvme_ctrlr_connect_io_qpair(entry->u.nvme.ctrlr, qpair)) { printf("ERROR: unable to connect I/O qpair.\n"); - return -1; + spdk_nvme_poll_group_remove(group, qpair); + spdk_nvme_ctrlr_free_io_qpair(qpair); + goto qpair_failed; } } return 0; + +qpair_failed: + for (; i > 0; --i) { + spdk_nvme_poll_group_remove(ns_ctx->u.nvme.group, ns_ctx->u.nvme.qpair[i - 1]); + spdk_nvme_ctrlr_free_io_qpair(ns_ctx->u.nvme.qpair[i - 1]); + } + + spdk_nvme_poll_group_destroy(ns_ctx->u.nvme.group); +poll_group_failed: + free(ns_ctx->u.nvme.qpair); + return -1; } static void