From 708ed4fb6e8c41d6033ce26b349171aa77703061 Mon Sep 17 00:00:00 2001 From: Jacek Kalwas Date: Sun, 12 Jan 2020 00:12:30 +0100 Subject: [PATCH] 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 Change-Id: I94a9f45b7ba9e8d46a60ae3785953cea12554732 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/479511 Tested-by: SPDK CI Jenkins Community-CI: Broadcom SPDK FC-NVMe CI Community-CI: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Jim Harris Reviewed-by: Anil Veerabhadrappa Reviewed-by: Shuhei Matsumoto --- include/spdk/nvmf.h | 26 ++++++++++++------- lib/nvmf/fc.c | 6 ++++- lib/nvmf/nvmf.c | 6 +---- lib/nvmf/rdma.c | 5 +++- lib/nvmf/subsystem.c | 1 + lib/nvmf/tcp.c | 5 +++- lib/nvmf/transport.c | 6 +++-- .../ctrlr_discovery.c/ctrlr_discovery_ut.c | 8 +++--- test/unit/lib/nvmf/subsystem.c/subsystem_ut.c | 4 ++- 9 files changed, 43 insertions(+), 24 deletions(-) diff --git a/include/spdk/nvmf.h b/include/spdk/nvmf.h index dcae3da57..64805b41d 100644 --- a/include/spdk/nvmf.h +++ b/include/spdk/nvmf.h @@ -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. diff --git a/lib/nvmf/fc.c b/lib/nvmf/fc.c index d573d3e83..1381f78f8 100644 --- a/lib/nvmf/fc.c +++ b/lib/nvmf/fc.c @@ -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; } diff --git a/lib/nvmf/nvmf.c b/lib/nvmf/nvmf.c index 33bb75cd6..278016d55 100644 --- a/lib/nvmf/nvmf.c +++ b/lib/nvmf/nvmf.c @@ -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 { diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index 62b44db43..accf369a4 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -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; } diff --git a/lib/nvmf/subsystem.c b/lib/nvmf/subsystem.c index 461d52801..151aee182 100644 --- a/lib/nvmf/subsystem.c +++ b/lib/nvmf/subsystem.c @@ -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; } diff --git a/lib/nvmf/tcp.c b/lib/nvmf/tcp.c index 69de02007..a4a1e5264 100644 --- a/lib/nvmf/tcp.c +++ b/lib/nvmf/tcp.c @@ -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; } diff --git a/lib/nvmf/transport.c b/lib/nvmf/transport.c index 3bffc7b0a..d41757edb 100644 --- a/lib/nvmf/transport.c +++ b/lib/nvmf/transport.c @@ -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 diff --git a/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c b/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c index 662903479..5683a372a 100644 --- a/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c +++ b/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c @@ -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 */ diff --git a/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c b/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c index 38f3f46fb..4b1bf9e26 100644 --- a/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c +++ b/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c @@ -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; }