[ovs-dev] [PATCH v2] netdev-dpdk: Remove vhost send retries when no packets have been sent.
Ilya Maximets
i.maximets at samsung.com
Tue Jun 14 04:48:16 UTC 2016
Looks good to me.
Acked-by: Ilya Maximets <i.maximets at samsung.com>
On 11.06.2016 02:08, Daniele Di Proietto wrote:
> Thanks for the patch, it looks good to me.
>
> If everybody agrees (Ilya?) I can push this to master.
>
> Thanks,
>
> Daniele
>
> 2016-06-10 9:49 GMT-07:00 Kevin Traynor <kevin.traynor at intel.com <mailto:kevin.traynor at intel.com>>:
>
> If the guest is connected but not servicing the virt queue, this leads
> to vhost send retries until timeout. This is fine in isolation but if
> there are other high rate queues also being serviced by the same PMD
> it can lead to a performance hit on those queues. Change to only retry
> when at least some packets have been successfully sent on the previous
> attempt.
>
> Also, limit retries to avoid a similar delays if packets are being sent
> at a very low rate due to few available descriptors.
>
> Reported-by: Bhanuprakash Bodireddy <bhanuprakash.bodireddy at intel.com <mailto:bhanuprakash.bodireddy at intel.com>>
> Signed-off-by: Kevin Traynor <kevin.traynor at intel.com <mailto:kevin.traynor at intel.com>>
> Acked-by: Bhanuprakash Bodireddy <bhanuprakash.bodireddy at intel.com <mailto:bhanuprakash.bodireddy at intel.com>>
> ---
>
> RFC->v2
> - Change to PATCH after ML discussion.
> - Rebase.
> - Add retry limit when packets are being sent.
> - Add Ack from Bhanu.
>
> lib/netdev-dpdk.c | 34 ++++++----------------------------
> 1 files changed, 6 insertions(+), 28 deletions(-)
>
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
> index 19d355f..582569c 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -141,10 +141,7 @@ static char *cuse_dev_name = NULL; /* Character device cuse_dev_name. */
> #endif
> static char *vhost_sock_dir = NULL; /* Location of vhost-user sockets */
>
> -/*
> - * Maximum amount of time in micro seconds to try and enqueue to vhost.
> - */
> -#define VHOST_ENQ_RETRY_USECS 100
> +#define VHOST_ENQ_RETRY_NUM 8
>
> static const struct rte_eth_conf port_conf = {
> .rxmode = {
> @@ -1377,7 +1374,7 @@ __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 qos_pkts = cnt;
> - uint64_t start = 0;
> + int retries = 0;
>
> qid = dev->tx_q[qid % dev->real_n_txq].map;
>
> @@ -1404,32 +1401,13 @@ __netdev_dpdk_vhost_send(struct netdev *netdev, int qid,
> if (OVS_LIKELY(tx_pkts)) {
> /* Packets have been sent.*/
> cnt -= tx_pkts;
> - /* Prepare for possible next iteration.*/
> + /* Prepare for possible retry.*/
> cur_pkts = &cur_pkts[tx_pkts];
> } else {
> - uint64_t timeout = VHOST_ENQ_RETRY_USECS * rte_get_timer_hz() / 1E6;
> - unsigned int expired = 0;
> -
> - if (!start) {
> - start = rte_get_timer_cycles();
> - }
> -
> - /*
> - * Unable to enqueue packets to vhost interface.
> - * Check available entries before retrying.
> - */
> - while (!rte_vring_available_entries(virtio_dev, vhost_qid)) {
> - if (OVS_UNLIKELY((rte_get_timer_cycles() - start) > timeout)) {
> - expired = 1;
> - break;
> - }
> - }
> - if (expired) {
> - /* break out of main loop. */
> - break;
> - }
> + /* No packets sent - do not retry.*/
> + break;
> }
> - } while (cnt);
> + } while (cnt && (retries++ < VHOST_ENQ_RETRY_NUM));
>
> rte_spinlock_unlock(&dev->tx_q[qid].tx_lock);
>
> --
> 1.7.4.1
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org <mailto:dev at openvswitch.org>
> http://openvswitch.org/mailman/listinfo/dev
>
>
More information about the dev
mailing list