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

rdma: create a list for qpairs pending send transfers



By creating a list of qpairs, we can avoid looping over every connected
qpair to process sends each time we poll.

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


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 9d63933b
Loading
Loading
Loading
Loading
+17 −9
Original line number Diff line number Diff line
@@ -375,6 +375,8 @@ struct spdk_nvmf_rdma_qpair {

	TAILQ_ENTRY(spdk_nvmf_rdma_qpair)	link;

	STAILQ_ENTRY(spdk_nvmf_rdma_qpair)	send_link;

	/* IBV queue pair attributes: they are used to manage
	 * qp state and recover from errors.
	 */
@@ -415,6 +417,8 @@ struct spdk_nvmf_rdma_poller {

	TAILQ_HEAD(, spdk_nvmf_rdma_qpair)	qpairs;

	STAILQ_HEAD(, spdk_nvmf_rdma_qpair)	qpairs_pending_send;

	TAILQ_ENTRY(spdk_nvmf_rdma_poller)	link;
};

@@ -1041,6 +1045,7 @@ nvmf_rdma_qpair_queue_send_wrs(struct spdk_nvmf_rdma_qpair *rqpair, struct ibv_s
	if (rqpair->sends_to_post.first == NULL) {
		rqpair->sends_to_post.first = first;
		rqpair->sends_to_post.last = last;
		STAILQ_INSERT_TAIL(&rqpair->poller->qpairs_pending_send, rqpair, send_link);
	} else {
		rqpair->sends_to_post.last->next = first;
		rqpair->sends_to_post.last = last;
@@ -2955,6 +2960,7 @@ spdk_nvmf_rdma_poll_group_create(struct spdk_nvmf_transport *transport)
		poller->group = rgroup;

		TAILQ_INIT(&poller->qpairs);
		STAILQ_INIT(&poller->qpairs_pending_send);

		TAILQ_INSERT_TAIL(&rgroup->pollers, poller, link);
		if (transport->opts.no_srq == false && device->attr.max_srq != 0) {
@@ -3277,16 +3283,18 @@ _poller_submit_sends(struct spdk_nvmf_rdma_transport *rtransport,
	struct ibv_send_wr		*bad_wr = NULL;
	int				rc;

	TAILQ_FOREACH(rqpair, &rpoller->qpairs, link) {
		if (rqpair->sends_to_post.first != NULL) {
	while (!STAILQ_EMPTY(&rpoller->qpairs_pending_send)) {
		rqpair = STAILQ_FIRST(&rpoller->qpairs_pending_send);
		assert(rqpair->sends_to_post.first != NULL);
		rc = ibv_post_send(rqpair->cm_id->qp, rqpair->sends_to_post.first, &bad_wr);

		/* bad wr always points to the first wr that failed. */
		if (rc) {
			_qp_reset_failed_sends(rtransport, rqpair, bad_wr, rc);
		}
		rqpair->sends_to_post.first = NULL;
		rqpair->sends_to_post.last = NULL;
		}
		STAILQ_REMOVE_HEAD(&rpoller->qpairs_pending_send, send_link);
	}
}