Commit 8ffb2c09 authored by Alexey Marchuk's avatar Alexey Marchuk Committed by Tomasz Zawadzki
Browse files

lib/rdma_utils: Explicit access flags to create memmap



This provides more flexibility to the caller

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


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
parent 8a01b4d6
Loading
Loading
Loading
Loading
+2 −7
Original line number Diff line number Diff line
@@ -29,11 +29,6 @@ struct spdk_rdma_utils_memory_translation {
	uint8_t translation_type;
};

enum spdk_rdma_utils_memory_map_role {
	SPDK_RDMA_UTILS_MEMORY_MAP_ROLE_TARGET,
	SPDK_RDMA_UTILS_MEMORY_MAP_ROLE_INITIATOR
};

struct spdk_rdma_utils_mem_map;

/**
@@ -42,12 +37,12 @@ struct spdk_rdma_utils_mem_map;
 *
 * \param pd Protection Domain which will be used to create Memory Regions
 * \param hooks Optional hooks which are used to create Protection Domain or ger RKey
 * \param role Specifies whether this map is used by RDMA target or initiator, determines access flags of registered MRs
 * \param access_flags Memory access permissions, bitwise combination of values from \b enum ibv_access_flags
 * \return Pointer to memory map or NULL on failure
 */
struct spdk_rdma_utils_mem_map *
spdk_rdma_utils_create_mem_map(struct ibv_pd *pd, struct spdk_nvme_rdma_hooks *hooks,
			       enum spdk_rdma_utils_memory_map_role role);
			       uint32_t access_flags);

/**
 * Free previously allocated memory map
+2 −2
Original line number Diff line number Diff line
@@ -1171,7 +1171,7 @@ nvme_rdma_connect_established(struct nvme_rdma_qpair *rqpair, int ret)

	assert(!rqpair->mr_map);
	rqpair->mr_map = spdk_rdma_utils_create_mem_map(rqpair->rdma_qp->qp->pd, &g_nvme_hooks,
			 SPDK_RDMA_UTILS_MEMORY_MAP_ROLE_INITIATOR);
			 IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_READ | IBV_ACCESS_REMOTE_WRITE);
	if (!rqpair->mr_map) {
		SPDK_ERRLOG("Unable to register RDMA memory translation map\n");
		return -1;
@@ -2937,7 +2937,7 @@ nvme_rdma_poller_create(struct nvme_rdma_poll_group *group, struct ibv_context *
		}

		poller->mr_map = spdk_rdma_utils_create_mem_map(poller->pd, &g_nvme_hooks,
				 SPDK_RDMA_UTILS_MEMORY_MAP_ROLE_INITIATOR);
				 IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_READ | IBV_ACCESS_REMOTE_WRITE);
		if (poller->mr_map == NULL) {
			SPDK_ERRLOG("Unable to create memory map.\n");
			goto fail;
+1 −2
Original line number Diff line number Diff line
@@ -2560,8 +2560,7 @@ create_ib_device(struct spdk_nvmf_rdma_transport *rtransport, struct ibv_context

	assert(device->map == NULL);

	device->map = spdk_rdma_utils_create_mem_map(device->pd, &g_nvmf_hooks,
			SPDK_RDMA_UTILS_MEMORY_MAP_ROLE_TARGET);
	device->map = spdk_rdma_utils_create_mem_map(device->pd, &g_nvmf_hooks, IBV_ACCESS_LOCAL_WRITE);
	if (!device->map) {
		SPDK_ERRLOG("Unable to allocate memory map for listen address\n");
		destroy_ib_device(rtransport, device);
+11 −19
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ struct spdk_rdma_utils_mem_map {
	struct ibv_pd				*pd;
	struct spdk_nvme_rdma_hooks		*hooks;
	uint32_t				ref_count;
	enum spdk_rdma_utils_memory_map_role	role;
	uint32_t				access_flags;
	LIST_ENTRY(spdk_rdma_utils_mem_map)	link;
};

@@ -47,7 +47,7 @@ rdma_utils_mem_notify(void *cb_ctx, struct spdk_mem_map *map,
	struct spdk_rdma_utils_mem_map *rmap = cb_ctx;
	struct ibv_pd *pd = rmap->pd;
	struct ibv_mr *mr;
	uint32_t access_flags = 0;
	uint32_t access_flags;
	int rc;

	switch (action) {
@@ -56,20 +56,7 @@ rdma_utils_mem_notify(void *cb_ctx, struct spdk_mem_map *map,
			rc = spdk_mem_map_set_translation(map, (uint64_t)vaddr, size,
							  rmap->hooks->get_rkey(pd, vaddr, size));
		} else {
			switch (rmap->role) {
			case SPDK_RDMA_UTILS_MEMORY_MAP_ROLE_TARGET:
				access_flags = IBV_ACCESS_LOCAL_WRITE;
				if (pd->context->device->transport_type == IBV_TRANSPORT_IWARP) {
					/* IWARP requires REMOTE_WRITE permission for RDMA_READ operation */
					access_flags |= IBV_ACCESS_REMOTE_WRITE;
				}
				break;
			case SPDK_RDMA_UTILS_MEMORY_MAP_ROLE_INITIATOR:
				access_flags = IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_READ | IBV_ACCESS_REMOTE_WRITE;
				break;
			default:
				SPDK_UNREACHABLE();
			}
			access_flags = rmap->access_flags;
