diff mbox

[ovs-dev,2/2] netdev-dpdk: Simplify send function for ETH devices.

Message ID 1471438966-20440-3-git-send-email-i.maximets@samsung.com
State Superseded
Delegated to: Daniele Di Proietto
Headers show

Commit Message

Ilya Maximets Aug. 17, 2016, 1:02 p.m. UTC
'netdev_dpdk_send__()' function can be greatly simplified by using
recently introduced 'netdev_dpdk_filter_packet_len()'.

Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
---
 lib/netdev-dpdk.c | 46 ++++++----------------------------------------
 1 file changed, 6 insertions(+), 40 deletions(-)

Comments

Stokes, Ian Aug. 18, 2016, 12:26 p.m. UTC | #1
> 'netdev_dpdk_send__()' function can be greatly simplified by using

> recently introduced 'netdev_dpdk_filter_packet_len()'.

> 

Thanks again Ilya, comments inline.

> Signed-off-by: Ilya Maximets <i.maximets@samsung.com>

> ---

>  lib/netdev-dpdk.c | 46 ++++++----------------------------------------

>  1 file changed, 6 insertions(+), 40 deletions(-)

> 

> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index bd374d0..209760d

> 100644

> --- a/lib/netdev-dpdk.c

> +++ b/lib/netdev-dpdk.c

> @@ -1642,51 +1642,17 @@ netdev_dpdk_send__(struct netdev_dpdk *dev, int

> qid,

>          dpdk_do_tx_copy(netdev, qid, batch);

>          dp_packet_delete_batch(batch, may_steal);

>      } else {

> -        int next_tx_idx = 0;

> -        int dropped = 0;

> -        unsigned int qos_pkts = 0;

> -        unsigned int temp_cnt = 0;

> +        int dropped;

>          int cnt = batch->count;

> +        struct rte_mbuf** cur_pkts = (struct rte_mbuf**)

> + batch->packets;

> 

>          dp_packet_batch_apply_cutlen(batch);

> 

> -        for (int i = 0; i < cnt; i++) {

> -            int size = dp_packet_size(batch->packets[i]);

> +        cnt = netdev_dpdk_qos_run__(dev, cur_pkts, cnt);


Similar to the vhost patch you posted.
I'd would consider running netdev_dpdk_filter before QoS to avoid the overhead for packets that will be dropped anyway.

> +        cnt = netdev_dpdk_filter_packet_len(dev, cur_pkts, cnt);

> +        dropped = batch->count - cnt;

> 

> -            if (OVS_UNLIKELY(size > dev->max_packet_len)) {

> -                if (next_tx_idx != i) {

> -                    temp_cnt = i - next_tx_idx;

> -                    qos_pkts = temp_cnt;

> -

> -                    temp_cnt = netdev_dpdk_qos_run__(dev,

> -                                        (struct rte_mbuf**)batch-

> >packets,

> -                                        temp_cnt);

> -                    dropped += qos_pkts - temp_cnt;

> -                    netdev_dpdk_eth_tx_burst(dev, qid,

> -                            (struct rte_mbuf **)&batch-

> >packets[next_tx_idx],

> -                            temp_cnt);

> -

> -                }

> -

> -                VLOG_WARN_RL(&rl, "Too big size %d max_packet_len %d",

> -                             (int)size , dev->max_packet_len);

> -

> -                dp_packet_delete(batch->packets[i]);

> -                dropped++;

> -                next_tx_idx = i + 1;

> -            }

> -        }

> -        if (next_tx_idx != cnt) {

> -            cnt -= next_tx_idx;

> -            qos_pkts = cnt;

> -

> -            cnt = netdev_dpdk_qos_run__(dev,

> -                    (struct rte_mbuf**)batch->packets, cnt);

> -            dropped += qos_pkts - cnt;

> -            netdev_dpdk_eth_tx_burst(dev, qid,

> -                             (struct rte_mbuf **)&batch-

> >packets[next_tx_idx],

> -                             cnt);

> -        }

> +        netdev_dpdk_eth_tx_burst(dev, qid, cur_pkts, cnt);

> 

>          if (OVS_UNLIKELY(dropped)) {

>              rte_spinlock_lock(&dev->stats_lock);

> --

> 2.7.4

> 

> _______________________________________________

> dev mailing list

> dev@openvswitch.org

> http://openvswitch.org/mailman/listinfo/dev
diff mbox

Patch

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index bd374d0..209760d 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -1642,51 +1642,17 @@  netdev_dpdk_send__(struct netdev_dpdk *dev, int qid,
         dpdk_do_tx_copy(netdev, qid, batch);
         dp_packet_delete_batch(batch, may_steal);
     } else {
-        int next_tx_idx = 0;
-        int dropped = 0;
-        unsigned int qos_pkts = 0;
-        unsigned int temp_cnt = 0;
+        int dropped;
         int cnt = batch->count;
+        struct rte_mbuf** cur_pkts = (struct rte_mbuf**) batch->packets;
 
         dp_packet_batch_apply_cutlen(batch);
 
-        for (int i = 0; i < cnt; i++) {
-            int size = dp_packet_size(batch->packets[i]);
+        cnt = netdev_dpdk_qos_run__(dev, cur_pkts, cnt);
+        cnt = netdev_dpdk_filter_packet_len(dev, cur_pkts, cnt);
+        dropped = batch->count - cnt;
 
-            if (OVS_UNLIKELY(size > dev->max_packet_len)) {
-                if (next_tx_idx != i) {
-                    temp_cnt = i - next_tx_idx;
-                    qos_pkts = temp_cnt;
-
-                    temp_cnt = netdev_dpdk_qos_run__(dev,
-                                        (struct rte_mbuf**)batch->packets,
-                                        temp_cnt);
-                    dropped += qos_pkts - temp_cnt;
-                    netdev_dpdk_eth_tx_burst(dev, qid,
-                            (struct rte_mbuf **)&batch->packets[next_tx_idx],
-                            temp_cnt);
-
-                }
-
-                VLOG_WARN_RL(&rl, "Too big size %d max_packet_len %d",
-                             (int)size , dev->max_packet_len);
-
-                dp_packet_delete(batch->packets[i]);
-                dropped++;
-                next_tx_idx = i + 1;
-            }
-        }
-        if (next_tx_idx != cnt) {
-            cnt -= next_tx_idx;
-            qos_pkts = cnt;
-
-            cnt = netdev_dpdk_qos_run__(dev,
-                    (struct rte_mbuf**)batch->packets, cnt);
-            dropped += qos_pkts - cnt;
-            netdev_dpdk_eth_tx_burst(dev, qid,
-                             (struct rte_mbuf **)&batch->packets[next_tx_idx],
-                             cnt);
-        }
+        netdev_dpdk_eth_tx_burst(dev, qid, cur_pkts, cnt);
 
         if (OVS_UNLIKELY(dropped)) {
             rte_spinlock_lock(&dev->stats_lock);