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: Ben Walker <benjamin.walker@intel.com> Reviewed-on: https://review.gerrithub.io/375247 Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
This commit is contained in:
parent
a10779ca75
commit
4f4bc79e98
@ -62,6 +62,7 @@
|
|||||||
|
|
||||||
#define SHIFT_2MB 21 /* (1 << 21) == 2MB */
|
#define SHIFT_2MB 21 /* (1 << 21) == 2MB */
|
||||||
#define MASK_2MB ((1ULL << SHIFT_2MB) - 1)
|
#define MASK_2MB ((1ULL << SHIFT_2MB) - 1)
|
||||||
|
#define VALUE_2MB (1 << SHIFT_2MB)
|
||||||
|
|
||||||
#define SHIFT_4KB 12 /* (1 << 12) == 4KB */
|
#define SHIFT_4KB 12 /* (1 << 12) == 4KB */
|
||||||
#define MASK_4KB ((1ULL << SHIFT_4KB) - 1)
|
#define MASK_4KB ((1ULL << SHIFT_4KB) - 1)
|
||||||
@ -464,10 +465,12 @@ vtophys_get_paddr(uint64_t vaddr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
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 = 0;
|
||||||
int rc;
|
uint64_t paddr;
|
||||||
|
|
||||||
if ((uintptr_t)vaddr & ~MASK_128TB) {
|
if ((uintptr_t)vaddr & ~MASK_128TB) {
|
||||||
DEBUG_PRINT("invalid usermode virtual address %p\n", vaddr);
|
DEBUG_PRINT("invalid usermode virtual address %p\n", vaddr);
|
||||||
@ -480,15 +483,13 @@ spdk_vtophys_register(void *vaddr, uint64_t len)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
vfn_2mb = (uintptr_t)vaddr >> SHIFT_2MB;
|
|
||||||
len = len >> SHIFT_2MB;
|
|
||||||
|
|
||||||
while (len > 0) {
|
while (len > 0) {
|
||||||
uint64_t vaddr = vfn_2mb << SHIFT_2MB;
|
switch (action) {
|
||||||
uint64_t paddr = vtophys_get_paddr(vaddr);
|
case SPDK_MEM_MAP_NOTIFY_REGISTER:
|
||||||
|
paddr = vtophys_get_paddr((uint64_t)vaddr);
|
||||||
|
|
||||||
if (paddr == RTE_BAD_PHYS_ADDR) {
|
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;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -497,67 +498,22 @@ spdk_vtophys_register(void *vaddr, uint64_t len)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = spdk_mem_map_set_translation(g_vtophys_map, vaddr, 1 << SHIFT_2MB, paddr);
|
rc = spdk_mem_map_set_translation(g_vtophys_map, (uint64_t)vaddr, VALUE_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);
|
|
||||||
break;
|
break;
|
||||||
case SPDK_MEM_MAP_NOTIFY_UNREGISTER:
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
SPDK_UNREACHABLE();
|
SPDK_UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rc != 0) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
vaddr += VALUE_2MB;
|
||||||
|
len -= VALUE_2MB;
|
||||||
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -582,7 +538,8 @@ spdk_vtophys_register_dpdk_mem(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
spdk_vtophys_register(seg->addr, seg->len);
|
spdk_vtophys_notify(NULL, g_vtophys_map, SPDK_MEM_MAP_NOTIFY_REGISTER,
|
||||||
|
seg->addr, seg->len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user