nvmf: pass listen done cb to transport specific code

This would allow to respond for add listener rpc request even
when there are async calls in transport specific function.

Signed-off-by: Jacek Kalwas <jacek.kalwas@intel.com>
Change-Id: I94a9f45b7ba9e8d46a60ae3785953cea12554732
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/479511
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Community-CI: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Anil Veerabhadrappa <anil.veerabhadrappa@broadcom.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Jacek Kalwas 2020-01-12 00:12:30 +01:00 committed by Tomasz Zawadzki
parent 7cd56fb3ed
commit 708ed4fb6e
9 changed files with 43 additions and 24 deletions

View File

@ -122,6 +122,14 @@ struct spdk_nvmf_transport_poll_group_stat {
*/
typedef void (*new_qpair_fn)(struct spdk_nvmf_qpair *qpair, void *cb_arg);
/**
* Function to be called once the target is listening.
*
* \param ctx Context argument passed to this function.
* \param status 0 if it completed successfully, or negative errno if it failed.
*/
typedef void (*spdk_nvmf_tgt_listen_done_fn)(void *ctx, int status);
struct spdk_nvmf_transport_ops {
/**
* Transport name
@ -153,7 +161,9 @@ struct spdk_nvmf_transport_ops {
* provided. This may be called multiple times.
*/
int (*listen)(struct spdk_nvmf_transport *transport,
const struct spdk_nvme_transport_id *trid);
const struct spdk_nvme_transport_id *trid,
spdk_nvmf_tgt_listen_done_fn cb_fn,
void *cb_arg);
/**
* Stop accepting new connections at the given address.
@ -329,14 +339,6 @@ struct spdk_nvmf_tgt *spdk_nvmf_get_next_tgt(struct spdk_nvmf_tgt *prev);
*/
void spdk_nvmf_tgt_write_config_json(struct spdk_json_write_ctx *w, struct spdk_nvmf_tgt *tgt);
/**
* Function to be called once the target is listening.
*
* \param ctx Context argument passed to this function.
* \param status 0 if it completed successfully, or negative errno if it failed.
*/
typedef void (*spdk_nvmf_tgt_listen_done_fn)(void *ctx, int status);
/**
* Begin accepting new connections at the address provided.
*
@ -1083,12 +1085,16 @@ void spdk_nvmf_tgt_add_transport(struct spdk_nvmf_tgt *tgt,
*
* \param transport The transport to add listener to
* \param trid Address to listen at
* \param cb_fn A callback that will be called once the listener is created
* \param cb_arg A context argument passed to cb_fn.
*
* \return int. 0 if it completed successfully, or negative errno if it failed.
*/
int spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport,
const struct spdk_nvme_transport_id *trid);
const struct spdk_nvme_transport_id *trid,
spdk_nvmf_tgt_listen_done_fn cb_fn,
void *cb_arg);
/**
* Write NVMe-oF target's transport configurations into provided JSON context.

View File

@ -1924,8 +1924,12 @@ nvmf_fc_destroy(struct spdk_nvmf_transport *transport)
static int
nvmf_fc_listen(struct spdk_nvmf_transport *transport,
const struct spdk_nvme_transport_id *trid)
const struct spdk_nvme_transport_id *trid,
spdk_nvmf_tgt_listen_done_fn cb_fn,
void *cb_arg)
{
cb_fn(cb_arg, 0);
return 0;
}

View File

@ -563,16 +563,12 @@ spdk_nvmf_tgt_listen(struct spdk_nvmf_tgt *tgt,
return;
}
rc = spdk_nvmf_transport_listen(transport, trid);
rc = spdk_nvmf_transport_listen(transport, trid, cb_fn, cb_arg);
if (rc < 0) {
SPDK_ERRLOG("Unable to listen on address '%s'\n", trid->traddr);
cb_fn(cb_arg, rc);
return;
}
tgt->discovery_genctr++;
cb_fn(cb_arg, 0);
}
struct spdk_nvmf_tgt_add_transport_ctx {

View File

@ -2623,7 +2623,9 @@ spdk_nvmf_rdma_trid_from_cm_id(struct rdma_cm_id *id,
static int
spdk_nvmf_rdma_listen(struct spdk_nvmf_transport *transport,
const struct spdk_nvme_transport_id *trid)
const struct spdk_nvme_transport_id *trid,
spdk_nvmf_tgt_listen_done_fn cb_fn,
void *cb_arg)
{
struct spdk_nvmf_rdma_transport *rtransport;
struct spdk_nvmf_rdma_device *device;
@ -2746,6 +2748,7 @@ spdk_nvmf_rdma_listen(struct spdk_nvmf_transport *transport,
success:
port->ref++;
pthread_mutex_unlock(&rtransport->lock);
cb_fn(cb_arg, 0);
return 0;
}

View File

@ -779,6 +779,7 @@ spdk_nvmf_subsystem_add_listener(struct spdk_nvmf_subsystem *subsystem,
listener->transport = transport;
TAILQ_INSERT_HEAD(&subsystem->listeners, listener, link);
subsystem->tgt->discovery_genctr++;
return 0;
}

View File

@ -647,7 +647,9 @@ _spdk_nvmf_tcp_find_port(struct spdk_nvmf_tcp_transport *ttransport,
static int
spdk_nvmf_tcp_listen(struct spdk_nvmf_transport *transport,
const struct spdk_nvme_transport_id *trid)
const struct spdk_nvme_transport_id *trid,
spdk_nvmf_tgt_listen_done_fn cb_fn,
void *cb_arg)
{
struct spdk_nvmf_tcp_transport *ttransport;
struct spdk_nvmf_tcp_port *port;
@ -718,6 +720,7 @@ spdk_nvmf_tcp_listen(struct spdk_nvmf_transport *transport,
success:
port->ref++;
pthread_mutex_unlock(&ttransport->lock);
cb_fn(cb_arg, 0);
return 0;
}

View File

@ -175,9 +175,11 @@ spdk_nvmf_transport_destroy(struct spdk_nvmf_transport *transport)
int
spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport,
const struct spdk_nvme_transport_id *trid)
const struct spdk_nvme_transport_id *trid,
spdk_nvmf_tgt_listen_done_fn cb_fn,
void *cb_arg)
{
return transport->ops->listen(transport, trid);
return transport->ops->listen(transport, trid, cb_fn, cb_arg);
}
int

View File

@ -79,7 +79,9 @@ spdk_bdev_get_uuid(const struct spdk_bdev *bdev)
int
spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport,
const struct spdk_nvme_transport_id *trid)
const struct spdk_nvme_transport_id *trid,
spdk_nvmf_tgt_listen_done_fn cb_fn,
void *cb_arg)
{
return 0;
}
@ -223,13 +225,13 @@ test_discovery_log(void)
disc_log = (struct spdk_nvmf_discovery_log_page *)buffer;
spdk_nvmf_get_discovery_log_page(&tgt, "nqn.2016-06.io.spdk:host1", &iov, 1, 0,
sizeof(disc_log->genctr));
CU_ASSERT(disc_log->genctr == 1); /* one added subsystem */
CU_ASSERT(disc_log->genctr == 2); /* one added subsystem and listener */
/* Get only the header, no entries */
memset(buffer, 0xCC, sizeof(buffer));
disc_log = (struct spdk_nvmf_discovery_log_page *)buffer;
spdk_nvmf_get_discovery_log_page(&tgt, "nqn.2016-06.io.spdk:host1", &iov, 1, 0, sizeof(*disc_log));
CU_ASSERT(disc_log->genctr == 1);
CU_ASSERT(disc_log->genctr == 2);
CU_ASSERT(disc_log->numrec == 1);
/* Offset 0, exact size match */

View File

@ -66,7 +66,9 @@ DEFINE_STUB(spdk_nvmf_transport_stop_listen,
int
spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport,
const struct spdk_nvme_transport_id *trid)
const struct spdk_nvme_transport_id *trid,
spdk_nvmf_tgt_listen_done_fn cb_fn,
void *cb_arg)
{
return 0;
}