Commit 8b79ef33 authored by Ben Walker's avatar Ben Walker
Browse files

nvmf: Remove poll group from controller



Now rely entirely on the user to create and poll
the poll groups.

Change-Id: I66baaa2d0f493390a055a32e6c902f5e2f574534
Signed-off-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/385954


Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 2302dc6c
Loading
Loading
Loading
Loading
+32 −1
Original line number Diff line number Diff line
@@ -141,12 +141,41 @@ nvmf_tgt_shutdown_subsystem_by_nqn(const char *nqn)
	return -1;
}

static void
nvmf_tgt_poll_group_add(void *arg1, void *arg2)
{
	struct spdk_nvmf_qpair *qpair = arg1;
	struct nvmf_tgt_poll_group *pg = arg2;

	spdk_nvmf_poll_group_add(pg->group, qpair);
}

static void
new_qpair(struct spdk_nvmf_qpair *qpair)
{
	struct spdk_event *event;
	struct nvmf_tgt_poll_group *pg;
	uint32_t core;

	core = g_tgt.core;
	g_tgt.core = spdk_env_get_next_core(core);
	if (g_tgt.core == UINT32_MAX) {
		g_tgt.core = spdk_env_get_first_core();
	}

	pg = &g_poll_groups[core];
	assert(pg != NULL);

	event = spdk_event_allocate(core, nvmf_tgt_poll_group_add, qpair, pg);
	spdk_event_call(event);
}

static void
acceptor_poll(void *arg)
{
	struct spdk_nvmf_tgt *tgt = arg;

	spdk_nvmf_tgt_accept(tgt);
	spdk_nvmf_tgt_accept(tgt, new_qpair);
}

static void
@@ -221,6 +250,8 @@ nvmf_tgt_advance_state(void *arg1, void *arg2)
				rc = -ENOMEM;
				break;
			}

			g_tgt.core = spdk_env_get_first_core();
			break;
		}
		case NVMF_TGT_INIT_PARSE_CONFIG:
+2 −0
Original line number Diff line number Diff line
@@ -77,6 +77,8 @@ struct nvmf_tgt {
	enum nvmf_tgt_state state;

	struct spdk_nvmf_tgt *tgt;

	uint32_t core; /* Round-robin tracking of cores for qpair assignment */
};

extern struct spdk_nvmf_tgt_conf g_spdk_nvmf_tgt_conf;
+7 −2
Original line number Diff line number Diff line
@@ -99,10 +99,16 @@ void spdk_nvmf_tgt_destroy(struct spdk_nvmf_tgt *tgt);
int spdk_nvmf_tgt_listen(struct spdk_nvmf_tgt *tgt,
			 struct spdk_nvme_transport_id *trid);

typedef void (*new_qpair_fn)(struct spdk_nvmf_qpair *qpair);

/**
 * Poll the target for incoming connections.
 *
 * The new_qpair_fn cb_fn will be called for each newly discovered
 * qpair. The user is expected to add that qpair to a poll group
 * to establish the connection.
 */
void spdk_nvmf_tgt_accept(struct spdk_nvmf_tgt *tgt);
void spdk_nvmf_tgt_accept(struct spdk_nvmf_tgt *tgt, new_qpair_fn cb_fn);

/**
 * Create a poll group.
@@ -126,7 +132,6 @@ int spdk_nvmf_poll_group_add(struct spdk_nvmf_poll_group *group,
int spdk_nvmf_poll_group_remove(struct spdk_nvmf_poll_group *group,
				struct spdk_nvmf_qpair *qpair);


/*
 * The NVMf subsystem, as indicated in the specification, is a collection
 * of controllers.  Any individual controller has
+0 −21
Original line number Diff line number Diff line
@@ -73,13 +73,6 @@ spdk_nvmf_ctrlr_create(struct spdk_nvmf_subsystem *subsystem,
		return NULL;
	}

	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);
		return NULL;
	}

	TAILQ_INIT(&ctrlr->qpairs);
	ctrlr->kato = connect_cmd->kato;
	ctrlr->async_event_config.raw = 0;
@@ -89,12 +82,6 @@ spdk_nvmf_ctrlr_create(struct spdk_nvmf_subsystem *subsystem,

	memcpy(ctrlr->hostid, connect_data->hostid, sizeof(ctrlr->hostid));

	if (spdk_nvmf_poll_group_add(ctrlr->group, admin_qpair)) {
		spdk_nvmf_poll_group_destroy(ctrlr->group);
		free(ctrlr);
		return NULL;
	}

	ctrlr->vcprop.cap.raw = 0;
	ctrlr->vcprop.cap.bits.cqr = 1; /* NVMe-oF specification required */
	ctrlr->vcprop.cap.bits.mqes = tgt->opts.max_queue_depth - 1; /* max queue depth */
@@ -123,7 +110,6 @@ spdk_nvmf_ctrlr_create(struct spdk_nvmf_subsystem *subsystem,

	if (spdk_nvmf_subsystem_add_ctrlr(subsystem, ctrlr)) {
		SPDK_ERRLOG("Unable to add controller to subsystem\n");
		spdk_nvmf_poll_group_destroy(ctrlr->group);
		free(ctrlr);
		return NULL;
	}
@@ -134,7 +120,6 @@ spdk_nvmf_ctrlr_create(struct spdk_nvmf_subsystem *subsystem,
static void ctrlr_destruct(struct spdk_nvmf_ctrlr *ctrlr)
{
	spdk_nvmf_subsystem_remove_ctrlr(ctrlr->subsys, ctrlr);
	spdk_nvmf_poll_group_destroy(ctrlr->group);
	free(ctrlr);
}

@@ -324,11 +309,6 @@ spdk_nvmf_ctrlr_connect(struct spdk_nvmf_request *req)
			rsp->status.sc = SPDK_NVMF_FABRIC_SC_CONTROLLER_BUSY;
			return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
		}

		if (spdk_nvmf_poll_group_add(ctrlr->group, qpair)) {
			SPDK_NVMF_INVALID_CONNECT_CMD(rsp, qid);
			return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
		}
	}

	ctrlr->num_qpairs++;
@@ -351,7 +331,6 @@ spdk_nvmf_ctrlr_disconnect(struct spdk_nvmf_qpair *qpair)
	ctrlr->num_qpairs--;
	TAILQ_REMOVE(&ctrlr->qpairs, qpair, link);

	spdk_nvmf_poll_group_remove(ctrlr->group, qpair);
	spdk_nvmf_transport_qpair_fini(qpair);

	if (ctrlr->num_qpairs == 0) {
+2 −2
Original line number Diff line number Diff line
@@ -322,12 +322,12 @@ spdk_nvmf_tgt_get_transport(struct spdk_nvmf_tgt *tgt, enum spdk_nvme_transport_
}

void
spdk_nvmf_tgt_accept(struct spdk_nvmf_tgt *tgt)
spdk_nvmf_tgt_accept(struct spdk_nvmf_tgt *tgt, new_qpair_fn cb_fn)
{
	struct spdk_nvmf_transport *transport, *tmp;

	TAILQ_FOREACH_SAFE(transport, &tgt->transports, link, tmp) {
		spdk_nvmf_transport_accept(transport);
		spdk_nvmf_transport_accept(transport, cb_fn);
	}
}

Loading