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:
parent
5b16c18d17
commit
527c825c81
@ -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;
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user