nvmf: solve the memory leak issue caused by subsystem listerner port

The possible issue could be following if you shutdown NVMe-oF target
with TCP transport as an example,

=================================================================
==61022==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 560 byte(s) in 1 object(s) allocated from:
    #0 0x7ffff6efcfe0 in calloc (/lib64/libasan.so.3+0xc6fe0)
    #1 0x4c6216 in spdk_nvmf_tcp_listen /home/ziyeyang/spdk/lib/nvmf/tcp.c:680

Indirect leak of 48 byte(s) in 1 object(s) allocated from:
    #0 0x7ffff6efcfe0 in calloc (/lib64/libasan.so.3+0xc6fe0)
    #1 0x4a77b8 in spdk_posix_sock_create /home/ziyeyang/spdk/lib/sock/posix/posix.c:291

After checking the issue, it seems that we did not call
spdk_nvmf_transport_stop_listen when removing the subsystem listener.
And this patch can solve this issue.

Change-Id: Ic75d99cb0c6a3ba1c47ac79a2d8e3887b0f6b012
Signed-off-by: Ziye Yang <ziye.yang@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/447020
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: yidong0635 <dongx.yi@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Seth Howell <seth.howell5141@gmail.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Ziye Yang 2019-03-05 19:46:08 +08:00 committed by Ben Walker
parent d6c4518c69
commit 4cd6544d44
3 changed files with 27 additions and 4 deletions

View File

@ -308,6 +308,21 @@ _spdk_nvmf_subsystem_remove_host(struct spdk_nvmf_subsystem *subsystem, struct s
static int _spdk_nvmf_subsystem_remove_ns(struct spdk_nvmf_subsystem *subsystem, uint32_t nsid);
static void
_nvmf_subsystem_remove_listener(struct spdk_nvmf_subsystem *subsystem,
struct spdk_nvmf_listener *listener)
{
struct spdk_nvmf_transport *transport;
transport = spdk_nvmf_tgt_get_transport(subsystem->tgt, listener->trid.trtype);
if (transport != NULL) {
spdk_nvmf_transport_stop_listen(transport, &listener->trid);
}
TAILQ_REMOVE(&subsystem->listeners, listener, link);
free(listener);
}
void
spdk_nvmf_subsystem_destroy(struct spdk_nvmf_subsystem *subsystem)
{
@ -325,8 +340,7 @@ spdk_nvmf_subsystem_destroy(struct spdk_nvmf_subsystem *subsystem)
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "subsystem is %p\n", subsystem);
TAILQ_FOREACH_SAFE(listener, &subsystem->listeners, link, listener_tmp) {
TAILQ_REMOVE(&subsystem->listeners, listener, link);
free(listener);
_nvmf_subsystem_remove_listener(subsystem, listener);
}
TAILQ_FOREACH_SAFE(host, &subsystem->hosts, link, host_tmp) {
@ -779,8 +793,7 @@ spdk_nvmf_subsystem_remove_listener(struct spdk_nvmf_subsystem *subsystem,
return -ENOENT;
}
TAILQ_REMOVE(&subsystem->listeners, listener, link);
free(listener);
_nvmf_subsystem_remove_listener(subsystem, listener);
return 0;
}

View File

@ -48,6 +48,11 @@ DEFINE_STUB_V(spdk_bdev_module_release_bdev,
DEFINE_STUB(spdk_bdev_get_block_size, uint32_t,
(const struct spdk_bdev *bdev), 512);
DEFINE_STUB(spdk_nvmf_transport_stop_listen,
int,
(struct spdk_nvmf_transport *transport,
const struct spdk_nvme_transport_id *trid), 0);
uint32_t
spdk_env_get_current_core(void)
{

View File

@ -53,6 +53,11 @@ DEFINE_STUB_V(spdk_bdev_module_release_bdev,
DEFINE_STUB(spdk_bdev_get_block_size, uint32_t,
(const struct spdk_bdev *bdev), 512);
DEFINE_STUB(spdk_nvmf_transport_stop_listen,
int,
(struct spdk_nvmf_transport *transport,
const struct spdk_nvme_transport_id *trid), 0);
static void
subsystem_ns_remove_cb(struct spdk_nvmf_subsystem *subsystem, void *cb_arg, int status)
{