diff options
author | Luca Boccassi <luca.boccassi@gmail.com> | 2018-04-23 14:17:55 +0100 |
---|---|---|
committer | Luca Boccassi <luca.boccassi@gmail.com> | 2018-04-23 14:18:31 +0100 |
commit | 18af4227fa5eee002b1a79207935620f6112803e (patch) | |
tree | 2478ed36888eb88a9bcd49fd025f86ee9cab2bef /lib/librte_vhost/vhost.h | |
parent | 39157ec04095ab012d11db23c462844634bfbb8f (diff) |
New upstream version 16.11.6upstream/16.11.6
Change-Id: I7c0e5e32dc051256867f1db5600e269b4b917106
Signed-off-by: Luca Boccassi <luca.boccassi@gmail.com>
Diffstat (limited to 'lib/librte_vhost/vhost.h')
-rw-r--r-- | lib/librte_vhost/vhost.h | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index 9f60ff81..c49db0c0 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h @@ -225,19 +225,24 @@ extern struct virtio_net *vhost_devices[MAX_VHOST_DEVICE]; /* Convert guest physical Address to host virtual address */ static inline uint64_t __attribute__((always_inline)) -gpa_to_vva(struct virtio_net *dev, uint64_t gpa) +gpa_to_vva(struct virtio_net *dev, uint64_t gpa, uint64_t *len) { - struct virtio_memory_region *reg; + struct virtio_memory_region *r; uint32_t i; for (i = 0; i < dev->mem->nregions; i++) { - reg = &dev->mem->regions[i]; - if (gpa >= reg->guest_phys_addr && - gpa < reg->guest_phys_addr + reg->size) { - return gpa - reg->guest_phys_addr + - reg->host_user_addr; + r = &dev->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; } |