ipc: end multiprocess thread during cleanup
[dpdk.git] / lib / vhost / vhost.h
index b0bad49..b3f0c1d 100644 (file)
@@ -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 * 2)
+#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,15 +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 src_iovec[VHOST_MAX_ASYNC_VEC];
-       struct iovec dst_iovec[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;
@@ -394,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;
@@ -587,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)
@@ -597,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) {
@@ -702,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.