[ovs-dev] [PATCH 2/2] netdev-dpdk: Keep calling rte_eth_tx_burst() until it returns 0

Pravin Shelar pshelar at nicira.com
Wed Aug 13 00:40:31 UTC 2014


On Tue, Aug 12, 2014 at 10:43 AM, Daniele Di Proietto
<ddiproietto at vmware.com> wrote:
> rte_eth_tx_burst() _should_ transmit every packet that it is passed unless the
> queue is full. Nontheless some implementation of rte_eth_tx_burst (e.g.
> ixgbe_xmit_pkts_vec()) does not transmit more than a fixed number (32) of
> packets at a time.
>
> With this commit we assume that there's an error only if rte_eth_tx_burst
> returns 0.
>
> Signed-off-by: Daniele Di Proietto <ddiproietto at vmware.com>

looks good.
Pushed patch to master.

Thanks,
Pravin.

> ---
>  lib/netdev-dpdk.c | 19 +++++++++++++++++--
>  1 file changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
> index f2202b4..97206e6 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -621,9 +621,20 @@ static inline void
>  dpdk_queue_flush__(struct netdev_dpdk *dev, int qid)
>  {
>      struct dpdk_tx_queue *txq = &dev->tx_q[qid];
> -    uint32_t nb_tx;
> +    uint32_t nb_tx = 0;
> +
> +    while (nb_tx != txq->count) {
> +        uint32_t ret;
> +
> +        ret = rte_eth_tx_burst(dev->port_id, qid, txq->burst_pkts + nb_tx,
> +                               txq->count - nb_tx);
> +        if (!ret) {
> +            break;
> +        }
> +
> +        nb_tx += ret;
> +    }
>
> -    nb_tx = rte_eth_tx_burst(dev->port_id, qid, txq->burst_pkts, txq->count);
>      if (OVS_UNLIKELY(nb_tx != txq->count)) {
>          /* free buffers, which we couldn't transmit, one at a time (each
>           * packet could come from a different mempool) */
> @@ -632,7 +643,11 @@ dpdk_queue_flush__(struct netdev_dpdk *dev, int qid)
>          for (i = nb_tx; i < txq->count; i++) {
>              rte_pktmbuf_free_seg(txq->burst_pkts[i]);
>          }
> +        ovs_mutex_lock(&dev->mutex);
> +        dev->stats.tx_dropped += txq->count-nb_tx;
> +        ovs_mutex_unlock(&dev->mutex);
>      }
> +
>      txq->count = 0;
>      txq->tsc = rte_get_timer_cycles();
>  }
> --
> 2.0.1
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list