Commit 0cdb08b0 authored by zkhatami88's avatar zkhatami88 Committed by Jim Harris
Browse files

env: add size parameter to spdk_mem_map_translate



Change-Id: I808101edaf4d75613baf19a950915f1d8e75b1af
Signed-off-by: default avatarzkhatami88 <z.khatami88@gmail.com>
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/413154


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarZahra Khatami <zahra.k.khatami@oracle.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
parent f32b3ea9
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -9,6 +9,12 @@ on each call. This allows multiple callers to query I/O statistics without confl
with each other. Existing users will need to adjust their code to record the previous
I/O statistics to calculate the delta between calls.

### Env

The spdk_mem_map_translate() function now takes a size parameter to indicate the size of
the memory region.  This can be used by environment implementations to validate the
requested translation.

### git pre-commit and pre-push hooks

The pre-commit hook will run `scripts/check_format.sh` and verify there are no formating
+4 −2
Original line number Diff line number Diff line
@@ -1007,10 +1007,12 @@ int spdk_mem_map_clear_translation(struct spdk_mem_map *map, uint64_t vaddr, uin
 *
 * \param map Memory map.
 * \param vaddr Virtual address.
 * \param size Size of memory region.
 *
 * \return the translation of 2MB hugepage mapping.
 * \return the translation of vaddr stored in the map, or default_translation
 * as specified in spdk_mem_map_alloc() if vaddr is not present in the map.
 */
uint64_t spdk_mem_map_translate(const struct spdk_mem_map *map, uint64_t vaddr);
uint64_t spdk_mem_map_translate(const struct spdk_mem_map *map, uint64_t vaddr, uint64_t size);

/**
 * Register the specified memory region for address translation.
+4 −4
Original line number Diff line number Diff line
@@ -239,7 +239,7 @@ spdk_mem_register(void *vaddr, size_t len)
		uint64_t ref_count;

		/* In g_mem_reg_map, the "translation" is the reference count */
		ref_count = spdk_mem_map_translate(g_mem_reg_map, (uint64_t)vaddr);
		ref_count = spdk_mem_map_translate(g_mem_reg_map, (uint64_t)vaddr, VALUE_2MB);
		spdk_mem_map_set_translation(g_mem_reg_map, (uint64_t)vaddr, VALUE_2MB, ref_count + 1);

		if (ref_count > 0) {
@@ -302,7 +302,7 @@ spdk_mem_unregister(void *vaddr, size_t len)
	seg_vaddr = vaddr;
	seg_len = len;
	while (seg_len > 0) {
		ref_count = spdk_mem_map_translate(g_mem_reg_map, (uint64_t)seg_vaddr);
		ref_count = spdk_mem_map_translate(g_mem_reg_map, (uint64_t)seg_vaddr, VALUE_2MB);
		if (ref_count == 0) {
			pthread_mutex_unlock(&g_spdk_mem_map_mutex);
			return -EINVAL;
@@ -315,7 +315,7 @@ spdk_mem_unregister(void *vaddr, size_t len)
	seg_len = 0;
	while (len > 0) {
		/* In g_mem_reg_map, the "translation" is the reference count */
		ref_count = spdk_mem_map_translate(g_mem_reg_map, (uint64_t)vaddr);
		ref_count = spdk_mem_map_translate(g_mem_reg_map, (uint64_t)vaddr, VALUE_2MB);
		spdk_mem_map_set_translation(g_mem_reg_map, (uint64_t)vaddr, VALUE_2MB, ref_count - 1);

		if (ref_count > 1) {
@@ -471,7 +471,7 @@ spdk_mem_map_clear_translation(struct spdk_mem_map *map, uint64_t vaddr, uint64_
}

uint64_t
spdk_mem_map_translate(const struct spdk_mem_map *map, uint64_t vaddr)
spdk_mem_map_translate(const struct spdk_mem_map *map, uint64_t vaddr, uint64_t size)
{
	const struct map_1gb *map_1gb;
	const struct map_2mb *map_2mb;
+2 −2
Original line number Diff line number Diff line
@@ -404,7 +404,7 @@ spdk_vtophys_notify(void *cb_ctx, struct spdk_mem_map *map,
				 * we need to unmap the range from the IOMMU
				 */
				if (g_vfio.enabled) {
					paddr = spdk_mem_map_translate(map, (uint64_t)vaddr);
					paddr = spdk_mem_map_translate(map, (uint64_t)vaddr, VALUE_2MB);
					rc = vtophys_iommu_unmap_dma(paddr, VALUE_2MB);
					if (rc) {
						return -EFAULT;
@@ -618,7 +618,7 @@ spdk_vtophys(void *buf)

	vaddr = (uint64_t)buf;

	paddr_2mb = spdk_mem_map_translate(g_vtophys_map, vaddr);
	paddr_2mb = spdk_mem_map_translate(g_vtophys_map, vaddr, VALUE_2MB);

	/*
	 * SPDK_VTOPHYS_ERROR has all bits set, so if the lookup returned SPDK_VTOPHYS_ERROR,
+5 −3
Original line number Diff line number Diff line
@@ -687,7 +687,7 @@ nvme_rdma_mr_map_notify(void *cb_ctx, struct spdk_mem_map *map,
		}
		break;
	case SPDK_MEM_MAP_NOTIFY_UNREGISTER:
		mr = (struct ibv_mr *)spdk_mem_map_translate(map, (uint64_t)vaddr);
		mr = (struct ibv_mr *)spdk_mem_map_translate(map, (uint64_t)vaddr, size);
		rc = spdk_mem_map_clear_translation(map, (uint64_t)vaddr, size);
		if (mr) {
			ibv_dereg_mr(mr);
@@ -911,7 +911,8 @@ nvme_rdma_build_contig_request(struct nvme_rdma_qpair *rqpair, struct nvme_reque
	assert(req->payload_size != 0);
	assert(nvme_payload_type(&req->payload) == NVME_PAYLOAD_TYPE_CONTIG);

	mr = (struct ibv_mr *)spdk_mem_map_translate(rqpair->mr_map->map, (uint64_t)payload);
	mr = (struct ibv_mr *)spdk_mem_map_translate(rqpair->mr_map->map, (uint64_t)payload,
			req->payload_size);
	if (mr == NULL) {
		return -1;
	}
@@ -954,7 +955,8 @@ nvme_rdma_build_sgl_request(struct nvme_rdma_qpair *rqpair, struct nvme_request
		return -1;
	}

	mr = (struct ibv_mr *)spdk_mem_map_translate(rqpair->mr_map->map, (uint64_t)virt_addr);
	mr = (struct ibv_mr *)spdk_mem_map_translate(rqpair->mr_map->map, (uint64_t)virt_addr,
			req->payload_size);
	if (mr == NULL) {
		return -1;
	}
Loading