]> git.droids-corp.org - dpdk.git/commitdiff
net/virtio: fix vectorized Rx queue rearm
authorXueming Li <xuemingl@nvidia.com>
Wed, 14 Apr 2021 14:14:04 +0000 (22:14 +0800)
committerMaxime Coquelin <maxime.coquelin@redhat.com>
Tue, 4 May 2021 08:08:11 +0000 (10:08 +0200)
When Rx queue worked in vectorized mode and rxd <= 512, under traffic of
high PPS rate, testpmd often start and receive packets of rxd without
further growth.

Testpmd started with rxq flush which tried to rx MAX_PKT_BURST(512)
packets and drop. When Rx burst size >= Rx queue size, all descriptors
in used queue consumed without rearm, device can't receive more packets.
The next Rx burst returned at once since no used descriptors found,
rearm logic was skipped, rx vq kept in starving state.

To avoid rx vq starving, this patch always check the available queue,
rearm if needed even no used descriptor reported by device.

Fixes: fc3d66212fed ("virtio: add vector Rx")
Fixes: 2d7c37194ee4 ("net/virtio: add NEON based Rx handler")
Fixes: 52b5a707e6ca ("net/virtio: add Altivec Rx")
Cc: stable@dpdk.org
Signed-off-by: Xueming Li <xuemingl@nvidia.com>
Reviewed-by: David Christensen <drc@linux.vnet.ibm.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
drivers/net/virtio/virtio_rxtx_simple_altivec.c
drivers/net/virtio/virtio_rxtx_simple_neon.c
drivers/net/virtio/virtio_rxtx_simple_sse.c

index 62e5100a48dcfe98801ffa71b5a902a365a05248..7534974ef4bc87be66ddd408e91a5d93dd10e9a5 100644 (file)
@@ -85,6 +85,12 @@ virtio_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
        if (unlikely(nb_pkts < RTE_VIRTIO_DESC_PER_LOOP))
                return 0;
 
+       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_used = virtqueue_nused(vq);
 
        rte_compiler_barrier();
@@ -102,12 +108,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;
index c8e4b13a0278cc2bbc72372933e72615639d91b1..7fd92d1b0ca459038cfc2989b660cbb39238274a 100644 (file)
@@ -84,6 +84,12 @@ virtio_recv_pkts_vec(void *rx_queue,
        if (unlikely(nb_pkts < RTE_VIRTIO_DESC_PER_LOOP))
                return 0;
 
+       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);
+       }
+
        /* virtqueue_nused has a load-acquire or rte_io_rmb inside */
        nb_used = virtqueue_nused(vq);
 
@@ -100,12 +106,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;
index ff4eba33d6f2b4f1a299cee4efe128bec817d9bc..7577f5e86d178c7b5d978741ef16d2d0b26a1991 100644 (file)
@@ -85,6 +85,12 @@ virtio_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
        if (unlikely(nb_pkts < RTE_VIRTIO_DESC_PER_LOOP))
                return 0;
 
+       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_used = virtqueue_nused(vq);
 
        if (unlikely(nb_used == 0))
@@ -100,12 +106,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;