Commit 443a0197 authored by Aleksey Marchuk's avatar Aleksey Marchuk Committed by Jim Harris
Browse files

nvme/rdma: Reduce poller WC counter on qp disconnect



When we attach a qpair to a poller, we always increment
the required_num_wc counter which is used to decide whether
we need to resize CQ or not. But we don't decrease this counter
when a qpair is disconnected, that leads to unnecessary CQ
growth.

Change-Id: I4a8d9399cefd131bb3df8cac9c2e2500d7ff303c
Signed-off-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/26246


Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
Reviewed-by: default avatarKonrad Sztyber <ksztyber@nvidia.com>
Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
Community-CI: Mellanox Build Bot
parent ba76060e
Loading
Loading
Loading
Loading
+19 −6
Original line number Diff line number Diff line
@@ -696,6 +696,23 @@ nvme_rdma_qpair_set_poller(struct spdk_nvme_qpair *qpair)
	return 0;
}

static void
nvme_rdma_qpair_release_poller(struct nvme_rdma_qpair *rqpair)
{
	struct nvme_rdma_poll_group *group = nvme_rdma_poll_group(rqpair->qpair.poll_group);
	struct nvme_rdma_poller *poller = rqpair->poller;

	assert(poller);

	if (!poller->srq) {
		assert(rqpair->poller->required_num_wc >= WC_PER_QPAIR(rqpair->num_entries));
		poller->required_num_wc -= WC_PER_QPAIR(rqpair->num_entries);
	}

	nvme_rdma_poll_group_put_poller(group, poller);
	rqpair->poller = NULL;
}

static int
nvme_rdma_qpair_init(struct nvme_rdma_qpair *rqpair)
{
@@ -2067,12 +2084,7 @@ nvme_rdma_qpair_destroy(struct nvme_rdma_qpair *rqpair)
	}

	if (rqpair->poller) {
		struct nvme_rdma_poll_group     *group;

		assert(qpair->poll_group);
		group = nvme_rdma_poll_group(qpair->poll_group);

		nvme_rdma_poll_group_put_poller(group, rqpair->poller);
		nvme_rdma_qpair_release_poller(rqpair);

		rqpair->poller = NULL;
		rqpair->cq = NULL;
@@ -3321,6 +3333,7 @@ static void
nvme_rdma_poll_group_put_poller(struct nvme_rdma_poll_group *group, struct nvme_rdma_poller *poller)
{
	assert(poller->refcnt > 0);

	if (--poller->refcnt == 0) {
		STAILQ_REMOVE(&group->pollers, poller, nvme_rdma_poller, link);
		group->num_pollers--;
+28 −3
Original line number Diff line number Diff line
@@ -1268,7 +1268,7 @@ test_nvme_rdma_qpair_set_poller(void)
	struct nvme_rdma_poll_group *group;
	struct spdk_nvme_transport_poll_group *tgroup;
	struct nvme_rdma_poller *poller;
	struct nvme_rdma_qpair rqpair = {};
	struct nvme_rdma_qpair rqpair = {}, rqpair_2 = {};
	struct rdma_cm_id cm_id = {};

	/* Case1: Test function nvme_rdma_poll_group_create */
@@ -1284,6 +1284,9 @@ test_nvme_rdma_qpair_set_poller(void)
	rqpair.qpair.poll_group = tgroup;
	rqpair.qpair.trtype = SPDK_NVME_TRANSPORT_RDMA;
	rqpair.cm_id = &cm_id;
	rqpair_2.qpair.poll_group = tgroup;
	rqpair_2.qpair.trtype = SPDK_NVME_TRANSPORT_RDMA;
	rqpair_2.cm_id = &cm_id;

	/* Test1: Function ibv_create_cq failed */
	cm_id.verbs = (void *)0xFEEDBEEF;
@@ -1324,7 +1327,7 @@ test_nvme_rdma_qpair_set_poller(void)

	rqpair.qpair.poll_group_tailq_head = &tgroup->disconnected_qpairs;

	nvme_rdma_poll_group_put_poller(group, rqpair.poller);
	nvme_rdma_qpair_release_poller(&rqpair);
	CU_ASSERT(STAILQ_EMPTY(&group->pollers));

	rqpair.qpair.poll_group_tailq_head = &tgroup->connected_qpairs;
@@ -1353,7 +1356,29 @@ test_nvme_rdma_qpair_set_poller(void)

	rqpair.qpair.poll_group_tailq_head = &tgroup->disconnected_qpairs;

	nvme_rdma_poll_group_put_poller(group, rqpair.poller);
	/* Test 6: Add and remove on more qpair, check required_num_wc */
	rqpair_2.cq = NULL;
	rqpair_2.num_entries = DEFAULT_NVME_RDMA_CQ_SIZE - 1;

	rc = nvme_rdma_qpair_set_poller(&rqpair_2.qpair);
	CU_ASSERT(rc == 0);
	poller = STAILQ_FIRST(&group->pollers);
	SPDK_CU_ASSERT_FATAL(poller != NULL);
	CU_ASSERT(poller->current_num_wc == DEFAULT_NVME_RDMA_CQ_SIZE * 4);
	CU_ASSERT(poller->required_num_wc == (DEFAULT_NVME_RDMA_CQ_SIZE - 1) * 4);
	CU_ASSERT(rqpair_2.cq == poller->cq);
	CU_ASSERT(rqpair_2.poller == poller);

	nvme_rdma_qpair_release_poller(&rqpair_2);
	poller = STAILQ_FIRST(&group->pollers);
	SPDK_CU_ASSERT_FATAL(poller != NULL);
	CU_ASSERT(poller->current_num_wc == DEFAULT_NVME_RDMA_CQ_SIZE * 4);
	CU_ASSERT(poller->required_num_wc == (DEFAULT_NVME_RDMA_CQ_SIZE - 1) * 2);
	CU_ASSERT(rqpair.cq == poller->cq);
	CU_ASSERT(rqpair.poller == poller);

	/* Cleanup */
	nvme_rdma_qpair_release_poller(&rqpair);
	CU_ASSERT(STAILQ_EMPTY(&group->pollers));

	rc = nvme_rdma_poll_group_destroy(tgroup);