diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index ea2b7641f..5bbda97ad 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -981,6 +981,84 @@ static const char *CM_EVENT_STR[] = { }; #endif /* DEBUG */ +static void +spdk_nvmf_process_cm_event(struct spdk_nvmf_transport *transport, new_qpair_fn cb_fn) +{ + struct spdk_nvmf_rdma_transport *rtransport; + struct rdma_cm_event *event; + int rc; + + rtransport = SPDK_CONTAINEROF(transport, struct spdk_nvmf_rdma_transport, transport); + + if (rtransport->event_channel == NULL) { + return; + } + + while (1) { + rc = rdma_get_cm_event(rtransport->event_channel, &event); + if (rc == 0) { + SPDK_DEBUGLOG(SPDK_LOG_RDMA, "Acceptor Event: %s\n", CM_EVENT_STR[event->event]); + + switch (event->event) { + case RDMA_CM_EVENT_ADDR_RESOLVED: + case RDMA_CM_EVENT_ADDR_ERROR: + case RDMA_CM_EVENT_ROUTE_RESOLVED: + case RDMA_CM_EVENT_ROUTE_ERROR: + /* No action required. The target never attempts to resolve routes. */ + break; + case RDMA_CM_EVENT_CONNECT_REQUEST: + rc = nvmf_rdma_connect(transport, event, cb_fn); + if (rc < 0) { + SPDK_ERRLOG("Unable to process connect event. rc: %d\n", rc); + break; + } + break; + case RDMA_CM_EVENT_CONNECT_RESPONSE: + /* The target never initiates a new connection. So this will not occur. */ + break; + case RDMA_CM_EVENT_CONNECT_ERROR: + /* Can this happen? The docs say it can, but not sure what causes it. */ + break; + case RDMA_CM_EVENT_UNREACHABLE: + case RDMA_CM_EVENT_REJECTED: + /* These only occur on the client side. */ + break; + case RDMA_CM_EVENT_ESTABLISHED: + /* TODO: Should we be waiting for this event anywhere? */ + break; + case RDMA_CM_EVENT_DISCONNECTED: + case RDMA_CM_EVENT_DEVICE_REMOVAL: + rc = nvmf_rdma_disconnect(event); + if (rc < 0) { + SPDK_ERRLOG("Unable to process disconnect event. rc: %d\n", rc); + break; + } + continue; + case RDMA_CM_EVENT_MULTICAST_JOIN: + case RDMA_CM_EVENT_MULTICAST_ERROR: + /* Multicast is not used */ + break; + case RDMA_CM_EVENT_ADDR_CHANGE: + /* Not utilizing this event */ + break; + case RDMA_CM_EVENT_TIMEWAIT_EXIT: + /* For now, do nothing. The target never re-uses queue pairs. */ + break; + default: + SPDK_ERRLOG("Unexpected Acceptor Event [%d]\n", event->event); + break; + } + + rdma_ack_cm_event(event); + } else { + if (errno != EAGAIN && errno != EWOULDBLOCK) { + SPDK_ERRLOG("Acceptor Event Error: %s\n", spdk_strerror(errno)); + } + break; + } + } +} + static int spdk_nvmf_rdma_mem_notify(void *cb_ctx, struct spdk_mem_map *map, enum spdk_mem_map_notify_action action, @@ -1823,84 +1901,6 @@ spdk_nvmf_rdma_stop_listen(struct spdk_nvmf_transport *transport, return 0; } -static void -spdk_nvmf_process_cm_event(struct spdk_nvmf_transport *transport, new_qpair_fn cb_fn) -{ - struct spdk_nvmf_rdma_transport *rtransport; - struct rdma_cm_event *event; - int rc; - - rtransport = SPDK_CONTAINEROF(transport, struct spdk_nvmf_rdma_transport, transport); - - if (rtransport->event_channel == NULL) { - return; - } - - while (1) { - rc = rdma_get_cm_event(rtransport->event_channel, &event); - if (rc == 0) { - SPDK_DEBUGLOG(SPDK_LOG_RDMA, "Acceptor Event: %s\n", CM_EVENT_STR[event->event]); - - switch (event->event) { - case RDMA_CM_EVENT_ADDR_RESOLVED: - case RDMA_CM_EVENT_ADDR_ERROR: - case RDMA_CM_EVENT_ROUTE_RESOLVED: - case RDMA_CM_EVENT_ROUTE_ERROR: - /* No action required. The target never attempts to resolve routes. */ - break; - case RDMA_CM_EVENT_CONNECT_REQUEST: - rc = nvmf_rdma_connect(transport, event, cb_fn); - if (rc < 0) { - SPDK_ERRLOG("Unable to process connect event. rc: %d\n", rc); - break; - } - break; - case RDMA_CM_EVENT_CONNECT_RESPONSE: - /* The target never initiates a new connection. So this will not occur. */ - break; - case RDMA_CM_EVENT_CONNECT_ERROR: - /* Can this happen? The docs say it can, but not sure what causes it. */ - break; - case RDMA_CM_EVENT_UNREACHABLE: - case RDMA_CM_EVENT_REJECTED: - /* These only occur on the client side. */ - break; - case RDMA_CM_EVENT_ESTABLISHED: - /* TODO: Should we be waiting for this event anywhere? */ - break; - case RDMA_CM_EVENT_DISCONNECTED: - case RDMA_CM_EVENT_DEVICE_REMOVAL: - rc = nvmf_rdma_disconnect(event); - if (rc < 0) { - SPDK_ERRLOG("Unable to process disconnect event. rc: %d\n", rc); - break; - } - continue; - case RDMA_CM_EVENT_MULTICAST_JOIN: - case RDMA_CM_EVENT_MULTICAST_ERROR: - /* Multicast is not used */ - break; - case RDMA_CM_EVENT_ADDR_CHANGE: - /* Not utilizing this event */ - break; - case RDMA_CM_EVENT_TIMEWAIT_EXIT: - /* For now, do nothing. The target never re-uses queue pairs. */ - break; - default: - SPDK_ERRLOG("Unexpected Acceptor Event [%d]\n", event->event); - break; - } - - rdma_ack_cm_event(event); - } else { - if (errno != EAGAIN && errno != EWOULDBLOCK) { - SPDK_ERRLOG("Acceptor Event Error: %s\n", spdk_strerror(errno)); - } - break; - } - } -} - static bool spdk_nvmf_rdma_qpair_is_idle(struct spdk_nvmf_qpair *qpair) {