From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) by dpdk.org (Postfix) with ESMTP id AB1681B3B8 for ; Thu, 2 Nov 2017 13:03:22 +0100 (CET) Received: by mail-wm0-f66.google.com with SMTP id t139so10886129wmt.1 for ; Thu, 02 Nov 2017 05:03:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=mwoiEAvkwQWN1a29J6QNuzc2f3htOj9rcHJw4zBERaU=; b=r9xPT+qZOOAL2pi3/wfo5UpcK24eWse+11ik95D88CKAK6MRofnITXc3kdvVtRXIqr //8WANUfvAnjM6Iq7oofHKLIXCpve7U4U+RKo4Fr6AIkTjWwqW7M7pGstiwOpnWj752c ttwcPTvwKvjOuwAHYbrtUBHB2wfvgzW3vq92sOQDBATkZqFF/+hLCDhm1YB3tnTiUs8I 5wr62NzU88+wQbwIA6OllrSbh6dLta+a5piYoW42kOcNeoW/P3ZdlWyhcsjaI3ttoTrz Ax5CloJgsiki5rO0fSAw3a8aHdNL6KGH4jZZgDIEpcWEv7mFMyX1FoWnzRkPaP+xTbil KeLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=mwoiEAvkwQWN1a29J6QNuzc2f3htOj9rcHJw4zBERaU=; b=b2hxya3qLBaXw7Gbtq4LmEWbqWUUpKZ7GH5omCd8j7bTc2C0wtuvrtF6OI8ljAAk25 SrE5Qg3Q3rUDuckAnJBrbxjb3J/CTpGjF0pH5Zn/ZF+KvBnc4I0FvFO/LoJrg5OdMOYi 5vd/tshGKfuPOnEMylj/ci5KjiqZfB9zlsSiN2Q5HDjGxtc1rxh48AcqmXBShUod41KI IQuapmiSpZNdqnBe06J+VX7QOkb79cllCp5HQZ7fHv3QDsv+ZkFmxU4e/xdfvQ8rXzoc CPUJlPx2tO2ruQY2i5u7EqEcwlgOYgnVTKhirnCQVUU4r+vzV6ARfAl5DZabW9SbXyBZ waVw== X-Gm-Message-State: AMCzsaVpVBrJjbchDNkD2jM1ZLA249STLviGnSL/HZtZ3IHA+wnf3+l+ FFG/IhhEZEEMxjBTPib9qHI= X-Google-Smtp-Source: ABhQp+RduKet8CG+C3PWHtznV/3YO7XEk+TMi6LfUF3JpNYI/2FH5JyCoW7cGK5AnCxfY/yW1NDfOA== X-Received: by 10.28.152.76 with SMTP id a73mr1311689wme.127.1509624202396; Thu, 02 Nov 2017 05:03:22 -0700 (PDT) Received: from localhost ([2a00:23c5:bef3:400:4a51:b7ff:fe0b:4749]) by smtp.gmail.com with ESMTPSA id c4sm1448122wre.57.2017.11.02.05.03.21 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 02 Nov 2017 05:03:21 -0700 (PDT) From: luca.boccassi@gmail.com To: Tiwei Bie Cc: Jens Freimann , Yuanhan Liu , dpdk stable Date: Thu, 2 Nov 2017 12:02:31 +0000 Message-Id: <20171102120247.10565-2-luca.boccassi@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171102120247.10565-1-luca.boccassi@gmail.com> References: <20171030153511.13322-1-luca.boccassi@gmail.com> <20171102120247.10565-1-luca.boccassi@gmail.com> Subject: [dpdk-stable] patch 'net/virtio: flush Rx queues on start' has been queued to LTS release 16.11.4 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: Thu, 02 Nov 2017 12:03:22 -0000 Hi, FYI, your patch has been queued to LTS release 16.11.4 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/04/17. So please shout if anyone has objections. Thanks. Kind regards, Luca Boccassi --- >>From 75d2da80bb92eff61bdce418a84445103f4b085c 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 6903368db..8592485d7 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -1564,6 +1564,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 08e4e126b..aa985fb6b 100644 --- a/drivers/net/virtio/virtio_rxtx.c +++ b/drivers/net/virtio/virtio_rxtx.c @@ -72,7 +72,7 @@ #define VIRTIO_SIMPLE_FLAGS ((uint32_t)ETH_TXQ_FLAGS_NOMULTSEGS | \ ETH_TXQ_FLAGS_NOOFFLOADS) -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 7f60e3ef1..4f8707ae3 100644 --- a/drivers/net/virtio/virtqueue.c +++ b/drivers/net/virtio/virtqueue.c @@ -70,3 +70,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 569c251c8..ec967a5bd 100644 --- a/drivers/net/virtio/virtqueue.h +++ b/drivers/net/virtio/virtqueue.h @@ -290,6 +290,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) { @@ -298,6 +301,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.11.0