From: Patrick Fu Date: Tue, 27 Oct 2020 02:06:08 +0000 (+0800) Subject: vhost: fix guest/host physical address conversion X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=fb4b7a131c9ea45fa6381c7492d7568c302d3cc2;p=dpdk.git vhost: fix guest/host physical address conversion gpa_to_hpa() function almost always fails due to the wrong setup of the binary tree search key. Since there has already been a similar function gpa_to_first_hpa() available in the vhost, instead of fixing the issue in its original logic, gpa_to_hpa() function is rewritten to be a wrapper of the gpa_to_first_hpa() to avoid code redundancy. Fixes: e246896178e6 ("vhost: get guest/host physical address mappings") Fixes: faa9867c4da2 ("vhost: use binary search in address conversion") Cc: stable@dpdk.org Signed-off-by: Patrick Fu Reviewed-by: Maxime Coquelin --- diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index 75d79f80a7..361c9f79b3 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h @@ -563,38 +563,6 @@ static __rte_always_inline int guest_page_addrcmp(const void *p1, return 0; } -/* Convert guest physical address to host physical address */ -static __rte_always_inline rte_iova_t -gpa_to_hpa(struct virtio_net *dev, uint64_t gpa, uint64_t size) -{ - uint32_t i; - struct guest_page *page; - struct guest_page key; - - if (dev->nr_guest_pages >= VHOST_BINARY_SEARCH_THRESH) { - key.guest_phys_addr = gpa; - page = bsearch(&key, dev->guest_pages, dev->nr_guest_pages, - sizeof(struct guest_page), guest_page_addrcmp); - if (page) { - if (gpa + size < page->guest_phys_addr + page->size) - return gpa - page->guest_phys_addr + - page->host_phys_addr; - } - } else { - for (i = 0; i < dev->nr_guest_pages; i++) { - page = &dev->guest_pages[i]; - - if (gpa >= page->guest_phys_addr && - gpa + size < page->guest_phys_addr + - page->size) - return gpa - page->guest_phys_addr + - page->host_phys_addr; - } - } - - return 0; -} - static __rte_always_inline rte_iova_t gpa_to_first_hpa(struct virtio_net *dev, uint64_t gpa, uint64_t gpa_size, uint64_t *hpa_size) @@ -645,6 +613,17 @@ gpa_to_first_hpa(struct virtio_net *dev, uint64_t gpa, return 0; } +/* Convert guest physical address to host physical address */ +static __rte_always_inline rte_iova_t +gpa_to_hpa(struct virtio_net *dev, uint64_t gpa, uint64_t size) +{ + rte_iova_t hpa; + uint64_t hpa_size; + + hpa = gpa_to_first_hpa(dev, gpa, size, &hpa_size); + return hpa_size == size ? hpa : 0; +} + static __rte_always_inline uint64_t hva_to_gpa(struct virtio_net *dev, uint64_t vva, uint64_t len) {