diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index 6bd7ac696..75c986b0c 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -230,10 +230,12 @@ nvme_rdma_get_event(struct rdma_event_channel *channel, enum rdma_cm_event_type evt) { struct rdma_cm_event *event; - int rc; - rc = rdma_get_cm_event(channel, &event); - if (rc < 0) { + while (rdma_get_cm_event(channel, &event) != 0) { + if (errno == EAGAIN || errno == EWOULDBLOCK) { + continue; + } + SPDK_ERRLOG("Failed to get event from CM event channel. Error %d (%s)\n", errno, spdk_strerror(errno)); return NULL; @@ -803,6 +805,7 @@ nvme_rdma_qpair_connect(struct nvme_rdma_qpair *rqpair) int rc; struct spdk_nvme_ctrlr *ctrlr; int family; + int flag; rqpair->cm_channel = rdma_create_event_channel(); if (rqpair->cm_channel == NULL) { @@ -810,6 +813,12 @@ nvme_rdma_qpair_connect(struct nvme_rdma_qpair *rqpair) return -1; } + flag = fcntl(rqpair->cm_channel->fd, F_GETFL); + if (fcntl(rqpair->cm_channel->fd, F_SETFL, flag | O_NONBLOCK) < 0) { + SPDK_ERRLOG("Cannot set event channel to non blocking\n"); + return -1; + } + ctrlr = rqpair->qpair.ctrlr; switch (ctrlr->trid.adrfam) {