Thread (36 messages) 36 messages, 4 authors, 2018-09-21

Re: [PATCH v5 04/11] net/virtio: flush packed receive virtqueues

From: Maxime Coquelin <hidden>
Date: 2018-09-12 09:12:55


On 09/06/2018 08:19 PM, Jens Freimann wrote:
quoted hunk ↗ jump to hunk
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 <redacted>
---
  drivers/net/virtio/virtqueue.c | 17 +++++++++++++++++
  1 file changed, 17 insertions(+)
diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c
index 56a77cc71..d0520dad1 100644
--- a/drivers/net/virtio/virtqueue.c
+++ b/drivers/net/virtio/virtqueue.c
@@ -58,12 +58,29 @@ 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], &vq->vq_ring) &&
+			i < vq->vq_nentries) {
It may be preferable to ensure 'i' is within the ring size before using
it in desc_is_used(). And raise (at least) an error message if it isn't.
+			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);
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help