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

nvme: Add num_connected_qpairs to nvme_transport_poll_group



Add a num_connected_qpairs variable to the
spdk_nvme_transport_poll_group structure and use it in
poll_group_process_completions() in the RDMA transport.

This is helpful to reduce the overhead of
nvme_rdma_poll_group_process_completions() for large scale
configuration.

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


Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
parent f7b85051
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -500,6 +500,7 @@ struct spdk_nvme_transport_poll_group {
	STAILQ_HEAD(, spdk_nvme_qpair)			connected_qpairs;
	STAILQ_HEAD(, spdk_nvme_qpair)			disconnected_qpairs;
	STAILQ_ENTRY(spdk_nvme_transport_poll_group)	link;
	uint32_t					num_connected_qpairs;
};

struct spdk_nvme_ns {
+2 −3
Original line number Diff line number Diff line
@@ -3098,7 +3098,7 @@ nvme_rdma_poll_group_process_completions(struct spdk_nvme_transport_poll_group *
	struct nvme_rdma_qpair			*rqpair;
	struct nvme_rdma_poll_group		*group;
	struct nvme_rdma_poller			*poller;
	int					num_qpairs = 0, batch_size, rc, rc2 = 0;
	int					batch_size, rc, rc2 = 0;
	int64_t					total_completions = 0;
	uint64_t				completions_allowed = 0;
	uint64_t				completions_per_poller = 0;
@@ -3139,10 +3139,9 @@ nvme_rdma_poll_group_process_completions(struct spdk_nvme_transport_poll_group *
			nvme_rdma_fail_qpair(qpair, 0);
			continue;
		}
		num_qpairs++;
	}

	completions_allowed = completions_per_qpair * num_qpairs;
	completions_allowed = completions_per_qpair * tgroup->num_connected_qpairs;
	if (group->num_pollers) {
		completions_per_poller = spdk_max(completions_allowed / group->num_pollers, 1);
	}
+4 −0
Original line number Diff line number Diff line
@@ -650,6 +650,7 @@ nvme_transport_poll_group_create(const struct spdk_nvme_transport *transport)
		group->transport = transport;
		STAILQ_INIT(&group->connected_qpairs);
		STAILQ_INIT(&group->disconnected_qpairs);
		group->num_connected_qpairs = 0;
	}

	return group;
@@ -738,6 +739,8 @@ nvme_transport_poll_group_disconnect_qpair(struct spdk_nvme_qpair *qpair)

		qpair->poll_group_tailq_head = &tgroup->disconnected_qpairs;
		STAILQ_REMOVE(&tgroup->connected_qpairs, qpair, spdk_nvme_qpair, poll_group_stailq);
		assert(tgroup->num_connected_qpairs > 0);
		tgroup->num_connected_qpairs--;
		STAILQ_INSERT_TAIL(&tgroup->disconnected_qpairs, qpair, poll_group_stailq);

		return 0;
@@ -764,6 +767,7 @@ nvme_transport_poll_group_connect_qpair(struct spdk_nvme_qpair *qpair)
			qpair->poll_group_tailq_head = &tgroup->connected_qpairs;
			STAILQ_REMOVE(&tgroup->disconnected_qpairs, qpair, spdk_nvme_qpair, poll_group_stailq);
			STAILQ_INSERT_TAIL(&tgroup->connected_qpairs, qpair, poll_group_stailq);
			tgroup->num_connected_qpairs++;
		}

		return rc == -EINPROGRESS ? 0 : rc;
+2 −0
Original line number Diff line number Diff line
@@ -125,10 +125,12 @@ test_nvme_transport_poll_group_disconnect_qpair(void)
	/* Connected qpairs */
	qpair.poll_group_tailq_head = &tgroup.connected_qpairs;
	STAILQ_INSERT_TAIL(&tgroup.connected_qpairs, &qpair, poll_group_stailq);
	tgroup.num_connected_qpairs++;

	rc = nvme_transport_poll_group_disconnect_qpair(&qpair);
	CU_ASSERT(rc == 0);
	CU_ASSERT(STAILQ_EMPTY(&tgroup.connected_qpairs));
	CU_ASSERT(tgroup.num_connected_qpairs == 0);
	CU_ASSERT(!STAILQ_EMPTY(&tgroup.disconnected_qpairs));
	STAILQ_REMOVE(&tgroup.disconnected_qpairs, &qpair, spdk_nvme_qpair, poll_group_stailq);
	CU_ASSERT(STAILQ_EMPTY(&tgroup.disconnected_qpairs));