[ovs-dev] [PATCH v3 5/6] netdev-dpdk: Enable intermediate queue for vHost User port.

Bhanuprakash Bodireddy bhanuprakash.bodireddy at intel.com
Thu Jun 29 22:39:35 UTC 2017


This commit refactors the __netdev_dpdk_vhost_send() and enables
intermediate queue where in the packets are buffered till the threshold
'INTERIM_QUEUE_BURST_THRESHOLD[32] is hit and eventually gets transmitted.

This commit improves the throughput as reported below in simple Physical
to virtual testcase with higher flows @10G Line rate.

  Num Flow    Master      Commit
  ========   =========   =========
  10          5945899     7833914
  32          3872211     6530133
  50          3283713     6618711
  100         3132540     5857226
  500         2964499     5273006
  1000        2931952     5178038

Latency stats:

  MASTER
  -------
  Pkt size  min(ns)  avg(ns)  max(ns)
  512       10,011   12,100   281,915
  1024       7,870    9,313   193,116
  1280       7,862    9,036   194,439
  1518       8,215    9,417   204,782

  MASTER + COMMIT
  ---------------
  Pkt size  min(ns)  avg(ns)  max(ns)
  512       10,492   13,655   281,538
  1024       8,407    9,784   205,095
  1280       8,399    9,750   194,888
  1518       8,367    9,722   196,973

Reported-at: https://mail.openvswitch.org/pipermail/ovs-dev/2017-May/332271.html
             [By Eelco Chaudron <echaudro at redhat.com>]
Signed-off-by: Bhanuprakash Bodireddy <bhanuprakash.bodireddy at intel.com>
Signed-off-by: Antonio Fischetti <antonio.fischetti at intel.com>
Co-authored-by: Antonio Fischetti <antonio.fischetti at intel.com>
Acked-by: Eelco Chaudron <echaudro at redhat.com>
---
 lib/netdev-dpdk.c | 38 +++++++++++++++-----------------------
 1 file changed, 15 insertions(+), 23 deletions(-)

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 99ad8c7..69391d6 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -1819,16 +1819,21 @@ __netdev_dpdk_vhost_send(struct netdev *netdev, int qid,
     struct rte_mbuf **cur_pkts = (struct rte_mbuf **) pkts;
     unsigned int total_pkts = cnt;
     unsigned int dropped = 0;
-    int i, retries = 0;
+    int i;
 
     qid = dev->tx_q[qid % netdev->n_txq].map;
+    struct dpdk_tx_queue *txq = &dev->tx_q[qid];
 
     if (OVS_UNLIKELY(!is_vhost_running(dev) || qid < 0
                      || !(dev->flags & NETDEV_UP))) {
         rte_spinlock_lock(&dev->stats_lock);
         dev->stats.tx_dropped+= cnt;
         rte_spinlock_unlock(&dev->stats_lock);
-        goto out;
+
+        for (i = 0; i < total_pkts; i++) {
+            dp_packet_delete(pkts[i]);
+        }
+        return;
     }
 
     rte_spinlock_lock(&dev->tx_q[qid].tx_lock);
@@ -1838,34 +1843,21 @@ __netdev_dpdk_vhost_send(struct netdev *netdev, int qid,
     cnt = netdev_dpdk_qos_run(dev, cur_pkts, cnt);
     dropped = total_pkts - cnt;
 
-    do {
-        int vhost_qid = qid * VIRTIO_QNUM + VIRTIO_RXQ;
-        unsigned int tx_pkts;
-
-        tx_pkts = rte_vhost_enqueue_burst(netdev_dpdk_get_vid(dev),
-                                          vhost_qid, cur_pkts, cnt);
-        if (OVS_LIKELY(tx_pkts)) {
-            /* Packets have been sent.*/
-            cnt -= tx_pkts;
-            /* Prepare for possible retry.*/
-            cur_pkts = &cur_pkts[tx_pkts];
-        } else {
-            /* No packets sent - do not retry.*/
-            break;
+    int idx = 0;
+    while (idx < cnt) {
+        txq->vhost_burst_pkts[txq->vhost_pkt_cnt++] = pkts[idx++];
+
+        if (txq->vhost_pkt_cnt >= INTERIM_QUEUE_BURST_THRESHOLD) {
+            dropped += netdev_dpdk_vhost_tx_burst(dev, qid);
         }
-    } while (cnt && (retries++ <= VHOST_ENQ_RETRY_NUM));
+    }
 
     rte_spinlock_unlock(&dev->tx_q[qid].tx_lock);
 
     rte_spinlock_lock(&dev->stats_lock);
     netdev_dpdk_vhost_update_tx_counters(&dev->stats, pkts, total_pkts,
-                                         cnt + dropped);
+                                         dropped);
     rte_spinlock_unlock(&dev->stats_lock);
-
-out:
-    for (i = 0; i < total_pkts - dropped; i++) {
-        dp_packet_delete(pkts[i]);
-    }
 }
 
 /* Enqueue packets in an intermediate queue and call the flush
-- 
2.4.11



More information about the dev mailing list