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 <dongx.yi@intel.com>
Change-Id: I08de9c1fe1757a11a118ebedc326d81e2c68b077
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/2985
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
This commit is contained in:
yidong0635 2020-06-22 05:05:01 -04:00 committed by Tomasz Zawadzki
parent 4c156e6379
commit c75dfb4201

View File

@ -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); ns_ctx->u.nvme.group = spdk_nvme_poll_group_create(NULL);
if (ns_ctx->u.nvme.group == NULL) { if (ns_ctx->u.nvme.group == NULL) {
return -1; goto poll_group_failed;
} }
group = ns_ctx->u.nvme.group; 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]; qpair = ns_ctx->u.nvme.qpair[i];
if (!qpair) { if (!qpair) {
printf("ERROR: spdk_nvme_ctrlr_alloc_io_qpair failed\n"); printf("ERROR: spdk_nvme_ctrlr_alloc_io_qpair failed\n");
return -1; goto qpair_failed;
} }
if (spdk_nvme_poll_group_add(group, qpair)) { if (spdk_nvme_poll_group_add(group, qpair)) {
printf("ERROR: unable to add I/O qpair to poll group.\n"); 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)) { if (spdk_nvme_ctrlr_connect_io_qpair(entry->u.nvme.ctrlr, qpair)) {
printf("ERROR: unable to connect I/O qpair.\n"); 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; 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 static void