diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index 499d47b8f..74d076540 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -128,6 +128,10 @@ struct nvme_rdma_ctrlr { struct nvme_rdma_cm_event_entry *cm_events; }; +struct nvme_rdma_poll_group { + struct spdk_nvme_transport_poll_group group; +}; + struct spdk_nvme_send_wr_list { struct ibv_send_wr *first; struct ibv_send_wr *last; @@ -2150,7 +2154,14 @@ nvme_rdma_admin_qpair_abort_aers(struct spdk_nvme_qpair *qpair) static struct spdk_nvme_transport_poll_group * nvme_rdma_poll_group_create(void) { - return NULL; + struct nvme_rdma_poll_group *group = calloc(1, sizeof(*group)); + + if (group == NULL) { + SPDK_ERRLOG("Unable to allocate poll group.\n"); + return NULL; + } + + return &group->group; } static int @@ -2169,27 +2180,50 @@ static int nvme_rdma_poll_group_add(struct spdk_nvme_transport_poll_group *tgroup, struct spdk_nvme_qpair *qpair) { - return -ENOTSUP; + return 0; } static int nvme_rdma_poll_group_remove(struct spdk_nvme_transport_poll_group *tgroup, struct spdk_nvme_qpair *qpair) { - return -ENOTSUP; + return 0; } static int64_t nvme_rdma_poll_group_process_completions(struct spdk_nvme_transport_poll_group *tgroup, uint32_t completions_per_qpair, spdk_nvme_disconnected_qpair_cb disconnected_qpair_cb) { - return -ENOTSUP; + struct spdk_nvme_qpair *qpair, *tmp_qpair; + int32_t local_completions = 0; + int64_t total_completions = 0; + + STAILQ_FOREACH_SAFE(qpair, &tgroup->disconnected_qpairs, poll_group_stailq, tmp_qpair) { + disconnected_qpair_cb(qpair, tgroup->group->ctx); + } + + STAILQ_FOREACH_SAFE(qpair, &tgroup->connected_qpairs, poll_group_stailq, tmp_qpair) { + local_completions = spdk_nvme_qpair_process_completions(qpair, completions_per_qpair); + if (local_completions < 0) { + disconnected_qpair_cb(qpair, tgroup->group->ctx); + local_completions = 0; + } + total_completions += local_completions; + } + + return total_completions; } static int nvme_rdma_poll_group_destroy(struct spdk_nvme_transport_poll_group *tgroup) { - return -ENOTSUP; + if (!STAILQ_EMPTY(&tgroup->connected_qpairs) || !STAILQ_EMPTY(&tgroup->disconnected_qpairs)) { + return -EBUSY; + } + + free(tgroup); + + return 0; } void diff --git a/test/common/lib/nvme/common_stubs.h b/test/common/lib/nvme/common_stubs.h index 4a2778055..38c55b5b8 100644 --- a/test/common/lib/nvme/common_stubs.h +++ b/test/common/lib/nvme/common_stubs.h @@ -95,6 +95,8 @@ DEFINE_STUB_V(spdk_nvme_trid_populate_transport, (struct spdk_nvme_transport_id enum spdk_nvme_transport_type trtype)); DEFINE_STUB(nvme_get_transport, const struct spdk_nvme_transport *, (const char *transport_name), NULL); +DEFINE_STUB(spdk_nvme_qpair_process_completions, int32_t, (struct spdk_nvme_qpair *qpair, + uint32_t max_completions), 0); /* Fabric transports only */ DEFINE_STUB_V(nvme_ctrlr_disconnect_qpair, (struct spdk_nvme_qpair *qpair)); diff --git a/test/unit/lib/nvme/nvme_tcp.c/nvme_tcp_ut.c b/test/unit/lib/nvme/nvme_tcp.c/nvme_tcp_ut.c index 8c11d4c1f..c2f23fd40 100644 --- a/test/unit/lib/nvme/nvme_tcp.c/nvme_tcp_ut.c +++ b/test/unit/lib/nvme/nvme_tcp.c/nvme_tcp_ut.c @@ -44,8 +44,6 @@ SPDK_LOG_REGISTER_COMPONENT("nvme", SPDK_LOG_NVME); DEFINE_STUB(nvme_qpair_submit_request, int, (struct spdk_nvme_qpair *qpair, struct nvme_request *req), 0); -DEFINE_STUB(spdk_nvme_qpair_process_completions, int32_t, (struct spdk_nvme_qpair *qpair, - uint32_t max_completions), 0); DEFINE_STUB(spdk_sock_set_priority, int, (struct spdk_sock *sock, int priority), 0);