Commit 42dc2836 authored by Ben Walker's avatar Ben Walker
Browse files

nvme/rdma: Add a utility for getting the next cm event



Change-Id: Ia7650e729ab233be6464fb0a190c9cd29f462fcf
Signed-off-by: default avatarBen Walker <benjamin.walker@intel.com>
parent fa97f35f
Loading
Loading
Loading
Loading
+32 −31
Original line number Diff line number Diff line
@@ -171,6 +171,31 @@ nvme_rdma_req_complete(struct nvme_request *req,
	nvme_free_request(req);
}

static int
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) {
		SPDK_ERRLOG("Failed to get event from CM event channel. Error %d (%s)\n",
			    errno, strerror(errno));
		return -1;
	}

	if (event->event != evt) {
		SPDK_ERRLOG("Received event %d from CM event channel, but expected event %d\n",
			    event->event, evt);
		return -1;
	}

	rdma_ack_cm_event(event);

	return 0;
}

static int
nvme_rdma_qpair_init(struct nvme_rdma_qpair *rqpair)
{
@@ -509,7 +534,6 @@ nvme_rdma_bind_addr(struct nvme_rdma_qpair *rqpair,
		    struct rdma_event_channel *cm_channel)
{
	int ret;
	struct rdma_cm_event *event;

	ret = rdma_resolve_addr(rqpair->cm_id, NULL, (struct sockaddr *) sin,
				NVME_RDMA_TIME_OUT_IN_MS);
@@ -518,34 +542,22 @@ nvme_rdma_bind_addr(struct nvme_rdma_qpair *rqpair,
		return ret;
	}

	ret = rdma_get_cm_event(cm_channel, &event);
	if (ret) {
		SPDK_ERRLOG("rdma address resolution error\n");
		return ret;
	}
	if (event->event != RDMA_CM_EVENT_ADDR_RESOLVED) {
	if (nvme_rdma_get_event(cm_channel, RDMA_CM_EVENT_ADDR_RESOLVED) < 0) {
		SPDK_ERRLOG("RDMA address resolution error\n");
		return -1;
	}
	rdma_ack_cm_event(event);


	ret = rdma_resolve_route(rqpair->cm_id, NVME_RDMA_TIME_OUT_IN_MS);
	if (ret) {
		SPDK_ERRLOG("rdma_resolve_route\n");
		return ret;
	}
	ret = rdma_get_cm_event(cm_channel, &event);
	if (ret) {
		SPDK_ERRLOG("rdma address resolution error\n");
		return ret;
	}
	if (event->event != RDMA_CM_EVENT_ROUTE_RESOLVED) {
		SPDK_ERRLOG("rdma route resolution error\n");

	if (nvme_rdma_get_event(cm_channel, RDMA_CM_EVENT_ROUTE_RESOLVED) < 0) {
		SPDK_ERRLOG("RDMA route resolution error\n");
		return -1;
	}
	rdma_ack_cm_event(event);

	SPDK_TRACELOG(SPDK_TRACE_DEBUG, "rdma_resolve_addr - rdma_resolve_route successful\n");
	return 0;
}

@@ -554,7 +566,6 @@ nvme_rdma_connect(struct nvme_rdma_qpair *rqpair)
{
	struct rdma_conn_param conn_param;
	struct spdk_nvmf_rdma_request_private_data pdata;
	struct rdma_cm_event *event;
	struct ibv_device_attr attr;
	int ret;

@@ -582,21 +593,11 @@ nvme_rdma_connect(struct nvme_rdma_qpair *rqpair)
		return ret;
	}

	ret = rdma_get_cm_event(rqpair->cm_channel, &event);
	if (ret) {
		SPDK_ERRLOG("rdma address resolution error\n");
		return ret;
	}

	if (event->event != RDMA_CM_EVENT_ESTABLISHED) {
		SPDK_ERRLOG("rdma connect error\n");
	if (nvme_rdma_get_event(rqpair->cm_channel, RDMA_CM_EVENT_ESTABLISHED) < 0) {
		SPDK_ERRLOG("RDMA connect error\n");
		return -1;
	}

	rdma_ack_cm_event(event);

	SPDK_TRACELOG(SPDK_TRACE_DEBUG, "connect successful\n");

	return 0;
}