From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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 , yliu@fridaylinux.org, maxime.coquelin@redhat.com, dev@dpdk.org Cc: antonio.fischetti@intel.com, stable@dpdk.org, "Kavanagh, Mark B" References: <20171207053059.19487-1-tiwei.bie@intel.com> <20171207053059.19487-2-tiwei.bie@intel.com> From: Kevin Traynor 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 > Signed-off-by: Tiwei Bie > --- > 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) >