* [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
* 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 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] [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 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] [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 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 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
[parent not found: <20171211051332.31888-1-tiwei.bie@intel.com>]
* [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).