patches for DPDK stable branches
 help / color / mirror / Atom feed
* [dpdk-stable] [PATCH 1/5] net/virtio: fix vector Rx break caused by rxq flushing
       [not found] <20171207053059.19487-1-tiwei.bie@intel.com>
@ 2017-12-07  5:30 ` Tiwei Bie
  2017-12-07  9:14   ` Maxime Coquelin
  2017-12-07 16:00   ` [dpdk-stable] [dpdk-dev] " Kevin Traynor
  2017-12-07  5:30 ` [dpdk-stable] [PATCH 2/5] net/virtio: fix typo in LRO support Tiwei Bie
       [not found] ` <20171211051332.31888-1-tiwei.bie@intel.com>
  2 siblings, 2 replies; 11+ messages in thread
From: Tiwei Bie @ 2017-12-07  5:30 UTC (permalink / raw)
  To: yliu, maxime.coquelin, dev; +Cc: antonio.fischetti, stable

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.

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)
-- 
2.13.3

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [dpdk-stable] [PATCH 2/5] net/virtio: fix typo in LRO support
       [not found] <20171207053059.19487-1-tiwei.bie@intel.com>
  2017-12-07  5:30 ` [dpdk-stable] [PATCH 1/5] net/virtio: fix vector Rx break caused by rxq flushing Tiwei Bie
@ 2017-12-07  5:30 ` Tiwei Bie
  2017-12-07  9:15   ` Maxime Coquelin
       [not found] ` <20171211051332.31888-1-tiwei.bie@intel.com>
  2 siblings, 1 reply; 11+ messages in thread
From: Tiwei Bie @ 2017-12-07  5:30 UTC (permalink / raw)
  To: yliu, maxime.coquelin, dev; +Cc: stable

Fixes: 86d59b21468a ("net/virtio: support LRO")
Fixes: ec9f3d122a58 ("net/virtio: revert not claiming LRO support")
Cc: stable@dpdk.org

Signed-off-by: Tiwei Bie <tiwei.bie@intel.com>
---
 drivers/net/virtio/virtio_ethdev.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index 64a0cc608..9caa133c9 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -1754,7 +1754,7 @@ virtio_dev_configure(struct rte_eth_dev *dev)
 
 	if (rxmode->enable_lro &&
 		(!vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4) ||
-			!vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4))) {
+			!vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO6))) {
 		PMD_DRV_LOG(ERR,
 			"Large Receive Offload not available on this host");
 		return -ENOTSUP;
-- 
2.13.3

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [dpdk-stable] [PATCH 1/5] net/virtio: fix vector Rx break caused by rxq flushing
  2017-12-07  5:30 ` [dpdk-stable] [PATCH 1/5] net/virtio: fix vector Rx break caused by rxq flushing Tiwei Bie
@ 2017-12-07  9:14   ` Maxime Coquelin
  2017-12-07  9:30     ` Fischetti, Antonio
  2017-12-07 16:00   ` [dpdk-stable] [dpdk-dev] " Kevin Traynor
  1 sibling, 1 reply; 11+ messages in thread
From: Maxime Coquelin @ 2017-12-07  9:14 UTC (permalink / raw)
  To: Tiwei Bie, yliu, dev; +Cc: antonio.fischetti, stable



On 12/07/2017 06: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.
> 
> 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(-)

Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>

Thanks,
Maxime

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [dpdk-stable] [PATCH 2/5] net/virtio: fix typo in LRO support
  2017-12-07  5:30 ` [dpdk-stable] [PATCH 2/5] net/virtio: fix typo in LRO support Tiwei Bie
@ 2017-12-07  9:15   ` Maxime Coquelin
  0 siblings, 0 replies; 11+ messages in thread
From: Maxime Coquelin @ 2017-12-07  9:15 UTC (permalink / raw)
  To: Tiwei Bie, yliu, dev; +Cc: stable



On 12/07/2017 06:30 AM, Tiwei Bie wrote:
> Fixes: 86d59b21468a ("net/virtio: support LRO")
> Fixes: ec9f3d122a58 ("net/virtio: revert not claiming LRO support")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Tiwei Bie <tiwei.bie@intel.com>
> ---
>   drivers/net/virtio/virtio_ethdev.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
> index 64a0cc608..9caa133c9 100644
> --- a/drivers/net/virtio/virtio_ethdev.c
> +++ b/drivers/net/virtio/virtio_ethdev.c
> @@ -1754,7 +1754,7 @@ virtio_dev_configure(struct rte_eth_dev *dev)
>   
>   	if (rxmode->enable_lro &&
>   		(!vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4) ||
> -			!vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4))) {
> +			!vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO6))) {
>   		PMD_DRV_LOG(ERR,
>   			"Large Receive Offload not available on this host");
>   		return -ENOTSUP;
> 

Good catch!

Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>

Thanks,
Maxime

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [dpdk-stable] [PATCH 1/5] net/virtio: fix vector Rx break caused by rxq flushing
  2017-12-07  9:14   ` Maxime Coquelin
