From patchwork Wed Apr 14 04:26:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xueming Li X-Patchwork-Id: 91396 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id DDC62A0524; Wed, 14 Apr 2021 06:27:19 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1CD99161669; Wed, 14 Apr 2021 06:27:19 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by mails.dpdk.org (Postfix) with ESMTP id 34DD7161666 for ; Wed, 14 Apr 2021 06:27:17 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from xuemingl@nvidia.com) with SMTP; 14 Apr 2021 07:27:16 +0300 Received: from nvidia.com ([172.27.8.56]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 13E4RBFO003097; Wed, 14 Apr 2021 07:27:12 +0300 From: Xueming Li To: Cc: dev@dpdk.org, xuemingl@nvidia.com, huawei.xie@intel.com, jerin.jacob@caviumnetworks.com, drc@linux.vnet.ibm.com, stable@dpdk.org, Maxime Coquelin , Chenbo Xia , Jerin Jacob , Ruifeng Wang , Bruce Richardson , Konstantin Ananyev , Jianfeng Tan , Jianbo Liu , Yuanhan Liu Date: Wed, 14 Apr 2021 12:26:31 +0800 Message-Id: <20210414042631.7041-1-xuemingl@nvidia.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH] net/virtio: fix vectorized Rx queue stuck X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" When Rx burst size >= Rx queue size, all descriptors in used queue consumed without rearm, the next Rx burst found no new packets and returned directly without rearm as well. This patch rearms available queue at once after rx_burst to avoid vq hungry. Fixes: fc3d66212fed ("virtio: add vector Rx") Cc: huawei.xie@intel.com Fixes: 2d7c37194ee4 ("net/virtio: add NEON based Rx handler") Cc: jerin.jacob@caviumnetworks.com Fixes: 52b5a707e6ca ("net/virtio: add Altivec Rx") Cc: drc@linux.vnet.ibm.com Cc: stable@dpdk.org Signed-off-by: Xueming Li --- drivers/net/virtio/virtio_rxtx_simple_altivec.c | 12 ++++++------ drivers/net/virtio/virtio_rxtx_simple_neon.c | 12 ++++++------ drivers/net/virtio/virtio_rxtx_simple_sse.c | 12 ++++++------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/drivers/net/virtio/virtio_rxtx_simple_altivec.c b/drivers/net/virtio/virtio_rxtx_simple_altivec.c index 62e5100a48..1ffae234da 100644 --- a/drivers/net/virtio/virtio_rxtx_simple_altivec.c +++ b/drivers/net/virtio/virtio_rxtx_simple_altivec.c @@ -102,12 +102,6 @@ virtio_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, rte_prefetch0(rused); - if (vq->vq_free_cnt >= RTE_VIRTIO_VPMD_RX_REARM_THRESH) { - virtio_rxq_rearm_vec(rxvq); - if (unlikely(virtqueue_kick_prepare(vq))) - virtqueue_notify(vq); - } - nb_total = nb_used; ref_rx_pkts = rx_pkts; for (nb_pkts_received = 0; @@ -204,5 +198,11 @@ virtio_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, for (nb_used = 0; nb_used < nb_pkts_received; nb_used++) virtio_update_packet_stats(&rxvq->stats, ref_rx_pkts[nb_used]); + if (vq->vq_free_cnt >= RTE_VIRTIO_VPMD_RX_REARM_THRESH) { + virtio_rxq_rearm_vec(rxvq); + if (unlikely(virtqueue_kick_prepare(vq))) + virtqueue_notify(vq); + } + return nb_pkts_received; } diff --git a/drivers/net/virtio/virtio_rxtx_simple_neon.c b/drivers/net/virtio/virtio_rxtx_simple_neon.c index c8e4b13a02..341dedce41 100644 --- a/drivers/net/virtio/virtio_rxtx_simple_neon.c +++ b/drivers/net/virtio/virtio_rxtx_simple_neon.c @@ -100,12 +100,6 @@ virtio_recv_pkts_vec(void *rx_queue, rte_prefetch_non_temporal(rused); - if (vq->vq_free_cnt >= RTE_VIRTIO_VPMD_RX_REARM_THRESH) { - virtio_rxq_rearm_vec(rxvq); - if (unlikely(virtqueue_kick_prepare(vq))) - virtqueue_notify(vq); - } - nb_total = nb_used; ref_rx_pkts = rx_pkts; for (nb_pkts_received = 0; @@ -210,5 +204,11 @@ virtio_recv_pkts_vec(void *rx_queue, for (nb_used = 0; nb_used < nb_pkts_received; nb_used++) virtio_update_packet_stats(&rxvq->stats, ref_rx_pkts[nb_used]); + if (vq->vq_free_cnt >= RTE_VIRTIO_VPMD_RX_REARM_THRESH) { + virtio_rxq_rearm_vec(rxvq); + if (unlikely(virtqueue_kick_prepare(vq))) + virtqueue_notify(vq); + } + return nb_pkts_received; } diff --git a/drivers/net/virtio/virtio_rxtx_simple_sse.c b/drivers/net/virtio/virtio_rxtx_simple_sse.c index ff4eba33d6..2e17f9d1f2 100644 --- a/drivers/net/virtio/virtio_rxtx_simple_sse.c +++ b/drivers/net/virtio/virtio_rxtx_simple_sse.c @@ -100,12 +100,6 @@ virtio_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, rte_prefetch0(rused); - if (vq->vq_free_cnt >= RTE_VIRTIO_VPMD_RX_REARM_THRESH) { - virtio_rxq_rearm_vec(rxvq); - if (unlikely(virtqueue_kick_prepare(vq))) - virtqueue_notify(vq); - } - nb_total = nb_used; ref_rx_pkts = rx_pkts; for (nb_pkts_received = 0; @@ -194,5 +188,11 @@ virtio_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, for (nb_used = 0; nb_used < nb_pkts_received; nb_used++) virtio_update_packet_stats(&rxvq->stats, ref_rx_pkts[nb_used]); + if (vq->vq_free_cnt >= RTE_VIRTIO_VPMD_RX_REARM_THRESH) { + virtio_rxq_rearm_vec(rxvq); + if (unlikely(virtqueue_kick_prepare(vq))) + virtqueue_notify(vq); + } + return nb_pkts_received; }