rte_vhost: introduce safe API for GPA translation
This new rte_vhost_va_from_guest_pa API takes an extra len parameter, used to specify the size of the range to be mapped. Effective mapped range is returned via len parameter. Change-Id: Ib3830e1da9e0cb477d99860a03684c665bb3f6ec Reported-by: Yongji Xie <xieyongji@baidu.com> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> Signed-off-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com> Reviewed-on: https://review.gerrithub.io/408720 Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
f9fae3f3a9
commit
e30595fbe3
@ -146,6 +146,46 @@ rte_vhost_gpa_to_vva(struct rte_vhost_memory *mem, uint64_t gpa)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert guest physical address to host virtual address safely
|
||||
*
|
||||
* This variant of rte_vhost_gpa_to_vva() takes care all the
|
||||
* requested length is mapped and contiguous in process address
|
||||
* space.
|
||||
*
|
||||
* @param mem
|
||||
* the guest memory regions
|
||||
* @param gpa
|
||||
* the guest physical address for querying
|
||||
* @param len
|
||||
* the size of the requested area to map,
|
||||
* updated with actual size mapped
|
||||
* @return
|
||||
* the host virtual address on success, 0 on failure */
|
||||
static __rte_always_inline uint64_t
|
||||
rte_vhost_va_from_guest_pa(struct rte_vhost_memory *mem,
|
||||
uint64_t gpa, uint64_t *len)
|
||||
{
|
||||
struct rte_vhost_mem_region *r;
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < mem->nregions; i++) {
|
||||
r = &mem->regions[i];
|
||||
if (gpa >= r->guest_phys_addr &&
|
||||
gpa < r->guest_phys_addr + r->size) {
|
||||
|
||||
if (unlikely(*len > r->guest_phys_addr + r->size - gpa))
|
||||
*len = r->guest_phys_addr + r->size - gpa;
|
||||
|
||||
return gpa - r->guest_phys_addr +
|
||||
r->host_user_addr;
|
||||
}
|
||||
}
|
||||
*len = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define RTE_VHOST_NEED_LOG(features) ((features) & (1ULL << VHOST_F_LOG_ALL))
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user