@ 2017-12-07  9:30     ` Fischetti, Antonio
  2017-12-07 18:10       ` Fischetti, Antonio
  0 siblings, 1 reply; 11+ messages in thread
From: Fischetti, Antonio @ 2017-12-07  9:30 UTC (permalink / raw)
  To: Maxime Coquelin, Bie, Tiwei, yliu, dev; +Cc: stable

Thanks Tiwei for working on this, I'll give it a try soon.

Antonio

> -----Original Message-----
> From: Maxime Coquelin [mailto:maxime.coquelin@redhat.com]
> Sent: Thursday, December 7, 2017 9:15 AM
> To: Bie, Tiwei <tiwei.bie@intel.com>; yliu@fridaylinux.org; dev@dpdk.org
> Cc: Fischetti, Antonio <antonio.fischetti@intel.com>; stable@dpdk.org
> Subject: Re: [PATCH 1/5] net/virtio: fix vector Rx break caused by rxq
> flushing
> 
> 
> 
> On 12/07/2017 06: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.
> >
> > 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(-)
> 
> Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
> 
> Thanks,
> Maxime

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [dpdk-stable] [dpdk-dev] [PATCH 1/5] net/virtio: fix vector Rx break caused by rxq flushing
  2017-12-07  5:30 ` [dpdk-stable] [PATCH 1/5] net/virtio: fix vector Rx break caused by rxq flushing Tiwei Bie
  2017-12-07  9:14   ` Maxime Coquelin
@ 2017-12-07 16:00   ` Kevin Traynor
  2017-12-08  2:30     ` Tiwei Bie
  1 sibling, 1 reply; 11+ messages in thread
From: Kevin Traynor @ 2017-12-07 16:00 UTC (permalink / raw)
  To: Tiwei Bie, yliu, maxime.coquelin, dev
  Cc: antonio.fischetti, stable, Kavanagh, Mark B

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)
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [dpdk-stable] [PATCH 1/5] net/virtio: fix vector Rx break caused by rxq flushing
  2017-12-07  9:30     ` Fischetti, Antonio
@ 2017-12-07 18:10       ` Fischetti, Antonio
  0 siblings, 0 replies; 11+ messages in thread
From: Fischetti, Antonio @ 2017-12-07 18:10 UTC (permalink / raw)
  To: Fischetti, Antonio, Maxime Coquelin, Bie, Tiwei, yliu, dev; +Cc: stable

Hi Tiwei, 
I've tested this patch on my 2 test cases described 
in the previous threads
 http://www.dpdk.org/ml/archives/dev/2017-November/081839.html
 http://www.dpdk.org/ml/archives/dev/2017-December/082801.html

 1. testpmd on the host and testpmd in the guest
 2. OvS-DPDK on the host and testpmd in the guest

and it works fine. 

I'm using DPDK v17.11 + this patch and I see traffic is now
flowing through the VM.


Tested-by: Antonio Fischetti <antonio.fischetti@intel.com>



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Fischetti, Antonio
> Sent: Thursday, December 7, 2017 9:30 AM
> To: Maxime Coquelin <maxime.coquelin@redhat.com>; Bie, Tiwei
> <tiwei.bie@intel.com>; yliu@fridaylinux.org; dev@dpdk.org
> Cc: stable@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH 1/5] net/virtio: fix vector Rx break
> caused by rxq flushing
> 
> Thanks Tiwei for working on this, I'll give it a try soon.
> 
> Antonio
> 
> > -----Original Message-----
> > From: Maxime Coquelin [mailto:maxime.coquelin@redhat.com]
> > Sent: Thursday, December 7, 2017 9:15 AM
> > To: Bie, Tiwei <tiwei.bie@intel.com>; yliu@fridaylinux.org;
> dev@dpdk.org
> > Cc: Fischetti, Antonio <antonio.fischetti@intel.com>; stable@dpdk.org
> > Subject: Re: [PATCH 1/5] net/virtio: fix vector Rx break caused by rxq
> > flushing
> >
> >
> >
> > On 12/07/2017 06: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.
> > >
> > > 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(-)
> >
> > Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
> >
> > Thanks,
> > Maxime

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [dpdk-stable] [dpdk-dev] [PATCH 1/5] net/virtio: fix vector Rx break caused by rxq flushing
  2017-12-07 16:00   ` [dpdk-stable] [dpdk-dev] " Kevin Traynor
@ 2017-12-08  2:30     ` Tiwei Bie
  2017-12-08 10:17       ` Kevin Traynor
  0 siblings, 1 reply; 11+ messages in thread
From: Tiwei Bie @ 2017-12-08  2:30 UTC (permalink / raw)
  To: Kevin Traynor
  Cc: yliu, maxime.coquelin, dev, antonio.fischetti, stable, Kavanagh, Mark B

On Thu, Dec 07, 2017 at 04:00:57PM +0000, Kevin Traynor wrote:
> 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?

Hi Kevin,

Yes, you are right! The issue only occurs with the vector
Rx. The vector Rx (i.e. the simple Rx) won't be used if
VIRTIO_NET_F_MRG_RXBUF is set.

Best regards,
Tiwei Bie

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [dpdk-stable] [dpdk-dev] [PATCH 1/5] net/virtio: fix vector Rx break caused by rxq flushing
  2017-12-08  2:30     ` Tiwei Bie
