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:
parent
e237ce317e
commit
c1535ca0af
@ -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
|
||||
|
@ -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');
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user