Commit 4df8ba86 authored by WangHaiLiang's avatar WangHaiLiang Committed by Jim Harris
Browse files

nvme/overhead: fix a memory leak issue



Fix issue #393.
The memory is not completely released, there are mutiple malloc
list, but only the last one is released. So I free all.

Change-Id: I14a583871811b54017728b6a7e92982cd75bd6b1
Signed-off-by: default avatarWangHaiLiang <hailiangx.e.wang@intel.com>
Reviewed-on: https://review.gerrithub.io/422682


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
parent b07d3bd2
Loading
Loading
Loading
Loading
+33 −14
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ struct ns_entry {
	bool			is_draining;
	uint32_t		current_queue_depth;
	char			name[1024];
	struct ns_entry		*next;

	struct spdk_histogram_data	*submit_histogram;
	struct spdk_histogram_data	*complete_histogram;
@@ -155,6 +156,7 @@ register_ns(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_ns *ns)

	snprintf(entry->name, 44, "%-20.20s (%-20.20s)", cdata->mn, cdata->sn);

	entry->next = g_ns;
	g_ns = entry;
}

@@ -173,6 +175,8 @@ register_ctrlr(struct spdk_nvme_ctrlr *ctrlr)
	snprintf(entry->name, sizeof(entry->name), "%-20.20s (%-20.20s)", cdata->mn, cdata->sn);

	entry->ctrlr = ctrlr;

	entry->next = g_ctrlr;
	g_ctrlr = entry;

	num_ns = spdk_nvme_ctrlr_get_num_ns(ctrlr);
@@ -627,6 +631,30 @@ register_controllers(void)
	return 0;
}

static void
cleanup(void)
{
	struct ns_entry *ns_entry = g_ns;
	struct ctrlr_entry *ctrlr_entry = g_ctrlr;

	while (ns_entry) {
		struct ns_entry *next = ns_entry->next;

		spdk_histogram_data_free(ns_entry->submit_histogram);
		spdk_histogram_data_free(ns_entry->complete_histogram);
		free(ns_entry);
		ns_entry = next;
	}

	while (ctrlr_entry) {
		struct ctrlr_entry *next = ctrlr_entry->next;

		spdk_nvme_detach(ctrlr_entry->ctrlr);
		free(ctrlr_entry);
		ctrlr_entry = next;
	}
}

int main(int argc, char **argv)
{
	int			rc;
@@ -664,15 +692,15 @@ int main(int argc, char **argv)
	if (g_aio_optind < argc) {
		printf("Measuring overhead for AIO device %s.\n", argv[g_aio_optind]);
		if (register_aio_file(argv[g_aio_optind]) != 0) {
			rc = -1;
			goto cleanup;
			cleanup();
			return -1;
		}
	} else
#endif
	{
		if (register_controllers() != 0) {
			rc = -1;
			goto cleanup;
			cleanup();
			return -1;
		}
	}

@@ -682,16 +710,7 @@ int main(int argc, char **argv)

	print_stats();

cleanup:
	if (g_ns) {
		spdk_histogram_data_free(g_ns->submit_histogram);
		spdk_histogram_data_free(g_ns->complete_histogram);
		free(g_ns);
	}
	if (g_ctrlr) {
		spdk_nvme_detach(g_ctrlr->ctrlr);
		free(g_ctrlr);
	}
	cleanup();

	if (rc != 0) {
		fprintf(stderr, "%s: errors occured\n", argv[0]);