nvmf/fc: Use connection list hash table.

Currently we are iterating over a hwqp connection list for every
IO command received. With high load of connections, this is causing
penalty. Use hash table for connection lookup based on connection ID
and also RPI identifier.

Signed-off-by: Naresh Gottumukkala <raju.gottumukkala@broadcom.com>
Change-Id: I857e299722a0b72b25b0dbfe646d446ad98b7c76
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5688
Community-CI: Broadcom CI
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Naresh Gottumukkala 2020-12-23 11:56:59 +00:00 committed by Jim Harris
parent 7c9a81a2b6
commit b50c6bc2d9
8 changed files with 210 additions and 85 deletions

View File

@ -64,7 +64,7 @@ endif
ifeq ($(CONFIG_FC),y)
C_SRCS += fc.c fc_ls.c
CFLAGS += -I$(CURDIR)
CFLAGS += -I$(CURDIR) $(ENV_CFLAGS)
ifneq ($(strip $(CONFIG_FC_PATH)),)
CFLAGS += -I$(CONFIG_FC_PATH)
endif

View File

@ -106,6 +106,9 @@ static char *fc_req_state_strs[] = {
#define TRACE_FC_REQ_BDEV_ABORTED SPDK_TPOINT_ID(TRACE_GROUP_NVMF_FC, 0x0E)
#define TRACE_FC_REQ_PENDING SPDK_TPOINT_ID(TRACE_GROUP_NVMF_FC, 0x0F)
#define HWQP_CONN_TABLE_SIZE 8192
#define HWQP_RPI_TABLE_SIZE 4096
SPDK_TRACE_REGISTER_FN(nvmf_fc_trace, "nvmf_fc", TRACE_GROUP_NVMF_FC)
{
spdk_trace_register_object(OBJECT_NVMF_FC_IO, 'r');
@ -306,6 +309,18 @@ nvmf_fc_record_req_trace_point(struct spdk_nvmf_fc_request *fc_req,
}
}
static struct rte_hash *
nvmf_fc_create_hash_table(const char *name, size_t num_entries, size_t key_len)
{
struct rte_hash_parameters hash_params = { 0 };
hash_params.entries = num_entries;
hash_params.key_len = key_len;
hash_params.name = name;
return rte_hash_create(&hash_params);
}
static void
nvmf_fc_handle_connection_failure(void *arg)
{
@ -420,20 +435,6 @@ nvmf_fc_conn_free_fc_request(struct spdk_nvmf_fc_conn *fc_conn, struct spdk_nvmf
fc_conn->pool_free_elems += 1;
}
struct spdk_nvmf_fc_conn *
nvmf_fc_hwqp_find_fc_conn(struct spdk_nvmf_fc_hwqp *hwqp, uint64_t conn_id)
{
struct spdk_nvmf_fc_conn *fc_conn;
TAILQ_FOREACH(fc_conn, &hwqp->connection_list, link) {
if (fc_conn->conn_id == conn_id) {
return fc_conn;
}
}
return NULL;
}
static inline void
nvmf_fc_request_remove_from_pending(struct spdk_nvmf_fc_request *fc_req)
{
@ -441,21 +442,39 @@ nvmf_fc_request_remove_from_pending(struct spdk_nvmf_fc_request *fc_req)
spdk_nvmf_request, buf_link);
}
void
int
nvmf_fc_init_hwqp(struct spdk_nvmf_fc_port *fc_port, struct spdk_nvmf_fc_hwqp *hwqp)
{
char name[64];
hwqp->fc_port = fc_port;
/* clear counters */
memset(&hwqp->counters, 0, sizeof(struct spdk_nvmf_fc_errors));
TAILQ_INIT(&hwqp->in_use_reqs);
TAILQ_INIT(&hwqp->connection_list);
TAILQ_INIT(&hwqp->sync_cbs);
TAILQ_INIT(&hwqp->ls_pending_queue);
snprintf(name, sizeof(name), "nvmf_fc_conn_hash:%d-%d", fc_port->port_hdl, hwqp->hwqp_id);
hwqp->connection_list_hash = nvmf_fc_create_hash_table(name, HWQP_CONN_TABLE_SIZE,
sizeof(uint64_t));
if (!hwqp->connection_list_hash) {
SPDK_ERRLOG("Failed to create connection hash table.\n");
return -ENOMEM;
}
snprintf(name, sizeof(name), "nvmf_fc_rpi_hash:%d-%d", fc_port->port_hdl, hwqp->hwqp_id);
hwqp->rport_list_hash = nvmf_fc_create_hash_table(name, HWQP_RPI_TABLE_SIZE, sizeof(uint16_t));
if (!hwqp->rport_list_hash) {
SPDK_ERRLOG("Failed to create rpi hash table.\n");
rte_hash_free(hwqp->connection_list_hash);
return -ENOMEM;
}
/* Init low level driver queues */
nvmf_fc_init_q(hwqp);
return 0;
}
static struct spdk_nvmf_fc_poll_group *
@ -1339,9 +1358,8 @@ nvmf_fc_hwqp_handle_request(struct spdk_nvmf_fc_hwqp *hwqp, struct spdk_nvmf_fc_
rqst_conn_id = from_be64(&cmd_iu->conn_id);
/* Check if conn id is valid */
fc_conn = nvmf_fc_hwqp_find_fc_conn(hwqp, rqst_conn_id);
if (!fc_conn) {
if (rte_hash_lookup_data(hwqp->connection_list_hash,
(void *)&rqst_conn_id, (void **)&fc_conn) < 0) {
SPDK_ERRLOG("IU CMD conn(%ld) invalid\n", rqst_conn_id);
hwqp->counters.invalid_conn_err++;
return -ENODEV;
@ -2144,6 +2162,7 @@ static int
nvmf_fc_adm_hw_port_data_init(struct spdk_nvmf_fc_port *fc_port,
struct spdk_nvmf_fc_hw_port_init_args *args)
{
int rc = 0;
/* Used a high number for the LS HWQP so that it does not clash with the
* IO HWQP's and immediately shows a LS queue during tracing.
*/
@ -2169,7 +2188,10 @@ nvmf_fc_adm_hw_port_data_init(struct spdk_nvmf_fc_port *fc_port,
/*
* Initialize the LS queue.
*/
nvmf_fc_init_hwqp(fc_port, &fc_port->ls_queue);
rc = nvmf_fc_init_hwqp(fc_port, &fc_port->ls_queue);
if (rc) {
return rc;
}
/*
* Initialize the IO queues.
@ -2178,7 +2200,16 @@ nvmf_fc_adm_hw_port_data_init(struct spdk_nvmf_fc_port *fc_port,
struct spdk_nvmf_fc_hwqp *hwqp = &fc_port->io_queues[i];
hwqp->hwqp_id = i;
hwqp->queues = args->io_queues[i];
nvmf_fc_init_hwqp(fc_port, hwqp);
rc = nvmf_fc_init_hwqp(fc_port, hwqp);
if (rc) {
for (; i > 0; --i) {
rte_hash_free(fc_port->io_queues[i - 1].connection_list_hash);
rte_hash_free(fc_port->io_queues[i - 1].rport_list_hash);
}
rte_hash_free(fc_port->ls_queue.connection_list_hash);
rte_hash_free(fc_port->ls_queue.rport_list_hash);
return rc;
}
}
/*

View File

@ -1300,29 +1300,122 @@ nvmf_fc_poller_api_perform_cb(struct spdk_nvmf_fc_poller_api_cb_info *cb_info,
}
}
static int
nvmf_fc_poller_add_conn_lookup_data(struct spdk_nvmf_fc_hwqp *hwqp,
struct spdk_nvmf_fc_conn *fc_conn)
{
int rc = -1;
struct spdk_nvmf_fc_hwqp_rport *rport = NULL;
/* Add connection based lookup entry. */
rc = rte_hash_add_key_data(hwqp->connection_list_hash,
(void *)&fc_conn->conn_id, (void *)fc_conn);
if (rc < 0) {
SPDK_ERRLOG("Failed to add connection hash entry\n");
return rc;
}
/* RPI based lookup */
if (rte_hash_lookup_data(hwqp->rport_list_hash, (void *)&fc_conn->rpi, (void **)&rport) < 0) {
rport = calloc(1, sizeof(struct spdk_nvmf_fc_hwqp_rport));
if (!rport) {
SPDK_ERRLOG("Failed to allocate rport entry\n");
rc = -ENOMEM;
goto del_conn_hash;
}
/* Add rport table entry */
rc = rte_hash_add_key_data(hwqp->rport_list_hash,
(void *)&fc_conn->rpi, (void *)rport);
if (rc < 0) {
SPDK_ERRLOG("Failed to add rport hash entry\n");
goto del_rport;
}
TAILQ_INIT(&rport->conn_list);
}
/* Add to rport conn list */
TAILQ_INSERT_TAIL(&rport->conn_list, fc_conn, rport_link);
return 0;
del_rport:
free(rport);
del_conn_hash:
rte_hash_del_key(hwqp->connection_list_hash, (void *)&fc_conn->conn_id);
return rc;
}
static void
nvmf_fc_poller_del_conn_lookup_data(struct spdk_nvmf_fc_hwqp *hwqp,
struct spdk_nvmf_fc_conn *fc_conn)
{
struct spdk_nvmf_fc_hwqp_rport *rport = NULL;
if (rte_hash_del_key(hwqp->connection_list_hash, (void *)&fc_conn->conn_id) < 0) {
SPDK_ERRLOG("Failed to del connection(%lx) hash entry\n",
fc_conn->conn_id);
}
if (rte_hash_lookup_data(hwqp->rport_list_hash, (void *)&fc_conn->rpi, (void **)&rport) >= 0) {
TAILQ_REMOVE(&rport->conn_list, fc_conn, rport_link);
/* If last conn del rpi hash */
if (TAILQ_EMPTY(&rport->conn_list)) {
if (rte_hash_del_key(hwqp->rport_list_hash, (void *)&fc_conn->rpi) < 0) {
SPDK_ERRLOG("Failed to del rpi(%lx) hash entry\n",
fc_conn->conn_id);
}
free(rport);
}
} else {
SPDK_ERRLOG("RPI(%d) hash entry not found\n", fc_conn->rpi);
}
}
static struct spdk_nvmf_fc_request *
nvmf_fc_poller_rpi_find_req(struct spdk_nvmf_fc_hwqp *hwqp, uint16_t rpi, uint16_t oxid)
{
struct spdk_nvmf_fc_request *fc_req = NULL;
struct spdk_nvmf_fc_conn *fc_conn;
struct spdk_nvmf_fc_hwqp_rport *rport = NULL;
if (rte_hash_lookup_data(hwqp->rport_list_hash, (void *)&rpi, (void **)&rport) >= 0) {
TAILQ_FOREACH(fc_conn, &rport->conn_list, rport_link) {
TAILQ_FOREACH(fc_req, &fc_conn->in_use_reqs, conn_link) {
if (fc_req->oxid == oxid) {
return fc_req;
}
}
}
}
return NULL;
}
static void
nvmf_fc_poller_api_add_connection(void *arg)
{
enum spdk_nvmf_fc_poller_api_ret ret = SPDK_NVMF_FC_POLLER_API_SUCCESS;
struct spdk_nvmf_fc_poller_api_add_connection_args *conn_args =
(struct spdk_nvmf_fc_poller_api_add_connection_args *)arg;
struct spdk_nvmf_fc_conn *fc_conn;
struct spdk_nvmf_fc_conn *fc_conn = conn_args->fc_conn, *tmp;
SPDK_DEBUGLOG(nvmf_fc_poller_api, "Poller add connection, conn_id 0x%lx\n",
conn_args->fc_conn->conn_id);
fc_conn->conn_id);
/* make sure connection is not already in poller's list */
fc_conn = nvmf_fc_hwqp_find_fc_conn(conn_args->fc_conn->hwqp,
conn_args->fc_conn->conn_id);
if (fc_conn) {
if (rte_hash_lookup_data(fc_conn->hwqp->connection_list_hash,
(void *)&fc_conn->conn_id, (void **)&tmp) >= 0) {
SPDK_ERRLOG("duplicate connection found");
ret = SPDK_NVMF_FC_POLLER_API_DUP_CONN_ID;
} else {
SPDK_DEBUGLOG(nvmf_fc_poller_api,
"conn_id=%lx", fc_conn->conn_id);
TAILQ_INSERT_TAIL(&conn_args->fc_conn->hwqp->connection_list,
conn_args->fc_conn, link);
conn_args->fc_conn->hwqp->num_conns++;
if (nvmf_fc_poller_add_conn_lookup_data(fc_conn->hwqp, fc_conn)) {
SPDK_ERRLOG("Failed to add connection 0x%lx\n", fc_conn->conn_id);
ret = SPDK_NVMF_FC_POLLER_API_ERROR;
} else {
SPDK_DEBUGLOG(nvmf_fc_poller_api, "conn_id=%lx", fc_conn->conn_id);
fc_conn->hwqp->num_conns++;
}
}
/* perform callback */
@ -1386,17 +1479,19 @@ nvmf_fc_poller_conn_abort_done(void *hwqp, int32_t status, void *cb_args)
}
if (!conn_args->fc_request_cnt) {
if (!TAILQ_EMPTY(&conn_args->hwqp->connection_list)) {
/* All the requests for this connection are aborted. */
TAILQ_REMOVE(&conn_args->hwqp->connection_list, conn_args->fc_conn, link);
conn_args->fc_conn->hwqp->num_conns--;
struct spdk_nvmf_fc_conn *fc_conn = conn_args->fc_conn, *tmp;
SPDK_DEBUGLOG(nvmf_fc_poller_api, "Connection deleted, conn_id 0x%lx\n",
conn_args->fc_conn->conn_id);
if (rte_hash_lookup_data(conn_args->hwqp->connection_list_hash,
(void *)&fc_conn->conn_id, (void *)&tmp) >= 0) {
/* All the requests for this connection are aborted. */
nvmf_fc_poller_del_conn_lookup_data(conn_args->hwqp, fc_conn);
fc_conn->hwqp->num_conns--;
SPDK_DEBUGLOG(nvmf_fc_poller_api, "Connection deleted, conn_id 0x%lx\n", fc_conn->conn_id);
if (!conn_args->backend_initiated) {
/* disconnect qpair from nvmf controller */
spdk_nvmf_qpair_disconnect(&conn_args->fc_conn->qpair,
spdk_nvmf_qpair_disconnect(&fc_conn->qpair,
nvmf_fc_disconnect_qpair_cb, &conn_args->cb_info);
}
} else {
@ -1417,7 +1512,7 @@ nvmf_fc_poller_api_del_connection(void *arg)
{
struct spdk_nvmf_fc_poller_api_del_connection_args *conn_args =
(struct spdk_nvmf_fc_poller_api_del_connection_args *)arg;
struct spdk_nvmf_fc_conn *fc_conn = conn_args->fc_conn;
struct spdk_nvmf_fc_conn *fc_conn = NULL;
struct spdk_nvmf_fc_request *fc_req = NULL, *tmp;
struct spdk_nvmf_fc_hwqp *hwqp = conn_args->hwqp;
@ -1425,7 +1520,8 @@ nvmf_fc_poller_api_del_connection(void *arg)
fc_conn->conn_id);
/* Make sure connection is valid */
if (!nvmf_fc_hwqp_find_fc_conn(hwqp, fc_conn->conn_id)) {
if (rte_hash_lookup_data(hwqp->connection_list_hash,
(void *)&conn_args->fc_conn->conn_id, (void **)&fc_conn) < 0) {
/* perform callback */
nvmf_fc_poller_api_perform_cb(&conn_args->cb_info, SPDK_NVMF_FC_POLLER_API_NO_CONN_ID);
return;
@ -1433,24 +1529,22 @@ nvmf_fc_poller_api_del_connection(void *arg)
conn_args->fc_request_cnt = 0;
TAILQ_FOREACH_SAFE(fc_req, &hwqp->in_use_reqs, link, tmp) {
if (fc_req->fc_conn->conn_id == fc_conn->conn_id) {
if (nvmf_qpair_is_admin_queue(&fc_conn->qpair) &&
(fc_req->req.cmd->nvme_cmd.opc == SPDK_NVME_OPC_ASYNC_EVENT_REQUEST)) {
/* AER will be cleaned by spdk_nvmf_qpair_disconnect. */
continue;
}
conn_args->fc_request_cnt += 1;
nvmf_fc_request_abort(fc_req, conn_args->send_abts,
nvmf_fc_poller_conn_abort_done,
conn_args);
TAILQ_FOREACH_SAFE(fc_req, &fc_conn->in_use_reqs, conn_link, tmp) {
if (nvmf_qpair_is_admin_queue(&fc_conn->qpair) &&
(fc_req->req.cmd->nvme_cmd.opc == SPDK_NVME_OPC_ASYNC_EVENT_REQUEST)) {
/* AER will be cleaned by spdk_nvmf_qpair_disconnect. */
continue;
}
conn_args->fc_request_cnt += 1;
nvmf_fc_request_abort(fc_req, conn_args->send_abts,
nvmf_fc_poller_conn_abort_done,
conn_args);
}
if (!conn_args->fc_request_cnt) {
SPDK_DEBUGLOG(nvmf_fc_poller_api, "Connection deleted.\n");
TAILQ_REMOVE(&hwqp->connection_list, fc_conn, link);
nvmf_fc_poller_del_conn_lookup_data(conn_args->hwqp, conn_args->fc_conn);
hwqp->num_conns--;
if (!conn_args->backend_initiated) {
@ -1478,16 +1572,12 @@ static void
nvmf_fc_poller_api_abts_received(void *arg)
{
struct spdk_nvmf_fc_poller_api_abts_recvd_args *args = arg;
struct spdk_nvmf_fc_request *fc_req = NULL;
struct spdk_nvmf_fc_hwqp *hwqp = args->hwqp;
struct spdk_nvmf_fc_request *fc_req;
TAILQ_FOREACH(fc_req, &hwqp->in_use_reqs, link) {
if ((fc_req->rpi == args->ctx->rpi) &&
(fc_req->oxid == args->ctx->oxid)) {
nvmf_fc_request_abort(fc_req, false,
nvmf_fc_poller_abts_done, args);
return;
}
fc_req = nvmf_fc_poller_rpi_find_req(args->hwqp, args->ctx->rpi, args->ctx->oxid);
if (fc_req) {
nvmf_fc_request_abort(fc_req, false, nvmf_fc_poller_abts_done, args);
return;
}
nvmf_fc_poller_api_perform_cb(&args->cb_info,

View File

@ -41,6 +41,7 @@
#include "spdk/nvmf_fc_spec.h"
#include "spdk/thread.h"
#include "nvmf_internal.h"
#include <rte_hash.h>
#define SPDK_NVMF_FC_TR_ADDR_LEN 64
#define NVMF_FC_INVALID_CONN_ID UINT64_MAX
@ -237,9 +238,6 @@ struct spdk_nvmf_fc_conn {
/* for assocations's available connection list */
TAILQ_ENTRY(spdk_nvmf_fc_conn) assoc_avail_link;
/* for hwqp's connection list */
TAILQ_ENTRY(spdk_nvmf_fc_conn) link;
/* for hwqp's rport connection list link */
TAILQ_ENTRY(spdk_nvmf_fc_conn) rport_link;
@ -304,8 +302,9 @@ struct spdk_nvmf_fc_hwqp {
struct spdk_nvmf_fc_poll_group *fgroup;
/* qpair (fc_connection) list */
TAILQ_HEAD(, spdk_nvmf_fc_conn) connection_list;
uint32_t num_conns; /* number of connections to queue */
struct rte_hash *connection_list_hash;
struct rte_hash *rport_list_hash;
TAILQ_HEAD(, spdk_nvmf_fc_request) in_use_reqs;
@ -510,6 +509,11 @@ struct spdk_nvmf_fc_poller_api_queue_sync_done_args {
uint64_t tag;
};
struct spdk_nvmf_fc_hwqp_rport {
uint16_t rpi;
TAILQ_HEAD(, spdk_nvmf_fc_conn) conn_list;
};
/*
* NVMF LS request structure
*/
@ -871,7 +875,7 @@ void nvmf_fc_ls_add_conn_failure(
struct spdk_nvmf_fc_conn *fc_conn,
bool aq_conn);
void nvmf_fc_init_hwqp(struct spdk_nvmf_fc_port *fc_port, struct spdk_nvmf_fc_hwqp *hwqp);
int nvmf_fc_init_hwqp(struct spdk_nvmf_fc_port *fc_port, struct spdk_nvmf_fc_hwqp *hwqp);
struct spdk_nvmf_fc_conn *nvmf_fc_hwqp_find_fc_conn(struct spdk_nvmf_fc_hwqp *hwqp,
uint64_t conn_id);

View File

@ -35,7 +35,7 @@ SPDK_ROOT_DIR := $(abspath $(CURDIR)/../../../../../)
include $(SPDK_ROOT_DIR)/mk/config.mk
CFLAGS += -I$(SPDK_ROOT_DIR)/test/common/lib -I$(SPDK_ROOT_DIR)/lib \
-I$(SPDK_ROOT_DIR)/lib/nvmf
-I$(SPDK_ROOT_DIR)/lib/nvmf $(ENV_CFLAGS)
ifneq ($(strip $(CONFIG_FC_PATH)),)
CFLAGS += -I$(CONFIG_FC_PATH)

View File

@ -135,6 +135,14 @@ DEFINE_STUB(spdk_nvmf_request_complete, int, (struct spdk_nvmf_request *req),
DEFINE_STUB_V(nvmf_update_discovery_log,
(struct spdk_nvmf_tgt *tgt, const char *hostnqn));
DEFINE_STUB(rte_hash_create, struct rte_hash *, (const struct rte_hash_parameters *params),
(void *)1);
DEFINE_STUB(rte_hash_del_key, int32_t, (const struct rte_hash *h, const void *key), 0);
DEFINE_STUB(rte_hash_lookup_data, int, (const struct rte_hash *h, const void *key, void **data),
-ENOENT);
DEFINE_STUB(rte_hash_add_key_data, int, (const struct rte_hash *h, const void *key, void *data), 0);
DEFINE_STUB_V(rte_hash_free, (struct rte_hash *h));
const char *
spdk_nvme_transport_id_trtype_str(enum spdk_nvme_transport_type trtype)
{

View File

@ -34,7 +34,7 @@
SPDK_ROOT_DIR := $(abspath $(CURDIR)/../../../../../)
include $(SPDK_ROOT_DIR)/mk/config.mk
CFLAGS += -I$(SPDK_ROOT_DIR)/test/common/lib -I$(SPDK_ROOT_DIR)/lib/nvmf
CFLAGS += -I$(SPDK_ROOT_DIR)/test/common/lib -I$(SPDK_ROOT_DIR)/lib/nvmf $(ENV_CFLAGS)
ifneq ($(strip $(CONFIG_FC_PATH)),)
CFLAGS += -I$(CONFIG_FC_PATH)

View File

@ -61,6 +61,13 @@ DEFINE_STUB(spdk_nvmf_subsystem_host_allowed, bool,
(struct spdk_nvmf_subsystem *subsystem, const char *hostnqn), true);
DEFINE_STUB_V(spdk_nvme_trid_populate_transport, (struct spdk_nvme_transport_id *trid,
enum spdk_nvme_transport_type trtype));
DEFINE_STUB(rte_hash_del_key, int32_t, (const struct rte_hash *h, const void *key), 0);
DEFINE_STUB(rte_hash_lookup_data, int, (const struct rte_hash *h, const void *key, void **data),
-ENOENT);
DEFINE_STUB(rte_hash_add_key_data, int, (const struct rte_hash *h, const void *key, void *data), 0);
DEFINE_STUB(rte_hash_create, struct rte_hash *, (const struct rte_hash_parameters *params),
(void *)1);
DEFINE_STUB_V(rte_hash_free, (struct rte_hash *h));
static const char *fc_ut_subsystem_nqn =
"nqn.2017-11.io.spdk:sn.390c0dc7c87011e786b300a0989adc53:subsystem.good";
@ -175,20 +182,6 @@ err:
api_data->args.fc_conn, api_data->aq_conn);
}
struct spdk_nvmf_fc_conn *
nvmf_fc_hwqp_find_fc_conn(struct spdk_nvmf_fc_hwqp *hwqp, uint64_t conn_id)
{
struct spdk_nvmf_fc_conn *fc_conn;
TAILQ_FOREACH(fc_conn, &hwqp->connection_list, link) {
if (fc_conn->conn_id == conn_id) {
return fc_conn;
}
}
return NULL;
}
void
nvmf_fc_free_conn_reqpool(struct spdk_nvmf_fc_conn *fc_conn)
{
@ -663,7 +656,6 @@ ls_tests_init(void)
hwqp->thread = NULL;
hwqp->fc_port = &g_fc_port;
hwqp->num_conns = 0;
TAILQ_INIT(&hwqp->connection_list);
TAILQ_INIT(&hwqp->in_use_reqs);
bzero(&g_poll_group[i], sizeof(struct spdk_nvmf_poll_group));