[dpdk-dev] [RFC 22/29] vhost: don't copy descs during Rx

Tiwei Bie tiwei.bie at intel.com
Wed Jun 21 04:57:58 CEST 2017


Signed-off-by: Tiwei Bie <tiwei.bie at intel.com>
---
 lib/librte_vhost/virtio_net.c | 35 ++++++++++-------------------------
 1 file changed, 10 insertions(+), 25 deletions(-)

diff --git a/lib/librte_vhost/virtio_net.c b/lib/librte_vhost/virtio_net.c
index 7a978b9..c14582b 100644
--- a/lib/librte_vhost/virtio_net.c
+++ b/lib/librte_vhost/virtio_net.c
@@ -1247,35 +1247,18 @@ vhost_dequeue_burst_1_1(struct virtio_net *dev, struct vhost_virtqueue *vq,
 			uint16_t count)
 {
 	uint16_t i;
-	uint16_t idx;
 	struct vring_desc_1_1 *desc = vq->desc_1_1;
 	uint16_t head_idx = vq->last_used_idx;
-	struct vring_desc_1_1 desc_cached[64];
-	uint16_t desc_idx = 0;
+	uint16_t desc_idx;
 
-	idx = vq->last_used_idx & (vq->size - 1);
-	if (!(desc[idx].flags & DESC_HW))
+	desc_idx = vq->last_used_idx;
+	if (!(desc[desc_idx & (vq->size - 1)].flags & DESC_HW))
 		return 0;
 
 	count = RTE_MIN(MAX_PKT_BURST, count);
 
-	{
-		uint16_t size = vq->size - idx;
-		if (size >= 64)
-			rte_memcpy(&desc_cached[0],    &desc[idx], 64 * sizeof(struct vring_desc_1_1));
-		else {
-			rte_memcpy(&desc_cached[0],    &desc[idx], size * sizeof(struct vring_desc_1_1));
-			rte_memcpy(&desc_cached[size], &desc[0],   (64 - size) * sizeof(struct vring_desc_1_1));
-		}
-	}
-
-	//for (i = 0; i < 64; i++) {
-	//	idx = (vq->last_used_idx + i) & (vq->size - 1);
-	//	desc_cached[i] = desc[idx];
-	//}
-
 	for (i = 0; i < count; i++) {
-		if (!(desc_cached[desc_idx].flags & DESC_HW))
+		if (!(desc[desc_idx & (vq->size - 1)].flags & DESC_HW))
 			break;
 
 		pkts[i] = rte_pktmbuf_alloc(mbuf_pool);
@@ -1285,13 +1268,15 @@ vhost_dequeue_burst_1_1(struct virtio_net *dev, struct vhost_virtqueue *vq,
 			break;
 		}
 
-		dequeue_desc(dev, vq, mbuf_pool, pkts[i], desc_cached, &desc_idx);
+		dequeue_desc(dev, vq, mbuf_pool, pkts[i], desc, &desc_idx);
 	}
 
-	vq->last_used_idx += desc_idx;
+	vq->last_used_idx = desc_idx;
 	if (likely(i)) {
-		for (idx = 1; idx < (uint16_t)(vq->last_used_idx - head_idx); idx++) {
-			desc[(idx + head_idx) & (vq->size - 1)].flags = 0;
+		for (desc_idx = 1;
+		     desc_idx < (uint16_t)(vq->last_used_idx - head_idx);
+		     desc_idx++) {
+			desc[(desc_idx + head_idx) & (vq->size - 1)].flags = 0;
 		}
 		rte_smp_wmb();
 		desc[head_idx & (vq->size - 1)].flags = 0;
-- 
2.7.4



More information about the dev mailing list