diff --git a/lib/nvmf/ctrlr.c b/lib/nvmf/ctrlr.c index 18675e75c..7a3b5aab6 100644 --- a/lib/nvmf/ctrlr.c +++ b/lib/nvmf/ctrlr.c @@ -324,9 +324,6 @@ spdk_nvmf_ctrlr_connect(struct spdk_nvmf_request *req) } } - assert(qpair->thread == NULL); - qpair->thread = spdk_get_thread(); - ctrlr->num_qpairs++; TAILQ_INSERT_HEAD(&ctrlr->qpairs, qpair, link); qpair->ctrlr = ctrlr; diff --git a/lib/nvmf/nvmf.c b/lib/nvmf/nvmf.c index 30c3d9dca..bfc1638be 100644 --- a/lib/nvmf/nvmf.c +++ b/lib/nvmf/nvmf.c @@ -361,6 +361,8 @@ spdk_nvmf_poll_group_add(struct spdk_nvmf_poll_group *group, int rc = -1; struct spdk_nvmf_transport_poll_group *tgroup; + qpair->group = group; + TAILQ_FOREACH(tgroup, &group->tgroups, link) { if (tgroup->transport == qpair->transport) { rc = spdk_nvmf_transport_poll_group_add(tgroup, qpair); @@ -378,6 +380,8 @@ spdk_nvmf_poll_group_remove(struct spdk_nvmf_poll_group *group, int rc = -1; struct spdk_nvmf_transport_poll_group *tgroup; + qpair->group = NULL; + TAILQ_FOREACH(tgroup, &group->tgroups, link) { if (tgroup->transport == qpair->transport) { rc = spdk_nvmf_transport_poll_group_remove(tgroup, qpair); diff --git a/lib/nvmf/nvmf_internal.h b/lib/nvmf/nvmf_internal.h index c612e53c0..8abdcc5c5 100644 --- a/lib/nvmf/nvmf_internal.h +++ b/lib/nvmf/nvmf_internal.h @@ -140,10 +140,9 @@ enum spdk_nvmf_qpair_type { struct spdk_nvmf_qpair { struct spdk_nvmf_transport *transport; struct spdk_nvmf_ctrlr *ctrlr; + struct spdk_nvmf_poll_group *group; enum spdk_nvmf_qpair_type type; - struct spdk_thread *thread; - uint16_t qid; uint16_t sq_head; uint16_t sq_head_max; diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index 700b55d32..cd8773415 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -744,6 +744,7 @@ nvmf_rdma_disconnect(struct rdma_cm_event *evt) struct spdk_nvmf_ctrlr *ctrlr; struct spdk_nvmf_rdma_qpair *rdma_qpair; struct spdk_nvmf_rdma_qpair *r, *t; + struct spdk_io_channel *ch; if (evt->id == NULL) { SPDK_ERRLOG("disconnect request: missing cm_id\n"); @@ -781,7 +782,8 @@ nvmf_rdma_disconnect(struct rdma_cm_event *evt) return 0; } - spdk_thread_send_msg(qpair->thread, nvmf_rdma_handle_disconnect, qpair); + ch = spdk_io_channel_from_ctx(qpair->group); + spdk_thread_send_msg(spdk_io_channel_get_thread(ch), nvmf_rdma_handle_disconnect, qpair); return 0; } diff --git a/lib/nvmf/request.c b/lib/nvmf/request.c index 36821f2f0..e4ec44937 100644 --- a/lib/nvmf/request.c +++ b/lib/nvmf/request.c @@ -71,9 +71,12 @@ spdk_nvmf_request_complete(struct spdk_nvmf_request *req) if ((cmd->opc == SPDK_NVME_OPC_FABRIC || req->qpair->type == QPAIR_TYPE_AQ) && - req->qpair->thread) { + req->qpair->group) { + struct spdk_io_channel *ch; + + ch = spdk_io_channel_from_ctx(req->qpair->group); /* Pass a message back to the originating thread. */ - spdk_thread_send_msg(req->qpair->thread, + spdk_thread_send_msg(spdk_io_channel_get_thread(ch), spdk_nvmf_request_complete_on_qpair, req); } else {