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: WangHaiLiang <hailiangx.e.wang@intel.com>
Reviewed-on: https://review.gerrithub.io/422682
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
WangHaiLiang 2018-08-17 21:37:53 +08:00 committed by Jim Harris
parent b07d3bd2bd
commit 4df8ba86f2

View File

@ -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]);