From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by dpdk.org (Postfix) with ESMTP id 892221B31A for ; Fri, 26 Jan 2018 14:15:53 +0100 (CET) Received: by mail-wm0-f65.google.com with SMTP id f71so1197518wmf.0 for ; Fri, 26 Jan 2018 05:15:53 -0800 (PST) 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=alCPKJ+8/6JuuT3SnrLSazGtPR8+VEBqbiAKXnD5CqI=; b=R/UnwEN2RlCpxjv69SN1gmvf3S6cNtgGVQp5WWIKEUEh+WH1qpaChGe3juIfXLIrax +kHukLgwGlEhmTvJmilAx89tnfEdsyC1Vrzj9KbpWWgUV5BPJdSSkScAntsnsjtVkb5B 4KDwPbORYuwS6SkX0x0NHunrG1KF9TOh3lerZ3zJiVtTiNjYm1+1bWAiRg9GNij9X7y+ dywQWBWBQj7YaS36DLaeQ7r69iRbvqKbldJEenA6rOhBEbvp7f17aDgsDW+bHhAg8t1N yt80JDAobRCDIfd6/7Zoquhm9ClRXT5dyQOirYGSkuFJ/3Z9HXc+rwxC1TwI+hj8/LVN BLnA== 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=alCPKJ+8/6JuuT3SnrLSazGtPR8+VEBqbiAKXnD5CqI=; b=IZkCY4VuNBruekTZpueUuxRqnGc+PqBQx9puAM7kO587WU2XnFD2R9Qxhp6AKsF3Kn CwftyU57ShymzOIxg/GEs2khf2Kkiev3zqmeSrmxMrCmjOwHkvSV+nwxWfOPp5+T2IXE JbDx65EL9+9c0xiKBJF0Nho7tX/JzWN4dIBUZP0HiNVWBtkggRnvJplciMkMb5beHr0p 8mlDGfXRmlYeqfe7rMHKBCJUh3knywC8JE6rsY5HsuZNPnp4DsfLOj3n+zfEEDKoLzEa Lc5LlbSobAUejVYIx8HvSogRAjIdKubPtHZKhK3a/ECZebpZUtn5WaIO/wi2DxHA/0Lf z+oA== X-Gm-Message-State: AKwxytclOkoKUXWS65yH64EPU6e+YhdqUqDn02UWvnoerBdGJp43NXVn Tpjt72Rbu7DV5cFTgQz3q6cQxjknGZM= X-Google-Smtp-Source: AH8x226RvRymVxIrDW0MVT3tyIn3MTwDMfXt1jJfrCncdCcXLnUvt/mCiRx1OyCFiRjtYq/OB9Q1gA== X-Received: by 10.28.66.199 with SMTP id k68mr11173570wmi.104.1516972553258; Fri, 26 Jan 2018 05:15:53 -0800 (PST) Received: from localhost ([2a00:23c5:bef3:400:9531:588b:44ae:bec4]) by smtp.gmail.com with ESMTPSA id j126sm3897911wmj.1.2018.01.26.05.15.52 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 26 Jan 2018 05:15:52 -0800 (PST) From: luca.boccassi@gmail.com To: Tiwei Bie Cc: Antonio Fischetti , Maxime Coquelin , Yuanhan Liu , dpdk stable Date: Fri, 26 Jan 2018 13:13:02 +0000 Message-Id: <20180126131332.15346-32-luca.boccassi@gmail.com> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20180126131332.15346-1-luca.boccassi@gmail.com> References: <20180126131332.15346-1-luca.boccassi@gmail.com> Subject: [dpdk-stable] patch 'net/virtio: fix vector Rx flushing' has been queued to LTS release 16.11.5 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: Fri, 26 Jan 2018 13:15:53 -0000 Hi, FYI, your patch has been queued to LTS release 16.11.5 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/28/18. So please shout if anyone has objections. Thanks. Luca Boccassi --- >>From 1b41fae3d2d5af298627dda9d35c25656450c861 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 3abaeabb2..4d6efd5ac 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -1565,7 +1565,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 4f8707ae3..0e24194a5 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" void virtqueue_disable_intr(struct virtqueue *vq) @@ -73,8 +74,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; @@ -85,13 +88,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_rxtx) { + 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_rxtx) { + 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 ec967a5bd..421485473 100644 --- a/drivers/net/virtio/virtqueue.h +++ b/drivers/net/virtio/virtqueue.h @@ -291,7 +291,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.14.2