Commit 4f4bc79e authored by Ben Walker's avatar Ben Walker Committed by Jim Harris
Browse files

env/vtophys: Remove duplicated code in spdk_vtophys_notify



Both the register and unregister paths did the same splitting
on 2MB boundaries, so do that first and then switch on
the action.

Change-Id: I532c42a698c2d423d3ecb48bc0d964e766cf742b
Signed-off-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/375247


Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
parent a10779ca
Loading
Loading
Loading
Loading
+28 −71
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@

#define SHIFT_2MB	21 /* (1 << 21) == 2MB */
#define MASK_2MB	((1ULL << SHIFT_2MB) - 1)
#define VALUE_2MB	(1 << SHIFT_2MB)

#define SHIFT_4KB	12 /* (1 << 12) == 4KB */
#define MASK_4KB	((1ULL << SHIFT_4KB) - 1)
@@ -464,10 +465,12 @@ vtophys_get_paddr(uint64_t vaddr)
}

static int
spdk_vtophys_register(void *vaddr, uint64_t len)
spdk_vtophys_notify(void *cb_ctx, struct spdk_mem_map *map,
		    enum spdk_mem_map_notify_action action,
		    void *vaddr, size_t len)
{
	uint64_t vfn_2mb;
	int rc;
	int rc = 0;
	uint64_t paddr;

	if ((uintptr_t)vaddr & ~MASK_128TB) {
		DEBUG_PRINT("invalid usermode virtual address %p\n", vaddr);
@@ -480,15 +483,13 @@ spdk_vtophys_register(void *vaddr, uint64_t len)
		return -EINVAL;
	}

	vfn_2mb = (uintptr_t)vaddr >> SHIFT_2MB;
	len = len >> SHIFT_2MB;

	while (len > 0) {
		uint64_t vaddr = vfn_2mb << SHIFT_2MB;
		uint64_t paddr = vtophys_get_paddr(vaddr);
		switch (action) {
		case SPDK_MEM_MAP_NOTIFY_REGISTER:
			paddr = vtophys_get_paddr((uint64_t)vaddr);

			if (paddr == RTE_BAD_PHYS_ADDR) {
			DEBUG_PRINT("could not get phys addr for 0x%" PRIx64 "\n", vaddr);
				DEBUG_PRINT("could not get phys addr for %p\n", vaddr);
				return -EFAULT;
			}

@@ -497,67 +498,22 @@ spdk_vtophys_register(void *vaddr, uint64_t len)
				return -EINVAL;
			}

		rc = spdk_mem_map_set_translation(g_vtophys_map, vaddr, 1 << SHIFT_2MB, paddr);
		if (rc != 0) {
			return rc;
		}
		vfn_2mb++;
		len--;
	}

	return 0;
}

static int
spdk_vtophys_unregister(void *vaddr, uint64_t len)
{
	uint64_t vfn_2mb;
	int rc;

	if ((uintptr_t)vaddr & ~MASK_128TB) {
		DEBUG_PRINT("invalid usermode virtual address %p\n", vaddr);
		return -EINVAL;
	}

	if (((uintptr_t)vaddr & MASK_2MB) || (len & MASK_2MB)) {
		DEBUG_PRINT("invalid %s parameters, vaddr=%p len=%ju\n",
			    __func__, vaddr, len);
		return -EINVAL;
	}

	vfn_2mb = (uintptr_t)vaddr >> SHIFT_2MB;
	len = len >> SHIFT_2MB;

	while (len > 0) {
		rc = spdk_mem_map_clear_translation(g_vtophys_map, vfn_2mb << SHIFT_2MB, 1 << SHIFT_2MB);
		if (rc != 0) {
			return rc;
		}
		vfn_2mb++;
		len--;
	}

	return 0;
}

static int
spdk_vtophys_notify(void *cb_ctx, struct spdk_mem_map *map,
		    enum spdk_mem_map_notify_action action,
		    void *vaddr, size_t len)
{
	int rc;

	switch (action) {
	case SPDK_MEM_MAP_NOTIFY_REGISTER:
		rc = spdk_vtophys_register(vaddr, len);
			rc = spdk_mem_map_set_translation(g_vtophys_map, (uint64_t)vaddr, VALUE_2MB, paddr);
			break;
		case SPDK_MEM_MAP_NOTIFY_UNREGISTER:
		rc = spdk_vtophys_unregister(vaddr, len);
			rc = spdk_mem_map_clear_translation(g_vtophys_map, (uint64_t)vaddr, VALUE_2MB);
			break;
		default:
			SPDK_UNREACHABLE();
		}

		if (rc != 0) {
			return rc;
		}
		vaddr += VALUE_2MB;
		len -= VALUE_2MB;
	}

	return rc;
}

@@ -582,7 +538,8 @@ spdk_vtophys_register_dpdk_mem(void)
			break;
		}

		spdk_vtophys_register(seg->addr, seg->len);
		spdk_vtophys_notify(NULL, g_vtophys_map, SPDK_MEM_MAP_NOTIFY_REGISTER,
				    seg->addr, seg->len);
	}
}