X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_vhost%2Fvhost.h;h=22564f1c345fd139fa74539172e9776b9cf44caa;hb=dcf9ff148c0bd80da0c86dd4e39e5f34252801c3;hp=df2107b5fe71c1f3ea012e06731d4ad0f1ac17c2;hpb=552e8fd3d2b461e40dc59777d2de738499bc3eaf;p=dpdk.git diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index df2107b5fe..22564f1c34 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -61,6 +62,19 @@ struct buf_vector { uint32_t desc_idx; }; +/* + * A structure to hold some fields needed in zero copy code path, + * mainly for associating an mbuf with the right desc_idx. + */ +struct zcopy_mbuf { + struct rte_mbuf *mbuf; + uint32_t desc_idx; + uint16_t in_use; + + TAILQ_ENTRY(zcopy_mbuf) next; +}; +TAILQ_HEAD(zcopy_mbuf_list, zcopy_mbuf); + /** * Structure contains variables relevant to RX/TX virtqueues. */ @@ -70,8 +84,8 @@ struct vhost_virtqueue { struct vring_used *used; uint32_t size; - /* Last index used on the available ring */ - volatile uint16_t last_used_idx; + uint16_t last_avail_idx; + uint16_t last_used_idx; #define VIRTIO_INVALID_EVENTFD (-1) #define VIRTIO_UNINITIALIZED_EVENTFD (-2) @@ -85,6 +99,15 @@ struct vhost_virtqueue { /* Physical address of used ring, for logging */ uint64_t log_guest_addr; + + uint16_t nr_zmbuf; + uint16_t zmbuf_size; + uint16_t last_zmbuf_idx; + struct zcopy_mbuf *zmbufs; + struct zcopy_mbuf_list zmbuf_list; + + struct vring_used_elem *shadow_used_ring; + uint16_t shadow_used_idx; } __rte_cache_aligned; /* Old kernels have no such macro defined */ @@ -114,6 +137,12 @@ struct vhost_virtqueue { #define VIRTIO_F_VERSION_1 32 #endif +struct guest_page { + uint64_t guest_phys_addr; + uint64_t host_phys_addr; + uint64_t size; +}; + /** * Device structure contains all configuration information relating * to the device. @@ -129,6 +158,7 @@ struct virtio_net { /* to tell if we need broadcast rarp packet */ rte_atomic16_t broadcast_rarp; uint32_t virt_qp_nb; + int dequeue_zero_copy; struct vhost_virtqueue *virtqueue[VHOST_MAX_QUEUE_PAIRS * 2]; #define IF_NAME_SZ (PATH_MAX > IFNAMSIZ ? PATH_MAX : IFNAMSIZ) char ifname[IF_NAME_SZ]; @@ -137,6 +167,9 @@ struct virtio_net { uint64_t log_addr; struct ether_addr mac; + uint32_t nr_guest_pages; + uint32_t max_guest_pages; + struct guest_page *guest_pages; } __rte_cache_aligned; /** @@ -217,6 +250,26 @@ gpa_to_vva(struct virtio_net *dev, uint64_t gpa) return 0; } +/* Convert guest physical address to host physical address */ +static inline phys_addr_t __attribute__((always_inline)) +gpa_to_hpa(struct virtio_net *dev, uint64_t gpa, uint64_t size) +{ + uint32_t i; + struct guest_page *page; + + 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; +} + struct virtio_net_device_ops const *notify_ops; struct virtio_net *get_device(int vid); @@ -228,9 +281,12 @@ void vhost_destroy_device(int); int alloc_vring_queue_pair(struct virtio_net *dev, uint32_t qp_idx); void vhost_set_ifname(int, const char *if_name, unsigned int if_len); +void vhost_enable_dequeue_zero_copy(int vid); /* - * Backend-specific cleanup. Defined by vhost-cuse and vhost-user. + * Backend-specific cleanup. + * + * TODO: fix it; we have one backend now */ void vhost_backend_cleanup(struct virtio_net *dev);