#ifdef IBV_ACCESS_OPTIONAL_FIRST
			access_flags |= IBV_ACCESS_RELAXED_ORDERING;
#endif
@@ -124,14 +111,19 @@ _rdma_free_mem_map(struct spdk_rdma_utils_mem_map *map)

struct spdk_rdma_utils_mem_map *
spdk_rdma_utils_create_mem_map(struct ibv_pd *pd, struct spdk_nvme_rdma_hooks *hooks,
			       enum spdk_rdma_utils_memory_map_role role)
			       uint32_t access_flags)
{
	struct spdk_rdma_utils_mem_map *map;

	if (pd->context->device->transport_type == IBV_TRANSPORT_IWARP) {
		/* IWARP requires REMOTE_WRITE permission for RDMA_READ operation */
		access_flags |= IBV_ACCESS_REMOTE_WRITE;
	}

	pthread_mutex_lock(&g_rdma_mr_maps_mutex);
	/* Look up existing mem map registration for this pd */
	LIST_FOREACH(map, &g_rdma_utils_mr_maps, link) {
		if (map->pd == pd && map->role == role) {
		if (map->pd == pd && map->access_flags == access_flags) {
			map->ref_count++;
			pthread_mutex_unlock(&g_rdma_mr_maps_mutex);
			return map;
@@ -151,7 +143,7 @@ spdk_rdma_utils_create_mem_map(struct ibv_pd *pd, struct spdk_nvme_rdma_hooks *h
	map->pd = pd;
	map->ref_count = 1;
	map->hooks = hooks;
	map->role = role;
	map->access_flags = access_flags;
	map->map = spdk_mem_map_alloc(0, &g_rdma_map_ops, map);
	if (!map->map) {
		SPDK_ERRLOG("Unable to create memory map\n");
+1 −1
Original line number Diff line number Diff line
@@ -889,7 +889,7 @@ accel_mlx5_create_cb(void *io_device, void *ctx_buf)
		 * Divide user defined qp_size by two for simplicity */
		dev->max_reqs = g_accel_mlx5.attr.qp_size / 2;
		dev->mmap = spdk_rdma_utils_create_mem_map(dev_ctx->pd, NULL,
				SPDK_RDMA_UTILS_MEMORY_MAP_ROLE_INITIATOR);
				IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_READ | IBV_ACCESS_REMOTE_WRITE);
		if (!dev->mmap) {
			SPDK_ERRLOG("Failed to create memory map\n");
			accel_mlx5_qp_destroy(dev->qp);
Loading