Commit 0a61427e authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Tomasz Zawadzki
Browse files

nvme_rdma: Start qpair after resolving address and route when poll group is used



Signed-off-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Change-Id: I0b0f314c98368247582f2dfcaf69f78e24d715f9
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11366


Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
parent 531c1b0f
Loading
Loading
Loading
Loading
+55 −48
Original line number Diff line number Diff line
@@ -712,6 +712,60 @@ nvme_rdma_process_event(struct nvme_rdma_qpair *rqpair,
	return rc;
}

static int
nvme_rdma_resize_cq(struct nvme_rdma_qpair *rqpair, struct nvme_rdma_poller *poller)
{
	int	current_num_wc, required_num_wc;

	required_num_wc = poller->required_num_wc + WC_PER_QPAIR(rqpair->num_entries);
	current_num_wc = poller->current_num_wc;
	if (current_num_wc < required_num_wc) {
		current_num_wc = spdk_max(current_num_wc * 2, required_num_wc);
	}

	if (poller->current_num_wc != current_num_wc) {
		SPDK_DEBUGLOG(nvme, "Resize RDMA CQ from %d to %d\n", poller->current_num_wc,
			      current_num_wc);
		if (ibv_resize_cq(poller->cq, current_num_wc)) {
			SPDK_ERRLOG("RDMA CQ resize failed: errno %d: %s\n", errno, spdk_strerror(errno));
			return -1;
		}

		poller->current_num_wc = current_num_wc;
	}

	poller->required_num_wc = required_num_wc;
	return 0;
}

static int
nvme_rdma_poll_group_set_cq(struct spdk_nvme_qpair *qpair)
{
	struct nvme_rdma_qpair          *rqpair = nvme_rdma_qpair(qpair);
	struct nvme_rdma_poll_group     *group = nvme_rdma_poll_group(qpair->poll_group);
	struct nvme_rdma_poller         *poller;

	assert(rqpair->cq == NULL);

	STAILQ_FOREACH(poller, &group->pollers, link) {
		if (poller->device == rqpair->cm_id->verbs) {
			if (nvme_rdma_resize_cq(rqpair, poller)) {
				return -EPROTO;
			}
			rqpair->cq = poller->cq;
			rqpair->poller = poller;
			break;
		}
	}

	if (rqpair->cq == NULL) {
		SPDK_ERRLOG("Unable to find a cq for qpair %p on poll group %p\n", qpair, qpair->poll_group);
		return -EINVAL;
	}

	return 0;
}

static int
nvme_rdma_qpair_init(struct nvme_rdma_qpair *rqpair)
{
@@ -728,7 +782,7 @@ nvme_rdma_qpair_init(struct nvme_rdma_qpair *rqpair)

	if (rqpair->qpair.poll_group) {
		assert(!rqpair->cq);
		rc = nvme_poll_group_connect_qpair(&rqpair->qpair);
		rc = nvme_rdma_poll_group_set_cq(&rqpair->qpair);
		if (rc) {
			SPDK_ERRLOG("Unable to activate the rdmaqpair.\n");
			return -1;
@@ -2701,57 +2755,10 @@ nvme_rdma_poll_group_get_qpair_by_id(struct nvme_rdma_poll_group *group, uint32_
	return NULL;
}

static int
nvme_rdma_resize_cq(struct nvme_rdma_qpair *rqpair, struct nvme_rdma_poller *poller)
{
	int	current_num_wc, required_num_wc;

	required_num_wc = poller->required_num_wc + WC_PER_QPAIR(rqpair->num_entries);
	current_num_wc = poller->current_num_wc;
	if (current_num_wc < required_num_wc) {
		current_num_wc = spdk_max(current_num_wc * 2, required_num_wc);
	}

	if (poller->current_num_wc != current_num_wc) {
		SPDK_DEBUGLOG(nvme, "Resize RDMA CQ from %d to %d\n", poller->current_num_wc,
			      current_num_wc);
		if (ibv_resize_cq(poller->cq, current_num_wc)) {
			SPDK_ERRLOG("RDMA CQ resize failed: errno %d: %s\n", errno, spdk_strerror(errno));
			return -1;
		}

		poller->current_num_wc = current_num_wc;
	}

	poller->required_num_wc = required_num_wc;
	return 0;
}

static int
nvme_rdma_poll_group_connect_qpair(struct spdk_nvme_qpair *qpair)
{
	struct nvme_rdma_qpair		*rqpair = nvme_rdma_qpair(qpair);
	struct nvme_rdma_poll_group	*group = nvme_rdma_poll_group(qpair->poll_group);
	struct nvme_rdma_poller		*poller;

	assert(rqpair->cq == NULL);

	STAILQ_FOREACH(poller, &group->pollers, link) {
		if (poller->device == rqpair->cm_id->verbs) {
			if (nvme_rdma_resize_cq(rqpair, poller)) {
				return -EPROTO;
			}
			rqpair->cq = poller->cq;
			rqpair->poller = poller;
			break;
		}
	}

	if (rqpair->cq == NULL) {
		SPDK_ERRLOG("Unable to find a cq for qpair %p on poll group %p\n", qpair, qpair->poll_group);
		return -EINVAL;
	}

	return 0;
}

+2 −2
Original line number Diff line number Diff line
@@ -1052,7 +1052,7 @@ test_nvme_rdma_poll_group_connect_disconnect_qpair(void)
	rc = nvme_rdma_poller_create(&group, contexts);
	SPDK_CU_ASSERT_FATAL(rc == 0);

	rc = nvme_rdma_poll_group_connect_qpair(&rqpair->qpair);
	rc = nvme_rdma_poll_group_set_cq(&rqpair->qpair);
	CU_ASSERT(rc == 0);
	CU_ASSERT(rqpair->cq == (void *)0xFEEDBEEF);
	CU_ASSERT(rqpair->poller != NULL);
@@ -1086,7 +1086,7 @@ test_nvme_rdma_poll_group_connect_disconnect_qpair(void)
	rqpair->qpair.state = NVME_QPAIR_DESTROYING;
	cm_id.verbs = (void *)0xDEADBEEF;

	rc = nvme_rdma_poll_group_connect_qpair(&rqpair->qpair);
	rc = nvme_rdma_poll_group_set_cq(&rqpair->qpair);
	CU_ASSERT(rc == -EINVAL);
	CU_ASSERT(rqpair->cq == NULL);