env/vtophys: Break vtophys_get_paddr into two functions

This is in preparation for needing to know if the
address is in the DPDK memsegs on unregister.

Change-Id: Ie2febecae789808ae8ae63ce6889b9bbf3a72aab
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/375248
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:
Ben Walker 2017-08-22 15:43:02 -07:00 committed by Jim Harris
parent 4f4bc79e98
commit fdc397bc2d

View File

@ -418,8 +418,9 @@ spdk_mem_map_translate(const struct spdk_mem_map *map, uint64_t vaddr)
return map_2mb->translation_2mb; return map_2mb->translation_2mb;
} }
/* Try to get the paddr from the DPDK memsegs */
static uint64_t static uint64_t
vtophys_get_paddr(uint64_t vaddr) vtophys_get_paddr_memseg(uint64_t vaddr)
{ {
uintptr_t paddr; uintptr_t paddr;
struct rte_mem_config *mcfg; struct rte_mem_config *mcfg;
@ -442,10 +443,15 @@ vtophys_get_paddr(uint64_t vaddr)
} }
} }
/* The memory is not registered with DPDK. Try to look it up return SPDK_VTOPHYS_ERROR;
* in /proc/self/pagemap. DPDK provides a utility function }
* to do this.
*/ /* Try to get the paddr from /proc/self/pagemap */
static uint64_t
vtophys_get_paddr_pagemap(uint64_t vaddr)
{
uintptr_t paddr;
paddr = rte_mem_virt2phy((void *)vaddr); paddr = rte_mem_virt2phy((void *)vaddr);
if (paddr == 0) { if (paddr == 0) {
/* /*
@ -460,7 +466,6 @@ vtophys_get_paddr(uint64_t vaddr)
return paddr; return paddr;
} }
DEBUG_PRINT("could not find vaddr 0x%" PRIx64 " in DPDK mem config\n", vaddr);
return SPDK_VTOPHYS_ERROR; return SPDK_VTOPHYS_ERROR;
} }
@ -484,13 +489,17 @@ spdk_vtophys_notify(void *cb_ctx, struct spdk_mem_map *map,
} }
while (len > 0) { while (len > 0) {
/* Get the physical address from the DPDK memsegs */
paddr = vtophys_get_paddr_memseg((uint64_t)vaddr);
switch (action) { switch (action) {
case SPDK_MEM_MAP_NOTIFY_REGISTER: case SPDK_MEM_MAP_NOTIFY_REGISTER:
paddr = vtophys_get_paddr((uint64_t)vaddr); if (paddr == SPDK_VTOPHYS_ERROR) {
paddr = vtophys_get_paddr_pagemap((uint64_t)vaddr);
if (paddr == RTE_BAD_PHYS_ADDR) { if (paddr == SPDK_VTOPHYS_ERROR) {
DEBUG_PRINT("could not get phys addr for %p\n", vaddr); DEBUG_PRINT("could not get phys addr for %p\n", vaddr);
return -EFAULT; return -EFAULT;
}
} }
if (paddr & MASK_2MB) { if (paddr & MASK_2MB) {