diff --git a/lib/nvmf/ctrlr.c b/lib/nvmf/ctrlr.c index 2dd8b6137..717243dec 100644 --- a/lib/nvmf/ctrlr.c +++ b/lib/nvmf/ctrlr.c @@ -75,7 +75,7 @@ spdk_nvmf_ctrlr_create(struct spdk_nvmf_subsystem *subsystem, return NULL; } - ctrlr->group = spdk_nvmf_transport_poll_group_create(admin_qpair->transport); + ctrlr->group = spdk_nvmf_poll_group_create(subsystem->tgt); if (ctrlr->group == NULL) { SPDK_ERRLOG("spdk_nvmf_transport_poll_group_create() failed\n"); free(ctrlr); @@ -86,7 +86,7 @@ spdk_nvmf_ctrlr_create(struct spdk_nvmf_subsystem *subsystem, if (ctrlr->cntlid == 0) { /* Unable to get a cntlid */ SPDK_ERRLOG("Reached max simultaneous ctrlrs\n"); - spdk_nvmf_transport_poll_group_destroy(ctrlr->group); + spdk_nvmf_poll_group_destroy(ctrlr->group); free(ctrlr); return NULL; } @@ -100,8 +100,8 @@ spdk_nvmf_ctrlr_create(struct spdk_nvmf_subsystem *subsystem, memcpy(ctrlr->hostid, connect_data->hostid, sizeof(ctrlr->hostid)); - if (spdk_nvmf_transport_poll_group_add(ctrlr->group, admin_qpair)) { - spdk_nvmf_transport_poll_group_destroy(ctrlr->group); + if (spdk_nvmf_poll_group_add(ctrlr->group, admin_qpair)) { + spdk_nvmf_poll_group_destroy(ctrlr->group); free(ctrlr); return NULL; } @@ -139,7 +139,7 @@ spdk_nvmf_ctrlr_create(struct spdk_nvmf_subsystem *subsystem, static void ctrlr_destruct(struct spdk_nvmf_ctrlr *ctrlr) { TAILQ_REMOVE(&ctrlr->subsys->ctrlrs, ctrlr, link); - spdk_nvmf_transport_poll_group_destroy(ctrlr->group); + spdk_nvmf_poll_group_destroy(ctrlr->group); free(ctrlr); } @@ -292,7 +292,7 @@ spdk_nvmf_ctrlr_connect(struct spdk_nvmf_qpair *qpair, return; } - if (spdk_nvmf_transport_poll_group_add(ctrlr->group, qpair)) { + if (spdk_nvmf_poll_group_add(ctrlr->group, qpair)) { INVALID_CONNECT_CMD(qid); return; } @@ -317,7 +317,7 @@ spdk_nvmf_ctrlr_disconnect(struct spdk_nvmf_qpair *qpair) ctrlr->num_qpairs--; TAILQ_REMOVE(&ctrlr->qpairs, qpair, link); - spdk_nvmf_transport_poll_group_remove(ctrlr->group, qpair); + spdk_nvmf_poll_group_remove(ctrlr->group, qpair); spdk_nvmf_transport_qpair_fini(qpair); if (ctrlr->num_qpairs == 0) { @@ -570,7 +570,7 @@ spdk_nvmf_ctrlr_poll(struct spdk_nvmf_ctrlr *ctrlr) } } - return spdk_nvmf_transport_poll_group_poll(ctrlr->group); + return spdk_nvmf_poll_group_poll(ctrlr->group); } static int diff --git a/lib/nvmf/nvmf.c b/lib/nvmf/nvmf.c index 744886a23..af7a2c601 100644 --- a/lib/nvmf/nvmf.c +++ b/lib/nvmf/nvmf.c @@ -233,6 +233,99 @@ spdk_nvmf_tgt_accept(struct spdk_nvmf_tgt *tgt) } } +struct spdk_nvmf_poll_group * +spdk_nvmf_poll_group_create(struct spdk_nvmf_tgt *tgt) +{ + struct spdk_nvmf_poll_group *group; + struct spdk_nvmf_transport *transport; + struct spdk_nvmf_transport_poll_group *tgroup; + + group = calloc(1, sizeof(*group)); + if (!group) { + return NULL; + } + + TAILQ_INIT(&group->tgroups); + + TAILQ_FOREACH(transport, &tgt->transports, link) { + tgroup = spdk_nvmf_transport_poll_group_create(transport); + if (!tgroup) { + SPDK_ERRLOG("Unable to create poll group for transport\n"); + continue; + } + + TAILQ_INSERT_TAIL(&group->tgroups, tgroup, link); + } + + return group; +} + +void +spdk_nvmf_poll_group_destroy(struct spdk_nvmf_poll_group *group) +{ + struct spdk_nvmf_transport_poll_group *tgroup, *tmp; + + TAILQ_FOREACH_SAFE(tgroup, &group->tgroups, link, tmp) { + TAILQ_REMOVE(&group->tgroups, tgroup, link); + spdk_nvmf_transport_poll_group_destroy(tgroup); + } + + free(group); +} + +int +spdk_nvmf_poll_group_add(struct spdk_nvmf_poll_group *group, + struct spdk_nvmf_qpair *qpair) +{ + int rc = -1; + struct spdk_nvmf_transport_poll_group *tgroup; + + TAILQ_FOREACH(tgroup, &group->tgroups, link) { + if (tgroup->transport == qpair->transport) { + rc = spdk_nvmf_transport_poll_group_add(tgroup, qpair); + break; + } + } + + return rc; +} + +int +spdk_nvmf_poll_group_remove(struct spdk_nvmf_poll_group *group, + struct spdk_nvmf_qpair *qpair) +{ + int rc = -1; + struct spdk_nvmf_transport_poll_group *tgroup; + + TAILQ_FOREACH(tgroup, &group->tgroups, link) { + if (tgroup->transport == qpair->transport) { + rc = spdk_nvmf_transport_poll_group_remove(tgroup, qpair); + break; + } + } + + return rc; +} + +int +spdk_nvmf_poll_group_poll(struct spdk_nvmf_poll_group *group) +{ + int rc; + int count = 0; + struct spdk_nvmf_transport_poll_group *tgroup; + + TAILQ_FOREACH(tgroup, &group->tgroups, link) { + rc = spdk_nvmf_transport_poll_group_poll(tgroup); + if (rc < 0) { + return rc; + } + count += rc; + break; + } + + return count; +} + SPDK_TRACE_REGISTER_FN(nvmf_trace) { spdk_trace_register_object(OBJECT_NVMF_IO, 'r'); diff --git a/lib/nvmf/nvmf_internal.h b/lib/nvmf/nvmf_internal.h index 8e023c905..9e1113b41 100644 --- a/lib/nvmf/nvmf_internal.h +++ b/lib/nvmf/nvmf_internal.h @@ -69,8 +69,14 @@ struct spdk_nvmf_listener { TAILQ_ENTRY(spdk_nvmf_listener) link; }; +struct spdk_nvmf_transport_poll_group { + struct spdk_nvmf_transport *transport; + TAILQ_ENTRY(spdk_nvmf_transport_poll_group) link; +}; + struct spdk_nvmf_poll_group { - struct spdk_nvmf_transport *transport; + TAILQ_HEAD(, spdk_nvmf_transport_poll_group) tgroups; + TAILQ_ENTRY(spdk_nvmf_poll_group) link; }; @@ -111,6 +117,19 @@ uint16_t spdk_nvmf_tgt_gen_cntlid(struct spdk_nvmf_tgt *tgt); struct spdk_nvmf_transport *spdk_nvmf_tgt_get_transport(struct spdk_nvmf_tgt *tgt, enum spdk_nvme_transport_type); +struct spdk_nvmf_poll_group *spdk_nvmf_poll_group_create( + struct spdk_nvmf_tgt *tgt); + +void spdk_nvmf_poll_group_destroy(struct spdk_nvmf_poll_group *group); + +int spdk_nvmf_poll_group_add(struct spdk_nvmf_poll_group *group, + struct spdk_nvmf_qpair *qpair); + +int spdk_nvmf_poll_group_remove(struct spdk_nvmf_poll_group *group, + struct spdk_nvmf_qpair *qpair); + +int spdk_nvmf_poll_group_poll(struct spdk_nvmf_poll_group *group); + static inline struct spdk_nvmf_ns * _spdk_nvmf_subsystem_get_ns(struct spdk_nvmf_subsystem *subsystem, uint32_t nsid) { diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index 4952cf2da..7ce3c1747 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -216,7 +216,7 @@ struct spdk_nvmf_rdma_poller { }; struct spdk_nvmf_rdma_poll_group { - struct spdk_nvmf_poll_group group; + struct spdk_nvmf_transport_poll_group group; TAILQ_HEAD(, spdk_nvmf_rdma_poller) pollers; }; @@ -1452,7 +1452,7 @@ spdk_nvmf_rdma_discover(struct spdk_nvmf_transport *transport, entry->tsas.rdma.rdma_cms = SPDK_NVMF_RDMA_CMS_RDMA_CM; } -static struct spdk_nvmf_poll_group * +static struct spdk_nvmf_transport_poll_group * spdk_nvmf_rdma_poll_group_create(struct spdk_nvmf_transport *transport) { struct spdk_nvmf_rdma_transport *rtransport; @@ -1502,7 +1502,7 @@ spdk_nvmf_rdma_poll_group_create(struct spdk_nvmf_transport *transport) } static void -spdk_nvmf_rdma_poll_group_destroy(struct spdk_nvmf_poll_group *group) +spdk_nvmf_rdma_poll_group_destroy(struct spdk_nvmf_transport_poll_group *group) { struct spdk_nvmf_rdma_poll_group *rgroup; struct spdk_nvmf_rdma_poller *poller, *tmp; @@ -1522,7 +1522,7 @@ spdk_nvmf_rdma_poll_group_destroy(struct spdk_nvmf_poll_group *group) } static int -spdk_nvmf_rdma_poll_group_add(struct spdk_nvmf_poll_group *group, +spdk_nvmf_rdma_poll_group_add(struct spdk_nvmf_transport_poll_group *group, struct spdk_nvmf_qpair *qpair) { struct spdk_nvmf_rdma_poll_group *rgroup; @@ -1557,7 +1557,7 @@ spdk_nvmf_rdma_poll_group_add(struct spdk_nvmf_poll_group *group, } static int -spdk_nvmf_rdma_poll_group_remove(struct spdk_nvmf_poll_group *group, +spdk_nvmf_rdma_poll_group_remove(struct spdk_nvmf_transport_poll_group *group, struct spdk_nvmf_qpair *qpair) { struct spdk_nvmf_rdma_poll_group *rgroup; @@ -1770,7 +1770,7 @@ spdk_nvmf_rdma_qpair_poll(struct spdk_nvmf_rdma_transport *rtransport, } static int -spdk_nvmf_rdma_poll_group_poll(struct spdk_nvmf_poll_group *group) +spdk_nvmf_rdma_poll_group_poll(struct spdk_nvmf_transport_poll_group *group) { struct spdk_nvmf_rdma_transport *rtransport; struct spdk_nvmf_rdma_poll_group *rgroup; diff --git a/lib/nvmf/transport.c b/lib/nvmf/transport.c index 0bc37f0ab..9eea680c8 100644 --- a/lib/nvmf/transport.c +++ b/lib/nvmf/transport.c @@ -120,10 +120,10 @@ spdk_nvmf_transport_listener_discover(struct spdk_nvmf_transport *transport, transport->ops->listener_discover(transport, trid, entry); } -struct spdk_nvmf_poll_group * +struct spdk_nvmf_transport_poll_group * spdk_nvmf_transport_poll_group_create(struct spdk_nvmf_transport *transport) { - struct spdk_nvmf_poll_group *group; + struct spdk_nvmf_transport_poll_group *group; group = transport->ops->poll_group_create(transport); group->transport = transport; @@ -132,13 +132,13 @@ spdk_nvmf_transport_poll_group_create(struct spdk_nvmf_transport *transport) } void -spdk_nvmf_transport_poll_group_destroy(struct spdk_nvmf_poll_group *group) +spdk_nvmf_transport_poll_group_destroy(struct spdk_nvmf_transport_poll_group *group) { group->transport->ops->poll_group_destroy(group); } int -spdk_nvmf_transport_poll_group_add(struct spdk_nvmf_poll_group *group, +spdk_nvmf_transport_poll_group_add(struct spdk_nvmf_transport_poll_group *group, struct spdk_nvmf_qpair *qpair) { if (qpair->transport) { @@ -154,14 +154,14 @@ spdk_nvmf_transport_poll_group_add(struct spdk_nvmf_poll_group *group, } int -spdk_nvmf_transport_poll_group_remove(struct spdk_nvmf_poll_group *group, +spdk_nvmf_transport_poll_group_remove(struct spdk_nvmf_transport_poll_group *group, struct spdk_nvmf_qpair *qpair) { return group->transport->ops->poll_group_remove(group, qpair); } int -spdk_nvmf_transport_poll_group_poll(struct spdk_nvmf_poll_group *group) +spdk_nvmf_transport_poll_group_poll(struct spdk_nvmf_transport_poll_group *group) { return group->transport->ops->poll_group_poll(group); } diff --git a/lib/nvmf/transport.h b/lib/nvmf/transport.h index d63d533f3..3efb557f3 100644 --- a/lib/nvmf/transport.h +++ b/lib/nvmf/transport.h @@ -90,29 +90,29 @@ struct spdk_nvmf_transport_ops { /** * Create a new poll group */ - struct spdk_nvmf_poll_group *(*poll_group_create)(struct spdk_nvmf_transport *transport); + struct spdk_nvmf_transport_poll_group *(*poll_group_create)(struct spdk_nvmf_transport *transport); /** * Destroy a poll group */ - void (*poll_group_destroy)(struct spdk_nvmf_poll_group *group); + void (*poll_group_destroy)(struct spdk_nvmf_transport_poll_group *group); /** * Add a qpair to a poll group */ - int (*poll_group_add)(struct spdk_nvmf_poll_group *group, + int (*poll_group_add)(struct spdk_nvmf_transport_poll_group *group, struct spdk_nvmf_qpair *qpair); /** * Remove a qpair from a poll group */ - int (*poll_group_remove)(struct spdk_nvmf_poll_group *group, + int (*poll_group_remove)(struct spdk_nvmf_transport_poll_group *group, struct spdk_nvmf_qpair *qpair); /** * Poll the group to process I/O */ - int (*poll_group_poll)(struct spdk_nvmf_poll_group *group); + int (*poll_group_poll)(struct spdk_nvmf_transport_poll_group *group); /* * Signal request completion, which sends a response @@ -147,18 +147,18 @@ void spdk_nvmf_transport_listener_discover(struct spdk_nvmf_transport *transport struct spdk_nvme_transport_id *trid, struct spdk_nvmf_discovery_log_page_entry *entry); -struct spdk_nvmf_poll_group *spdk_nvmf_transport_poll_group_create(struct spdk_nvmf_transport - *transport); +struct spdk_nvmf_transport_poll_group *spdk_nvmf_transport_poll_group_create( + struct spdk_nvmf_transport *transport); -void spdk_nvmf_transport_poll_group_destroy(struct spdk_nvmf_poll_group *group); +void spdk_nvmf_transport_poll_group_destroy(struct spdk_nvmf_transport_poll_group *group); -int spdk_nvmf_transport_poll_group_add(struct spdk_nvmf_poll_group *group, +int spdk_nvmf_transport_poll_group_add(struct spdk_nvmf_transport_poll_group *group, struct spdk_nvmf_qpair *qpair); -int spdk_nvmf_transport_poll_group_remove(struct spdk_nvmf_poll_group *group, +int spdk_nvmf_transport_poll_group_remove(struct spdk_nvmf_transport_poll_group *group, struct spdk_nvmf_qpair *qpair); -int spdk_nvmf_transport_poll_group_poll(struct spdk_nvmf_poll_group *group); +int spdk_nvmf_transport_poll_group_poll(struct spdk_nvmf_transport_poll_group *group); int spdk_nvmf_transport_req_complete(struct spdk_nvmf_request *req); diff --git a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c index 6925254a4..2a78f585d 100644 --- a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c +++ b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c @@ -58,13 +58,13 @@ spdk_nvme_ctrlr_get_data(struct spdk_nvme_ctrlr *ctrlr) } struct spdk_nvmf_poll_group * -spdk_nvmf_transport_poll_group_create(struct spdk_nvmf_transport *transport) +spdk_nvmf_poll_group_create(struct spdk_nvmf_tgt *tgt) { return NULL; } void -spdk_nvmf_transport_poll_group_destroy(struct spdk_nvmf_poll_group *group) +spdk_nvmf_poll_group_destroy(struct spdk_nvmf_poll_group *group) { } @@ -74,21 +74,21 @@ spdk_nvmf_transport_qpair_fini(struct spdk_nvmf_qpair *qpair) } int -spdk_nvmf_transport_poll_group_add(struct spdk_nvmf_poll_group *group, - struct spdk_nvmf_qpair *qpair) +spdk_nvmf_poll_group_add(struct spdk_nvmf_poll_group *group, + struct spdk_nvmf_qpair *qpair) { return 0; } int -spdk_nvmf_transport_poll_group_remove(struct spdk_nvmf_poll_group *group, - struct spdk_nvmf_qpair *qpair) +spdk_nvmf_poll_group_remove(struct spdk_nvmf_poll_group *group, + struct spdk_nvmf_qpair *qpair) { return 0; } int -spdk_nvmf_transport_poll_group_poll(struct spdk_nvmf_poll_group *group) +spdk_nvmf_poll_group_poll(struct spdk_nvmf_poll_group *group) { return 0; }