examples/nvme: fix reconnect memory leaks

1) In submit_single_io(), if an I/O fails to submit,
   we need to free the associated task structure,
   otherwise it gets leaked.
2) When draining I/O, just always check_io() instead
   of only doing it when current_queue_depth > 0.
   This is the simplest of ensuring that we cleanup
   the ns_ctx (including freeing the IO qpairs and
   the qpair pointer array) if the current_queue_depth
   is already 0 when starting to drain.

Fixes issue #2995.

Signed-off-by: Jim Harris <james.r.harris@intel.com>
Change-Id: I53f336c6a11ff63782dc81c087a58feca0e8a5d7
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17873
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
This commit is contained in:
Jim Harris 2023-05-02 19:34:13 +00:00 committed by David Ko
parent 711b9ca207
commit 35a3cfd51e

View File

@ -411,6 +411,8 @@ submit_single_io(struct perf_task *task)
if (spdk_unlikely(rc != 0)) { if (spdk_unlikely(rc != 0)) {
fprintf(stderr, "starting I/O failed\n"); fprintf(stderr, "starting I/O failed\n");
spdk_dma_free(task->iov.iov_base);
free(task);
} else { } else {
ns_ctx->current_queue_depth++; ns_ctx->current_queue_depth++;
} }
@ -537,13 +539,11 @@ work_fn(void *arg)
ns_ctx->is_draining = true; ns_ctx->is_draining = true;
} }
if (ns_ctx->current_queue_depth > 0) { check_io(ns_ctx);
check_io(ns_ctx); if (ns_ctx->current_queue_depth == 0) {
if (ns_ctx->current_queue_depth == 0) { nvme_cleanup_ns_worker_ctx(ns_ctx);
nvme_cleanup_ns_worker_ctx(ns_ctx); } else {
} else { unfinished_ns_ctx++;
unfinished_ns_ctx++;
}
} }
} }
} while (unfinished_ns_ctx > 0); } while (unfinished_ns_ctx > 0);