vhost: improve prefetching in dequeue path
authorMaxime Coquelin <maxime.coquelin@redhat.com>
Fri, 6 Jul 2018 07:04:47 +0000 (09:04 +0200)
committerThomas Monjalon <thomas@monjalon.net>
Tue, 10 Jul 2018 21:13:36 +0000 (23:13 +0200)
This is an optimization to prefetch next buffer while the
current one is being processed.

Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Acked-by: Tiwei Bie <tiwei.bie@intel.com>
lib/librte_vhost/virtio_net.c

index 6339296..2cfd858 100644 (file)
@@ -902,7 +902,13 @@ copy_desc_to_mbuf(struct virtio_net *dev, struct vhost_virtqueue *vq,
                        buf_iova = buf_vec[vec_idx].buf_iova;
                        buf_len = buf_vec[vec_idx].buf_len;
 
-                       rte_prefetch0((void *)(uintptr_t)buf_addr);
+                       /*
+                        * Prefecth desc n + 1 buffer while
+                        * desc n buffer is processed.
+                        */
+                       if (vec_idx + 1 < nr_vec)
+                               rte_prefetch0((void *)(uintptr_t)
+                                               buf_vec[vec_idx + 1].buf_addr);
 
                        buf_offset = 0;
                        buf_avail  = buf_len;
@@ -1134,6 +1140,8 @@ rte_vhost_dequeue_burst(int vid, uint16_t queue_id,
                if (likely(dev->dequeue_zero_copy == 0))
                        update_shadow_used_ring(vq, head_idx, 0);
 
+               rte_prefetch0((void *)(uintptr_t)buf_vec[0].buf_addr);
+
                pkts[i] = rte_pktmbuf_alloc(mbuf_pool);
                if (unlikely(pkts[i] == NULL)) {
                        RTE_LOG(ERR, VHOST_DATA,