Commit ad7a01bd authored by Seth Howell's avatar Seth Howell Committed by Jim Harris
Browse files

nvme_rdma: make cm_event fd asynchronous.



This is paving the way for additional changes to enable polling for
cm_events in the initiator.

For now, just present the same blocking API on top of the now polled
file descriptor. Later, we will change this API to be more useful.

Change-Id: I174dac028720f95c30100f6dc2ed49b5bb2a7e40
Signed-off-by: default avatarSeth Howell <seth.howell@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/467545


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent f54df840
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -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) {