Commit 5cf6cd5f authored by Jim Harris's avatar Jim Harris Committed by Konrad Sztyber
Browse files

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: default avatarJim Harris <james.r.harris@intel.com>
Change-Id: I53f336c6a11ff63782dc81c087a58feca0e8a5d7
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17873


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
parent 3fefff72
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -411,6 +411,8 @@ submit_single_io(struct perf_task *task)

	if (spdk_unlikely(rc != 0)) {
		fprintf(stderr, "starting I/O failed\n");
		spdk_dma_free(task->iov.iov_base);
		free(task);
	} else {
		ns_ctx->current_queue_depth++;
	}
@@ -537,7 +539,6 @@ work_fn(void *arg)
				ns_ctx->is_draining = true;
			}

			if (ns_ctx->current_queue_depth > 0) {
			check_io(ns_ctx);
			if (ns_ctx->current_queue_depth == 0) {
				nvme_cleanup_ns_worker_ctx(ns_ctx);
@@ -545,7 +546,6 @@ work_fn(void *arg)
				unfinished_ns_ctx++;
			}
		}
		}
	} while (unfinished_ns_ctx > 0);

	return 0;