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 E420D237 for ; Tue, 21 Nov 2017 14:27:10 +0100 (CET) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 97950207FE; Tue, 21 Nov 2017 08:27:10 -0500 (EST) Received: from frontend2 ([10.202.2.161]) by compute1.internal (MEProxy); Tue, 21 Nov 2017 08:27:10 -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=6MneP2Pj9BzBEhDia rowkRPBpptr/LwPDSne8gE4Lew=; b=L3MrxYSm40lgF4owvkfeJzGQhV3KyX15h G9IuBC9toVWjLv40Bys4JwMtiXpzeAj28W5p9JTyYJqZ6Y4Loasd4mSIpLmBWDQB kPD/+xflEWObDaxI2vRND93RVVdcoC13HExZ5YxFZ40rwoKDfvMPZDim2sYZSrEI XQ5smPdwwGpmbkzsv2EGW70tnhrX9uVCJdG+mnnLgOaGCTrLuKD3hnjy6jZ7uTxg sktgexSqirNIUgv3vLa89FZoOSdcl4cyZhqhAlnxSx6n4TMmRWET/etbINXzuVdr U5vvd8A/+xD8QSKRZqkl/UqZK43Pn/uM0FTHWohGWGEIqBST1YAaw== 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=6MneP2Pj9BzBEhDiarowkRPBpptr/LwPDSne8gE4Lew=; b=IN5QiJXp mj11niDm1/+blpCBcgbyJCy/7DVNw9D2GXfGIKNCfraPKWPuS7sFfDbUxLKt2vlt CMF7h/XQIDcpnBS8OzsCJYUsvpdLPh4PPSeDX2B0zrGi+zkkG1doOKWO7UAh6+uN JO9bw7FTxeqIM2kyEK4vSrIy1niIbVeB16dfLGJbMWN1vJpfwsZDz5NZso/hOfro uBCZo9N0Q5RZgvFYzE0/GNNdlZjjCCSHcONjNd0qvUmRfKt9q8lNN1sYQ/9ZcCTI 6/M3eLMYiU8zvEJNMDMrDoPyvFP1Q7d/wGqnMPcwKxguIFOtCm4ANn3aGLSCnApW oBUMnf0Yl/colg== X-ME-Sender: Received: from localhost.localdomain (unknown [180.158.62.0]) by mail.messagingengine.com (Postfix) with ESMTPA id 15B7B243B9; Tue, 21 Nov 2017 08:27:05 -0500 (EST) From: Yuanhan Liu To: Tiwei Bie Cc: Jens Freimann , Yuanhan Liu , dpdk stable Date: Tue, 21 Nov 2017 21:17:45 +0800 Message-Id: <1511270333-31002-123-git-send-email-yliu@fridaylinux.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1511270333-31002-1-git-send-email-yliu@fridaylinux.org> References: <1511270333-31002-1-git-send-email-yliu@fridaylinux.org> Subject: [dpdk-stable] patch 'net/virtio: flush Rx queues on start' has been queued to stable release 17.08.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: Tue, 21 Nov 2017 13:27:11 -0000 Hi, FYI, your patch has been queued to stable release 17.08.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 11/24/17. So please shout if anyone has objections. Thanks. --yliu --- >>From f4e455b776f61ec7fbdfb5dce6ba34ad9016689b Mon Sep 17 00:00:00 2001 From: Tiwei Bie Date: Fri, 20 Oct 2017 10:09:28 +0800 Subject: [PATCH] net/virtio: flush Rx queues on start [ upstream commit d8227497ec5c3de75fe378e09fc9673ae097fa73 ] After starting a device, the driver shouldn't deliver the packets that already existed before the device is started to applications. Otherwise it will lead to incorrect packet collection for port state. This patch fixes this issue by flushing the Rx queues when starting the device. Fixes: a85786dc816f ("virtio: fix states handling during initialization") Signed-off-by: Tiwei Bie Reviewed-by: Jens Freimann Acked-by: Yuanhan Liu --- drivers/net/virtio/virtio_ethdev.c | 2 ++ drivers/net/virtio/virtio_rxtx.c | 2 +- drivers/net/virtio/virtqueue.c | 25 +++++++++++++++++++++++++ drivers/net/virtio/virtqueue.h | 5 +++++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index c7888f1..dbd01fb 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -1787,6 +1787,8 @@ 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_notify(rxvq->vq); } diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c index 67e12de..7d5b510 100644 --- a/drivers/net/virtio/virtio_rxtx.c +++ b/drivers/net/virtio/virtio_rxtx.c @@ -81,7 +81,7 @@ virtio_dev_rx_queue_done(void *rxq, uint16_t offset) return VIRTQUEUE_NUSED(vq) >= offset; } -static void +void vq_ring_free_chain(struct virtqueue *vq, uint16_t desc_idx) { struct vring_desc *dp, *dp_tail; diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c index 9ad77b8..c3a536f 100644 --- a/drivers/net/virtio/virtqueue.c +++ b/drivers/net/virtio/virtqueue.c @@ -59,3 +59,28 @@ virtqueue_detatch_unused(struct virtqueue *vq) } return NULL; } + +/* Flush the elements in the used ring. */ +void +virtqueue_flush(struct virtqueue *vq) +{ + struct vring_used_elem *uep; + struct vq_desc_extra *dxp; + uint16_t used_idx, desc_idx; + uint16_t nb_used, i; + + nb_used = VIRTQUEUE_NUSED(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; + } + vq->vq_used_cons_idx++; + vq_ring_free_chain(vq, desc_idx); + } +} diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h index 2e12086..9fffcd8 100644 --- a/drivers/net/virtio/virtqueue.h +++ b/drivers/net/virtio/virtqueue.h @@ -304,6 +304,9 @@ 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); + static inline int virtqueue_full(const struct virtqueue *vq) { @@ -312,6 +315,8 @@ virtqueue_full(const struct virtqueue *vq) #define VIRTQUEUE_NUSED(vq) ((uint16_t)((vq)->vq_ring.used->idx - (vq)->vq_used_cons_idx)) +void vq_ring_free_chain(struct virtqueue *vq, uint16_t desc_idx); + static inline void vq_update_avail_idx(struct virtqueue *vq) { -- 2.7.4