From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <ktraynor@redhat.com>
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28])
 by dpdk.org (Postfix) with ESMTP id 4F9AB200;
 Thu,  7 Dec 2017 17:01:11 +0100 (CET)
Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com
 [10.5.11.12])
 (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
 (No client certificate requested)
 by mx1.redhat.com (Postfix) with ESMTPS id 89D647EBD6;
 Thu,  7 Dec 2017 16:01:10 +0000 (UTC)
Received: from ktraynor.remote.csb (ovpn-116-183.ams2.redhat.com
 [10.36.116.183])
 by smtp.corp.redhat.com (Postfix) with ESMTP id D6F986EE5B;
 Thu,  7 Dec 2017 16:00:58 +0000 (UTC)
To: Tiwei Bie <tiwei.bie@intel.com>, yliu@fridaylinux.org,
 maxime.coquelin@redhat.com, dev@dpdk.org
Cc: antonio.fischetti@intel.com, stable@dpdk.org,
 "Kavanagh, Mark B" <mark.b.kavanagh@intel.com>
References: <20171207053059.19487-1-tiwei.bie@intel.com>
 <20171207053059.19487-2-tiwei.bie@intel.com>
From: Kevin Traynor <ktraynor@redhat.com>
Organization: Red Hat
Message-ID: <9407e2ce-8b2b-9a9d-a493-1757609184a9@redhat.com>
Date: Thu, 7 Dec 2017 16:00:57 +0000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101
 Thunderbird/52.2.0
MIME-Version: 1.0
In-Reply-To: <20171207053059.19487-2-tiwei.bie@intel.com>
Content-Type: text/plain; charset=utf-8
Content-Language: en-US
Content-Transfer-Encoding: 7bit
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12
X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16
 (mx1.redhat.com [10.5.110.27]); Thu, 07 Dec 2017 16:01:10 +0000 (UTC)
Subject: Re: [dpdk-dev] [PATCH 1/5] net/virtio: fix vector Rx break caused
 by rxq flushing
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <http://dpdk.org/ml/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://dpdk.org/ml/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <http://dpdk.org/ml/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Thu, 07 Dec 2017 16:01:11 -0000

On 12/07/2017 05:30 AM, Tiwei Bie wrote:
> The vector Rx will be broken if backend has consumed all
> the descs in the avail ring before the device is started.
> Because in current implementation, vector Rx will return
> immediately without refilling the avail ring if the used
> ring is empty. So we have to refill the avail ring after
> flushing the elements in the used ring for vector Rx.
> 
> Besides, vector Rx has a different ring layout assumption
> and mbuf management. So we need to handle it differently.
> 

Hi Tiwei, does the issue only occur with the vector rx? How about if the
simple rx is used because VIRTIO_NET_F_MRG_RXBUF is set?

Kevin.

> Fixes: d8227497ec5c ("net/virtio: flush Rx queues on start")
> Cc: stable@dpdk.org
> 
> Reported-by: Antonio Fischetti <antonio.fischetti@intel.com>
> Signed-off-by: Tiwei Bie <tiwei.bie@intel.com>
> ---
>  drivers/net/virtio/virtio_ethdev.c |  2 +-
>  drivers/net/virtio/virtqueue.c     | 31 ++++++++++++++++++++++++-------
>  drivers/net/virtio/virtqueue.h     |  2 +-
>  3 files changed, 26 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
> index e0328f61d..64a0cc608 100644
> --- a/drivers/net/virtio/virtio_ethdev.c
> +++ b/drivers/net/virtio/virtio_ethdev.c
> @@ -1860,7 +1860,7 @@ virtio_dev_start(struct rte_eth_dev *dev)
>  	for (i = 0; i < dev->data->nb_rx_queues; i++) {
>  		rxvq = dev->data->rx_queues[i];
>  		/* Flush the old packets */
> -		virtqueue_flush(rxvq->vq);
> +		virtqueue_rxvq_flush(rxvq->vq);
>  		virtqueue_notify(rxvq->vq);
>  	}
>  
> diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c
> index c3a536f8a..696d0e4a4 100644
> --- a/drivers/net/virtio/virtqueue.c
> +++ b/drivers/net/virtio/virtqueue.c
> @@ -37,6 +37,7 @@
>  #include "virtqueue.h"
>  #include "virtio_logs.h"
>  #include "virtio_pci.h"
> +#include "virtio_rxtx_simple.h"
>  
>  /*
>   * Two types of mbuf to be cleaned:
> @@ -62,8 +63,10 @@ virtqueue_detatch_unused(struct virtqueue *vq)
>  
>  /* Flush the elements in the used ring. */
>  void
> -virtqueue_flush(struct virtqueue *vq)
> +virtqueue_rxvq_flush(struct virtqueue *vq)
>  {
> +	struct virtnet_rx *rxq = &vq->rxq;
> +	struct virtio_hw *hw = vq->hw;
>  	struct vring_used_elem *uep;
>  	struct vq_desc_extra *dxp;
>  	uint16_t used_idx, desc_idx;
> @@ -74,13 +77,27 @@ virtqueue_flush(struct virtqueue *vq)
>  	for (i = 0; i < nb_used; i++) {
>  		used_idx = vq->vq_used_cons_idx & (vq->vq_nentries - 1);
>  		uep = &vq->vq_ring.used->ring[used_idx];
> -		desc_idx = (uint16_t)uep->id;
> -		dxp = &vq->vq_descx[desc_idx];
> -		if (dxp->cookie != NULL) {
> -			rte_pktmbuf_free(dxp->cookie);
> -			dxp->cookie = NULL;
> +		if (hw->use_simple_rx) {
> +			desc_idx = used_idx;
> +			rte_pktmbuf_free(vq->sw_ring[desc_idx]);
> +			vq->vq_free_cnt++;
> +		} else {
> +			desc_idx = (uint16_t)uep->id;
> +			dxp = &vq->vq_descx[desc_idx];
> +			if (dxp->cookie != NULL) {
> +				rte_pktmbuf_free(dxp->cookie);
> +				dxp->cookie = NULL;
> +			}
> +			vq_ring_free_chain(vq, desc_idx);
>  		}
>  		vq->vq_used_cons_idx++;
> -		vq_ring_free_chain(vq, desc_idx);
> +	}
> +
> +	if (hw->use_simple_rx) {
> +		while (vq->vq_free_cnt >= RTE_VIRTIO_VPMD_RX_REARM_THRESH) {
> +			virtio_rxq_rearm_vec(rxq);
> +			if (virtqueue_kick_prepare(vq))
> +				virtqueue_notify(vq);
> +		}
>  	}
>  }
> diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h
> index 2305d91a4..ab466c2db 100644
> --- a/drivers/net/virtio/virtqueue.h
> +++ b/drivers/net/virtio/virtqueue.h
> @@ -304,7 +304,7 @@ void virtqueue_dump(struct virtqueue *vq);
>  struct rte_mbuf *virtqueue_detatch_unused(struct virtqueue *vq);
>  
>  /* Flush the elements in the used ring. */
> -void virtqueue_flush(struct virtqueue *vq);
> +void virtqueue_rxvq_flush(struct virtqueue *vq);
>  
>  static inline int
>  virtqueue_full(const struct virtqueue *vq)
>