From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from out4-smtp.messagingengine.com (out4-smtp.messagingengine.com [66.111.4.28]) by dpdk.org (Postfix) with ESMTP id A04011B1A8 for ; Wed, 24 Jan 2018 16:38:59 +0100 (CET) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 529CF226BA; Wed, 24 Jan 2018 10:38:59 -0500 (EST) Received: from frontend1 ([10.202.2.160]) by compute1.internal (MEProxy); Wed, 24 Jan 2018 10:38:59 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fridaylinux.org; h=cc:date:from:in-reply-to:message-id:references:subject:to :x-me-sender:x-me-sender:x-sasl-enc; s=fm1; bh=sTZ795HPP7EQwke3S BoKyjgXPXNQeSfUqQR0TeU4V7s=; b=Q8HIZJXMPc4xnOnY+ef0gSL4cbCneCtfz MxLIc3pHHsB7BXydTtApXyZOLbOb+uALVAdKcALzf5PVFnP9P+HVMLWclKxcPyEn nXdAsWWE1UQ9xiGrfAYCHGqPqQvs8Oeq6KEjNjayIsjBjuWK+eT+spyCEyhitFYM XxrqULFpvU58QofpkhWb3SPDk4MUHAavnppuME4vit/yzkbHANW79IovdDES5vjj s9T+uEed7L1ATNA1DUHvSYlzGtrKeoyg/JtWtDjlRwKgE1/yOfyxmgceiKiXX2/R 5aOpzhPHOm/td99TIIwcKhE4GUu8i4FyGITlnIoz29nUOdvwZEEhQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:date:from:in-reply-to:message-id :references:subject:to:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; bh=sTZ795HPP7EQwke3SBoKyjgXPXNQeSfUqQR0TeU4V7s=; b=GmWUO5/6 a4lg5hL/1dZm9PCh3pXSDZ2nlBBIe4MqttJ7ri3mGI8gLBasHfRllYVzquD8Vdk2 +Ru2S8gZ6QHHAmv5PiUThGPexBSTz3YNVg1vbWwr+uo3OUXLWgiX9JUFr8F2IcBK MeuaRFVYhMTohrzAq1iJchsYB7r6UOVUjLRLPdHVfOE36T+iPrnzK7kc5G4fAGwk BZvmQmZZCeCsxb50i+ZMVFc4xsCMTVivo6M2pK03BvE6+fhMOpY/BMok3DHqayQB C7cQUWDpsMUcEyQ3utwZ4MXDyAJ+8sbOyyXKAGr7uIVndwsyQb0cKZuO+2T5znRX NALywCq0BC2zUQ== X-ME-Sender: Received: from localhost.localdomain (unknown [115.150.27.206]) by mail.messagingengine.com (Postfix) with ESMTPA id 6E0677E354; Wed, 24 Jan 2018 10:38:56 -0500 (EST) From: Yuanhan Liu To: Tiwei Bie Cc: Antonio Fischetti , Maxime Coquelin , Yuanhan Liu , dpdk stable Date: Wed, 24 Jan 2018 23:32:17 +0800 Message-Id: <1516808026-25523-69-git-send-email-yliu@fridaylinux.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1516808026-25523-1-git-send-email-yliu@fridaylinux.org> References: <1516808026-25523-1-git-send-email-yliu@fridaylinux.org> Subject: [dpdk-stable] patch 'net/virtio: fix vector Rx flushing' has been queued to LTS release 17.11.1 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 24 Jan 2018 15:38:59 -0000 Hi, FYI, your patch has been queued to LTS release 17.11.1 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 01/26/18. So please shout if anyone has objections. Thanks. --yliu --- >>From 82b3cc87817cd1a66df0f57cbe1cd85bb55b6071 Mon Sep 17 00:00:00 2001 From: Tiwei Bie Date: Mon, 11 Dec 2017 13:13:29 +0800 Subject: [PATCH] net/virtio: fix vector Rx flushing [ upstream commit bcf55c93026ff1db8ff2838766bbaaa38741579e ] 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") Reported-by: Antonio Fischetti Signed-off-by: Tiwei Bie Reviewed-by: Maxime Coquelin Tested-by: Antonio Fischetti Acked-by: Yuanhan Liu --- 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 770c039..0b243f2 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 c3a536f..696d0e4 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 2305d91..ab466c2 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.7.4