Message ID | 1471438966-20440-3-git-send-email-i.maximets@samsung.com |
---|---|
State | Superseded |
Delegated to: | Daniele Di Proietto |
Headers | show |
> '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 --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);
'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(-)