Commit c1535ca0 authored by Ben Walker's avatar Ben Walker Committed by Jim Harris
Browse files

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: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/376241


Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent e237ce31
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -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
+93 −0
Original line number Diff line number Diff line
@@ -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');
+20 −1
Original line number Diff line number Diff line
@@ -69,8 +69,14 @@ struct spdk_nvmf_listener {
	TAILQ_ENTRY(spdk_nvmf_listener)	link;
};

struct spdk_nvmf_poll_group {
struct spdk_nvmf_transport_poll_group {
	struct spdk_nvmf_transport			*transport;
	TAILQ_ENTRY(spdk_nvmf_transport_poll_group)	link;
};

struct spdk_nvmf_poll_group {
	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)
{
+6 −6
Original line number Diff line number Diff line
@@ -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;
+6 −6
Original line number Diff line number Diff line
@@ -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);
}
Loading