Commit 1794c395 authored by Alexey Marchuk's avatar Alexey Marchuk Committed by Konrad Sztyber
Browse files

nvme/rdma: Allocate memory domain in rdma provider



Next patches add data_transfer function to a memory domain,
for mlx5_dv provider, that means we can't use a memory
domain created via rdma_utils. In future, memory domain
will hold a qpair pointer, to minize changes we create
a memory domain per qpair in this patch
The verbs provider still uses rdma_utils library.

Signed-off-by: default avatarAlexey Marchuk <alexeymar@nvidia.com>
Change-Id: I53c20b70901c1061c8a067c612dc4ce6b9a3999a
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/24692


Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Community-CI: Community CI Samsung <spdk.community.ci.samsung@gmail.com>
parent a4c63447
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ struct spdk_rdma_provider_recv_wr_list {
struct spdk_rdma_provider_qp {
	struct ibv_qp *qp;
	struct rdma_cm_id *cm_id;
	struct spdk_memory_domain *domain;
	struct spdk_rdma_provider_send_wr_list send_wrs;
	struct spdk_rdma_provider_recv_wr_list recv_wrs;
	struct spdk_rdma_provider_qp_stats *stats;
+2 −15
Original line number Diff line number Diff line
@@ -220,8 +220,6 @@ struct nvme_rdma_qpair {
	TAILQ_HEAD(, spdk_nvme_rdma_req)	free_reqs;
	TAILQ_HEAD(, spdk_nvme_rdma_req)	outstanding_reqs;

	struct spdk_memory_domain		*memory_domain;

	/* Count of outstanding send objects */
	uint16_t				current_num_sends;

@@ -726,12 +724,6 @@ nvme_rdma_qpair_init(struct nvme_rdma_qpair *rqpair)
		return -1;
	}

	rqpair->memory_domain = spdk_rdma_utils_get_memory_domain(rqpair->rdma_qp->qp->pd);
	if (!rqpair->memory_domain) {
		SPDK_ERRLOG("Failed to get memory domain\n");
		return -1;
	}

	/* ibv_create_qp will change the values in attr.cap. Make sure we store the proper value. */
	rqpair->max_send_sge = spdk_min(NVME_RDMA_DEFAULT_TX_SGE, attr.cap.max_send_sge);
	rqpair->max_recv_sge = spdk_min(NVME_RDMA_DEFAULT_RX_SGE, attr.cap.max_recv_sge);
@@ -1384,7 +1376,7 @@ nvme_rdma_get_memory_translation(struct nvme_request *req, struct nvme_rdma_qpai

		rc = spdk_memory_domain_translate_data(req->payload.opts->memory_domain,
						       req->payload.opts->memory_domain_ctx,
						       rqpair->memory_domain, &ctx, _ctx->addr,
						       rqpair->rdma_qp->domain, &ctx, _ctx->addr,
						       _ctx->length, &dma_translation);
		if (spdk_unlikely(rc) || dma_translation.iov_count != 1) {
			SPDK_ERRLOG("DMA memory translation failed, rc %d, iov count %u\n", rc, dma_translation.iov_count);
@@ -2079,11 +2071,6 @@ nvme_rdma_ctrlr_delete_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_
	nvme_rdma_qpair_abort_reqs(qpair, qpair->abort_dnr);
	nvme_qpair_deinit(qpair);

	if (spdk_rdma_utils_put_memory_domain(rqpair->memory_domain) != 0) {
		SPDK_ERRLOG("Failed to release memory domain\n");
		assert(0);
	}

	spdk_free(rqpair);

	return 0;
@@ -3315,7 +3302,7 @@ nvme_rdma_ctrlr_get_memory_domains(const struct spdk_nvme_ctrlr *ctrlr,
	struct nvme_rdma_qpair *rqpair = nvme_rdma_qpair(ctrlr->adminq);

	if (domains && array_size > 0) {
		domains[0] = rqpair->memory_domain;
		domains[0] = rqpair->rdma_qp->domain;
	}

	return 1;
+1 −1
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@
SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..)
include $(SPDK_ROOT_DIR)/mk/spdk.common.mk

SO_VER := 6
SO_VER := 7
SO_MINOR := 0

SPDK_MAP_FILE = $(abspath $(CURDIR)/spdk_rdma_provider.map)
+19 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
#include "spdk/stdinc.h"
#include "spdk/string.h"
#include "spdk/likely.h"
#include "spdk/dma.h"

#include "spdk_internal/rdma_provider.h"
#include "spdk/log.h"
@@ -17,6 +18,7 @@

struct spdk_rdma_mlx5_dv_qp {
	struct spdk_rdma_provider_qp common;
	struct spdk_memory_domain_rdma_ctx domain_ctx;
	struct ibv_qp_ex *qpex;
};

@@ -86,6 +88,8 @@ spdk_rdma_provider_qp_create(struct rdma_cm_id *cm_id,
		.comp_mask = IBV_QP_INIT_ATTR_PD | IBV_QP_INIT_ATTR_SEND_OPS_FLAGS,
		.pd = qp_attr->pd ? qp_attr->pd : cm_id->pd
	};
	struct spdk_memory_domain_ctx ctx = {};
	int rc;

	assert(dv_qp_attr.pd);

@@ -123,6 +127,18 @@ spdk_rdma_provider_qp_create(struct rdma_cm_id *cm_id,
		spdk_rdma_provider_qp_destroy(&mlx5_qp->common);
		return NULL;
	}
	mlx5_qp->domain_ctx.size = sizeof(mlx5_qp->domain_ctx);
	mlx5_qp->domain_ctx.ibv_pd = qp_attr->pd;
	ctx.size = sizeof(ctx);
	ctx.user_ctx = &mlx5_qp->domain_ctx;
	ctx.user_ctx_size = mlx5_qp->domain_ctx.size;
	rc = spdk_memory_domain_create(&mlx5_qp->common.domain, SPDK_DMA_DEVICE_TYPE_RDMA, &ctx,
				       SPDK_RDMA_DMA_DEVICE);
	if (rc) {
		SPDK_ERRLOG("Failed to create memory domain\n");
		spdk_rdma_provider_qp_destroy(&mlx5_qp->common);
		return NULL;
	}

	qp_attr->cap = dv_qp_attr.cap;

@@ -199,6 +215,9 @@ spdk_rdma_provider_qp_destroy(struct spdk_rdma_provider_qp *spdk_rdma_qp)
			SPDK_ERRLOG("Failed to destroy ibv qp %p, rc %d\n", mlx5_qp->common.qp, rc);
		}
	}
	if (spdk_rdma_qp->domain) {
		spdk_memory_domain_destroy(spdk_rdma_qp->domain);
	}

	free(mlx5_qp);
}
+11 −2
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@
#include "spdk/likely.h"

#include "spdk_internal/rdma_provider.h"
#include "spdk_internal/rdma_utils.h"
#include "spdk/log.h"

struct spdk_rdma_provider_qp *
@@ -52,10 +53,15 @@ spdk_rdma_provider_qp_create(struct rdma_cm_id *cm_id,
		free(spdk_rdma_qp);
		return NULL;
	}

	qp_attr->cap = attr.cap;
	spdk_rdma_qp->qp = cm_id->qp;
	spdk_rdma_qp->cm_id = cm_id;
	spdk_rdma_qp->domain = spdk_rdma_utils_get_memory_domain(qp_attr->pd);
	if (!spdk_rdma_qp->domain) {
		spdk_rdma_provider_qp_destroy(spdk_rdma_qp);
		return NULL;
	}

	qp_attr->cap = attr.cap;

	return spdk_rdma_qp;
}
@@ -93,6 +99,9 @@ spdk_rdma_provider_qp_destroy(struct spdk_rdma_provider_qp *spdk_rdma_qp)
	if (!spdk_rdma_qp->shared_stats) {
		free(spdk_rdma_qp->stats);
	}
	if (spdk_rdma_qp->domain) {
		spdk_rdma_utils_put_memory_domain(spdk_rdma_qp->domain);
	}

	free(spdk_rdma_qp);
}
Loading