@ 2017-12-08 10:17       ` Kevin Traynor
  0 siblings, 0 replies; 11+ messages in thread
From: Kevin Traynor @ 2017-12-08 10:17 UTC (permalink / raw)
  To: Tiwei Bie
  Cc: yliu, maxime.coquelin, dev, antonio.fischetti, stable, Kavanagh, Mark B

On 12/08/2017 02:30 AM, Tiwei Bie wrote:
> On Thu, Dec 07, 2017 at 04:00:57PM +0000, Kevin Traynor wrote:
>> 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?
> 
> Hi Kevin,
> 
> Yes, you are right! The issue only occurs with the vector
> Rx. The vector Rx (i.e. the simple Rx) won't be used if
> VIRTIO_NET_F_MRG_RXBUF is set.
> 
> Best regards,
> Tiwei Bie
> 

Thanks for clarifying this Tiwei,

Kevin.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [dpdk-stable] [PATCH v2 1/4] net/virtio: fix vector Rx break caused by rxq flushing
       [not found] ` <20171211051332.31888-1-tiwei.bie@intel.com>
@ 2017-12-11  5:13   ` Tiwei Bie
  2017-12-11  5:13   ` [dpdk-stable] [PATCH v2 2/4] net/virtio: fix typo in LRO support Tiwei Bie
  1 sibling, 0 replies; 11+ messages in thread
From: Tiwei Bie @ 2017-12-11  5:13 UTC (permalink / raw)
  To: yliu, maxime.coquelin, dev; +Cc: stable

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.

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>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Tested-by: Antonio Fischetti <antonio.fischetti@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)
-- 
2.13.3

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [dpdk-stable] [PATCH v2 2/4] net/virtio: fix typo in LRO support
       [not found] ` <20171211051332.31888-1-tiwei.bie@intel.com>
  2017-12-11  5:13   ` [dpdk-stable] [PATCH v2 1/4] net/virtio: fix vector Rx break caused by rxq flushing Tiwei Bie
@ 2017-12-11  5:13   ` Tiwei Bie
  1 sibling, 0 replies; 11+ messages in thread
From: Tiwei Bie @ 2017-12-11  5:13 UTC (permalink / raw)
  To: yliu, maxime.coquelin, dev; +Cc: stable

Fixes: 86d59b21468a ("net/virtio: support LRO")
Fixes: ec9f3d122a58 ("net/virtio: revert not claiming LRO support")
Cc: stable@dpdk.org

Signed-off-by: Tiwei Bie <tiwei.bie@intel.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
 drivers/net/virtio/virtio_ethdev.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index 64a0cc608..9caa133c9 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -1754,7 +1754,7 @@ virtio_dev_configure(struct rte_eth_dev *dev)
 
 	if (rxmode->enable_lro &&
 		(!vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4) ||
-			!vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4))) {
+		 !vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO6))) {
 		PMD_DRV_LOG(ERR,
 			"Large Receive Offload not available on this host");
 		return -ENOTSUP;
-- 
2.13.3

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2017-12-11  5:14 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20171207053059.19487-1-tiwei.bie@intel.com>
2017-12-07  5:30 ` [dpdk-stable] [PATCH 1/5] net/virtio: fix vector Rx break caused by rxq flushing Tiwei Bie
2017-12-07  9:14   ` Maxime Coquelin
2017-12-07  9:30     ` Fischetti, Antonio
2017-12-07 18:10       ` Fischetti, Antonio
2017-12-07 16:00   ` [dpdk-stable] [dpdk-dev] " Kevin Traynor
2017-12-08  2:30     ` Tiwei Bie
2017-12-08 10:17       ` Kevin Traynor
2017-12-07  5:30 ` [dpdk-stable] [PATCH 2/5] net/virtio: fix typo in LRO support Tiwei Bie
2017-12-07  9:15   ` Maxime Coquelin
     [not found] ` <20171211051332.31888-1-tiwei.bie@intel.com>
2017-12-11  5:13   ` [dpdk-stable] [PATCH v2 1/4] net/virtio: fix vector Rx break caused by rxq flushing Tiwei Bie
2017-12-11  5:13   ` [dpdk-stable] [PATCH v2 2/4] net/virtio: fix typo in LRO support Tiwei Bie

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).