Commit 527c825c authored by Ziye Yang's avatar Ziye Yang Committed by Jim Harris
Browse files

nvmf: Re-add spdk_nvmf_transport_poll_group_remove



For TCP/IP transport, we need to remove the socket
from the polling group since we do not want to keep the
tgroup info in the NVMe/TCP qpair, it should be general.

Change-Id: I4b064d8378f66ea5d91ac554fe628d9ccebd07f4
Signed-off-by: default avatarZiye Yang <optimistyzy@gmail.com>
Reviewed-on: https://review.gerrithub.io/434128


Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 5b16c18d
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -707,11 +707,25 @@ _spdk_nvmf_qpair_destroy(void *ctx, int status)
	struct nvmf_qpair_disconnect_ctx *qpair_ctx = ctx;
	struct spdk_nvmf_qpair *qpair = qpair_ctx->qpair;
	struct spdk_nvmf_ctrlr *ctrlr = qpair->ctrlr;
	struct spdk_nvmf_transport_poll_group *tgroup;
	int rc;

	assert(qpair->state == SPDK_NVMF_QPAIR_DEACTIVATING);
	spdk_nvmf_qpair_set_state(qpair, SPDK_NVMF_QPAIR_ERROR);
	qpair_ctx->qid = qpair->qid;

	/* Find the tgroup and remove the qpair from the tgroup */
	TAILQ_FOREACH(tgroup, &qpair->group->tgroups, link) {
		if (tgroup->transport == qpair->transport) {
			rc = spdk_nvmf_transport_poll_group_remove(tgroup, qpair);
			if (rc && (rc != ENOTSUP)) {
				SPDK_ERRLOG("Cannot remove qpair=%p from transport group=%p\n",
					    qpair, tgroup);
			}
			break;
		}
	}

	TAILQ_REMOVE(&qpair->group->qpairs, qpair, link);
	qpair->group = NULL;

+23 −18
Original line number Diff line number Diff line
@@ -276,8 +276,6 @@ struct nvme_tcp_qpair {
	uint16_t				initiator_port;
	uint16_t				target_port;

	/* qpair->group is freed early, this should be a temporal fix */
	struct spdk_nvmf_tcp_poll_group		*tgroup;
	TAILQ_ENTRY(nvme_tcp_qpair)		link;
};

@@ -497,21 +495,7 @@ spdk_nvmf_tcp_cleanup_all_states(struct nvme_tcp_qpair *tqpair)
static void
spdk_nvmf_tcp_qpair_destroy(struct nvme_tcp_qpair *tqpair)
{
	struct spdk_nvmf_tcp_poll_group *tgroup;
	int                             rc;

	SPDK_DEBUGLOG(SPDK_LOG_NVMF_TCP, "enter\n");
	tgroup = tqpair->tgroup;

	if (tgroup) {
		SPDK_DEBUGLOG(SPDK_LOG_NVMF_TCP, "remove tqpair=%p from the tgroup=%p\n", tqpair, tgroup);
		TAILQ_REMOVE(&tgroup->qpairs, tqpair, link);
		rc = spdk_sock_group_remove_sock(tgroup->sock_group, tqpair->sock);
		if (rc != 0) {
			SPDK_ERRLOG("Could not remove sock from sock_group: %s (%d)\n",
				    spdk_strerror(errno), errno);
		}
	}

	spdk_poller_unregister(&tqpair->flush_poller);
	spdk_sock_close(&tqpair->sock);
@@ -2656,13 +2640,33 @@ spdk_nvmf_tcp_poll_group_add(struct spdk_nvmf_transport_poll_group *group,
	tqpair->state = NVME_TCP_QPAIR_STATE_INVALID;
	tqpair->timeout = SPDK_NVME_TCP_QPAIR_EXIT_TIMEOUT;
	tqpair->last_pdu_time = spdk_get_ticks();

	tqpair->tgroup = tgroup;
	TAILQ_INSERT_TAIL(&tgroup->qpairs, tqpair, link);

	return 0;
}

static int
spdk_nvmf_tcp_poll_group_remove(struct spdk_nvmf_transport_poll_group *group,
				struct spdk_nvmf_qpair *qpair)
{
	struct spdk_nvmf_tcp_poll_group	*tgroup;
	struct nvme_tcp_qpair		*tqpair;
	int				rc;

	tgroup = SPDK_CONTAINEROF(group, struct spdk_nvmf_tcp_poll_group, group);
	tqpair = SPDK_CONTAINEROF(qpair, struct nvme_tcp_qpair, qpair);

	SPDK_DEBUGLOG(SPDK_LOG_NVMF_TCP, "remove tqpair=%p from the tgroup=%p\n", tqpair, tgroup);
	TAILQ_REMOVE(&tgroup->qpairs, tqpair, link);
	rc = spdk_sock_group_remove_sock(tgroup->sock_group, tqpair->sock);
	if (rc != 0) {
		SPDK_ERRLOG("Could not remove sock from sock_group: %s (%d)\n",
			    spdk_strerror(errno), errno);
	}

	return rc;
}

static int
spdk_nvmf_tcp_req_complete(struct spdk_nvmf_request *req)
{
@@ -2859,6 +2863,7 @@ const struct spdk_nvmf_transport_ops spdk_nvmf_transport_tcp = {
	.poll_group_create = spdk_nvmf_tcp_poll_group_create,
	.poll_group_destroy = spdk_nvmf_tcp_poll_group_destroy,
	.poll_group_add = spdk_nvmf_tcp_poll_group_add,
	.poll_group_remove = spdk_nvmf_tcp_poll_group_remove,
	.poll_group_poll = spdk_nvmf_tcp_poll_group_poll,

	.req_free = spdk_nvmf_tcp_req_free,
+14 −0
Original line number Diff line number Diff line
@@ -192,6 +192,20 @@ spdk_nvmf_transport_poll_group_add(struct spdk_nvmf_transport_poll_group *group,
	return group->transport->ops->poll_group_add(group, qpair);
}

int
spdk_nvmf_transport_poll_group_remove(struct spdk_nvmf_transport_poll_group *group,
				      struct spdk_nvmf_qpair *qpair)
{
	int rc = ENOTSUP;

	assert(qpair->transport == group->transport);
	if (group->transport->ops->poll_group_remove) {
		rc = group->transport->ops->poll_group_remove(group, qpair);
	}

	return rc;
}

int
spdk_nvmf_transport_poll_group_poll(struct spdk_nvmf_transport_poll_group *group)
{
+9 −0
Original line number Diff line number Diff line
@@ -109,6 +109,12 @@ struct spdk_nvmf_transport_ops {
	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_transport_poll_group *group,
				 struct spdk_nvmf_qpair *qpair);

	/**
	 * Poll the group to process I/O
	 */
@@ -178,6 +184,9 @@ void spdk_nvmf_transport_poll_group_destroy(struct spdk_nvmf_transport_poll_grou
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_transport_poll_group *group,
		struct spdk_nvmf_qpair *qpair);

int spdk_nvmf_transport_poll_group_poll(struct spdk_nvmf_transport_poll_group *group);

int spdk_nvmf_transport_req_free(struct spdk_nvmf_request *req);