From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jens Freimann Subject: [PATCH v4 04/20] net/virtio: flush packed receive virtqueues Date: Thu, 19 Apr 2018 09:07:35 +0200 Message-ID: <20180419070751.8933-5-jfreimann@redhat.com> References: <20180419070751.8933-1-jfreimann@redhat.com> Cc: tiwei.bie@intel.com, yliu@fridaylinux.org, maxime.coquelin@redhat.com, mst@redhat.com, jens@freimann.org To: dev@dpdk.org Return-path: Received: from mx1.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by dpdk.org (Postfix) with ESMTP id 422627CC0 for ; Thu, 19 Apr 2018 09:08:07 +0200 (CEST) In-Reply-To: <20180419070751.8933-1-jfreimann@redhat.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Flush used descriptors in packed receive virtqueue. As descriptors can be chained we need to look at the stored number of used descriptors to find out the length of the chain. Signed-off-by: Jens Freimann --- drivers/net/virtio/virtqueue.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c index a7d0a9cbe..f2747e612 100644 --- a/drivers/net/virtio/virtqueue.c +++ b/drivers/net/virtio/virtqueue.c @@ -58,12 +58,28 @@ virtqueue_detach_unused(struct virtqueue *vq) void virtqueue_rxvq_flush(struct virtqueue *vq) { + struct vring_desc_packed *descs = vq->vq_ring.desc_packed; 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; uint16_t nb_used, i; + uint16_t size = vq->vq_nentries; + + if (vtpci_packed_queue(vq->hw)) { + i = vq->vq_used_cons_idx; + while (desc_is_used(&descs[i])) { + dxp = &vq->vq_descx[i]; + if (dxp->cookie != NULL) + rte_pktmbuf_free(dxp->cookie); + vq->vq_free_cnt += dxp->ndescs; + i = i + dxp->ndescs; + i = i >= size ? i - size : i; + dxp->ndescs = 0; + } + return; + } nb_used = VIRTQUEUE_NUSED(vq); -- 2.14.3