X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Fvhost%2Fvhost.h;h=b3f0c1d07cc045e7bc0372a355f8eda930d8f991;hb=6e858b4d9244cf53505589673755ab18ac2a4a83;hp=fa92a0d33d800c0db850460565c4ad2e02b9bfd8;hpb=5f89c5e1e9f4e6286f3a9b4635ea768177fabd82;p=dpdk.git diff --git a/lib/vhost/vhost.h b/lib/vhost/vhost.h index fa92a0d33d..b3f0c1d07c 100644 --- a/lib/vhost/vhost.h +++ b/lib/vhost/vhost.h @@ -22,7 +22,7 @@ #include "rte_vhost.h" #include "rte_vdpa.h" -#include "rte_vdpa_dev.h" +#include "vdpa_driver.h" #include "rte_vhost_async.h" @@ -48,8 +48,8 @@ #define MAX_PKT_BURST 32 -#define VHOST_MAX_ASYNC_IT (MAX_PKT_BURST * 2) -#define VHOST_MAX_ASYNC_VEC (BUF_VECTOR_MAX * 4) +#define VHOST_MAX_ASYNC_IT (MAX_PKT_BURST) +#define VHOST_MAX_ASYNC_VEC 2048 #define PACKED_DESC_ENQUEUE_USED_FLAG(w) \ ((w) ? (VRING_DESC_F_AVAIL | VRING_DESC_F_USED | VRING_DESC_F_WRITE) : \ @@ -132,14 +132,15 @@ struct vhost_async { /* operation callbacks for DMA */ struct rte_vhost_async_channel_ops ops; - struct rte_vhost_iov_iter it_pool[VHOST_MAX_ASYNC_IT]; - struct iovec vec_pool[VHOST_MAX_ASYNC_VEC]; + struct rte_vhost_iov_iter iov_iter[VHOST_MAX_ASYNC_IT]; + struct rte_vhost_iovec iovec[VHOST_MAX_ASYNC_VEC]; + uint16_t iter_idx; + uint16_t iovec_idx; /* data transfer status */ struct async_inflight_info *pkts_info; uint16_t pkts_idx; uint16_t pkts_inflight_n; - uint16_t last_pkts_n; union { struct vring_used_elem *descs_split; struct vring_used_elem_packed *buffers_packed; @@ -393,7 +394,7 @@ struct virtio_net { uint16_t mtu; uint8_t status; - struct vhost_device_ops const *notify_ops; + struct rte_vhost_device_ops const *notify_ops; uint32_t nr_guest_pages; uint32_t max_guest_pages; @@ -586,6 +587,20 @@ static __rte_always_inline int guest_page_addrcmp(const void *p1, return 0; } +static __rte_always_inline int guest_page_rangecmp(const void *p1, const void *p2) +{ + const struct guest_page *page1 = (const struct guest_page *)p1; + const struct guest_page *page2 = (const struct guest_page *)p2; + + if (page1->guest_phys_addr >= page2->guest_phys_addr) { + if (page1->guest_phys_addr < page2->guest_phys_addr + page2->size) + return 0; + else + return 1; + } else + return -1; +} + 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) @@ -596,9 +611,9 @@ gpa_to_first_hpa(struct virtio_net *dev, uint64_t gpa, *hpa_size = gpa_size; if (dev->nr_guest_pages >= VHOST_BINARY_SEARCH_THRESH) { - key.guest_phys_addr = gpa & ~(dev->guest_pages[0].size - 1); + key.guest_phys_addr = gpa; page = bsearch(&key, dev->guest_pages, dev->nr_guest_pages, - sizeof(struct guest_page), guest_page_addrcmp); + sizeof(struct guest_page), guest_page_rangecmp); if (page) { if (gpa + gpa_size <= page->guest_phys_addr + page->size) { @@ -701,7 +716,7 @@ void vhost_enable_linearbuf(int vid); int vhost_enable_guest_notification(struct virtio_net *dev, struct vhost_virtqueue *vq, int enable); -struct vhost_device_ops const *vhost_driver_callback_get(const char *path); +struct rte_vhost_device_ops const *vhost_driver_callback_get(const char *path); /* * Backend-specific cleanup.