nvmf: Poll groups can now span transports

We are still creating one poll group per controller,
so this isn't particularly useful just yet.

Change-Id: I65c54385bdba587d4b1098629727877970d39277
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/376241
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Ben Walker 2017-08-28 16:24:33 -07:00 committed by Jim Harris
parent e237ce317e
commit c1535ca0af
7 changed files with 151 additions and 39 deletions

View File

@ -75,7 +75,7 @@ spdk_nvmf_ctrlr_create(struct spdk_nvmf_subsystem *subsystem,
return NULL; 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) { if (ctrlr->group == NULL) {
SPDK_ERRLOG("spdk_nvmf_transport_poll_group_create() failed\n"); SPDK_ERRLOG("spdk_nvmf_transport_poll_group_create() failed\n");
free(ctrlr); free(ctrlr);
@ -86,7 +86,7 @@ spdk_nvmf_ctrlr_create(struct spdk_nvmf_subsystem *subsystem,
if (ctrlr->cntlid == 0) { if (ctrlr->cntlid == 0) {
/* Unable to get a cntlid */ /* Unable to get a cntlid */
SPDK_ERRLOG("Reached max simultaneous ctrlrs\n"); SPDK_ERRLOG("Reached max simultaneous ctrlrs\n");
spdk_nvmf_transport_poll_group_destroy(ctrlr->group); spdk_nvmf_poll_group_destroy(ctrlr->group);
free(ctrlr); free(ctrlr);
return NULL; return NULL;
} }
@ -100,8 +100,8 @@ spdk_nvmf_ctrlr_create(struct spdk_nvmf_subsystem *subsystem,
memcpy(ctrlr->hostid, connect_data->hostid, sizeof(ctrlr->hostid)); memcpy(ctrlr->hostid, connect_data->hostid, sizeof(ctrlr->hostid));
if (spdk_nvmf_transport_poll_group_add(ctrlr->group, admin_qpair)) { if (spdk_nvmf_poll_group_add(ctrlr->group, admin_qpair)) {
spdk_nvmf_transport_poll_group_destroy(ctrlr->group); spdk_nvmf_poll_group_destroy(ctrlr->group);
free(ctrlr); free(ctrlr);
return NULL; return NULL;
} }
@ -139,7 +139,7 @@ spdk_nvmf_ctrlr_create(struct spdk_nvmf_subsystem *subsystem,
static void ctrlr_destruct(struct spdk_nvmf_ctrlr *ctrlr) static void ctrlr_destruct(struct spdk_nvmf_ctrlr *ctrlr)
{ {
TAILQ_REMOVE(&ctrlr->subsys->ctrlrs, ctrlr, link); TAILQ_REMOVE(&ctrlr->subsys->ctrlrs, ctrlr, link);
spdk_nvmf_transport_poll_group_destroy(ctrlr->group); spdk_nvmf_poll_group_destroy(ctrlr->group);
free(ctrlr); free(ctrlr);
} }
@ -292,7 +292,7 @@ spdk_nvmf_ctrlr_connect(struct spdk_nvmf_qpair *qpair,
return; return;
} }
if (spdk_nvmf_transport_poll_group_add(ctrlr->group, qpair)) { if (spdk_nvmf_poll_group_add(ctrlr->group, qpair)) {
INVALID_CONNECT_CMD(qid); INVALID_CONNECT_CMD(qid);
return; return;
} }
@ -317,7 +317,7 @@ spdk_nvmf_ctrlr_disconnect(struct spdk_nvmf_qpair *qpair)
ctrlr->num_qpairs--; ctrlr->num_qpairs--;
TAILQ_REMOVE(&ctrlr->qpairs, qpair, link); 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); spdk_nvmf_transport_qpair_fini(qpair);
if (ctrlr->num_qpairs == 0) { 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 static int

View File

@ -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_FN(nvmf_trace)
{ {
spdk_trace_register_object(OBJECT_NVMF_IO, 'r'); spdk_trace_register_object(OBJECT_NVMF_IO, 'r');

View File

@ -69,8 +69,14 @@ struct spdk_nvmf_listener {
TAILQ_ENTRY(spdk_nvmf_listener) link; 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_poll_group {
struct spdk_nvmf_transport *transport; TAILQ_HEAD(, spdk_nvmf_transport_poll_group) tgroups;
TAILQ_ENTRY(spdk_nvmf_poll_group) link; 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, struct spdk_nvmf_transport *spdk_nvmf_tgt_get_transport(struct spdk_nvmf_tgt *tgt,
enum spdk_nvme_transport_type); 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 * static inline struct spdk_nvmf_ns *
_spdk_nvmf_subsystem_get_ns(struct spdk_nvmf_subsystem *subsystem, uint32_t nsid) _spdk_nvmf_subsystem_get_ns(struct spdk_nvmf_subsystem *subsystem, uint32_t nsid)
{ {

View File

@ -216,7 +216,7 @@ struct spdk_nvmf_rdma_poller {
}; };
struct spdk_nvmf_rdma_poll_group { 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; 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; 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) spdk_nvmf_rdma_poll_group_create(struct spdk_nvmf_transport *transport)
{ {
struct spdk_nvmf_rdma_transport *rtransport; struct spdk_nvmf_rdma_transport *rtransport;
@ -1502,7 +1502,7 @@ spdk_nvmf_rdma_poll_group_create(struct spdk_nvmf_transport *transport)
} }
static void 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_poll_group *rgroup;
struct spdk_nvmf_rdma_poller *poller, *tmp; 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 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_qpair *qpair)
{ {
struct spdk_nvmf_rdma_poll_group *rgroup; 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 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_qpair *qpair)
{ {
struct spdk_nvmf_rdma_poll_group *rgroup; struct spdk_nvmf_rdma_poll_group *rgroup;
@ -1770,7 +1770,7 @@ spdk_nvmf_rdma_qpair_poll(struct spdk_nvmf_rdma_transport *rtransport,
} }
static int 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_transport *rtransport;
struct spdk_nvmf_rdma_poll_group *rgroup; struct spdk_nvmf_rdma_poll_group *rgroup;

View File

@ -120,10 +120,10 @@ spdk_nvmf_transport_listener_discover(struct spdk_nvmf_transport *transport,
transport->ops->listener_discover(transport, trid, entry); 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) 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->ops->poll_group_create(transport);
group->transport = transport; group->transport = transport;
@ -132,13 +132,13 @@ spdk_nvmf_transport_poll_group_create(struct spdk_nvmf_transport *transport)
} }
void 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); group->transport->ops->poll_group_destroy(group);
} }
int 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) struct spdk_nvmf_qpair *qpair)
{ {
if (qpair->transport) { if (qpair->transport) {
@ -154,14 +154,14 @@ spdk_nvmf_transport_poll_group_add(struct spdk_nvmf_poll_group *group,
} }
int 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) struct spdk_nvmf_qpair *qpair)
{ {
return group->transport->ops->poll_group_remove(group, qpair); return group->transport->ops->poll_group_remove(group, qpair);
} }
int 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); return group->transport->ops->poll_group_poll(group);
} }

View File

@ -90,29 +90,29 @@ struct spdk_nvmf_transport_ops {
/** /**
* Create a new poll group * 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 * 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 * 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); struct spdk_nvmf_qpair *qpair);
/** /**
* Remove a qpair from a poll group * 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); struct spdk_nvmf_qpair *qpair);
/** /**
* Poll the group to process I/O * 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 * 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_nvme_transport_id *trid,
struct spdk_nvmf_discovery_log_page_entry *entry); struct spdk_nvmf_discovery_log_page_entry *entry);
struct spdk_nvmf_poll_group *spdk_nvmf_transport_poll_group_create(struct spdk_nvmf_transport struct spdk_nvmf_transport_poll_group *spdk_nvmf_transport_poll_group_create(
*transport); 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); 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); 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); int spdk_nvmf_transport_req_complete(struct spdk_nvmf_request *req);

View File

@ -58,13 +58,13 @@ spdk_nvme_ctrlr_get_data(struct spdk_nvme_ctrlr *ctrlr)
} }
struct spdk_nvmf_poll_group * 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; return NULL;
} }
void 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 int
spdk_nvmf_transport_poll_group_add(struct spdk_nvmf_poll_group *group, spdk_nvmf_poll_group_add(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_qpair *qpair) struct spdk_nvmf_qpair *qpair)
{ {
return 0; return 0;
} }
int int
spdk_nvmf_transport_poll_group_remove(struct spdk_nvmf_poll_group *group, spdk_nvmf_poll_group_remove(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_qpair *qpair) struct spdk_nvmf_qpair *qpair)
{ {
return 0; return 0;
} }
int 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; return 0;
} }