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: Ziye Yang <optimistyzy@gmail.com>
Reviewed-on: https://review.gerrithub.io/434128
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Ziye Yang 2018-11-21 10:11:25 +08:00 committed by Jim Harris
parent 5b16c18d17
commit 527c825c81
4 changed files with 60 additions and 18 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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)
{

View File

@ -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);