net/tap: fix blocked Rx packets
authorMarcin Smoczynski <marcinx.smoczynski@intel.com>
Mon, 23 Sep 2019 13:22:47 +0000 (15:22 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 23 Oct 2019 14:43:08 +0000 (16:43 +0200)
When OS sends more packets than are being read with a single
'rte_eth_rx_burst' call, rx packets are getting stucked in the tap pmd
and are unable to receive, because trigger_seen is getting updated
and consecutive calls are not getting any packets.

Do not update trigger_seen unless less than a max number of packets were
received allowing next call to receive the rest.

Remove unnecessary compiler barrier.

Fixes: a0d8e807d9de ("net/tap: add Rx trigger")
Cc: stable@dpdk.org
Signed-off-by: Marcin Smoczynski <marcinx.smoczynski@intel.com>
Tested-by: Mariusz Drost <mariuszx.drost@intel.com>
Tested-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Reviewed-by: Keith Wiles <keith.wiles@intel.com>
drivers/net/tap/rte_eth_tap.c

index 922371c..a13d8d5 100644 (file)
@@ -353,10 +353,8 @@ pmd_rx_burst(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
 
        if (trigger == rxq->trigger_seen)
                return 0;
-       if (trigger)
-               rxq->trigger_seen = trigger;
+
        process_private = rte_eth_devices[rxq->in_port].process_private;
-       rte_compiler_barrier();
        for (num_rx = 0; num_rx < nb_pkts; ) {
                struct rte_mbuf *mbuf = rxq->pool;
                struct rte_mbuf *seg = NULL;
@@ -433,6 +431,9 @@ end:
        rxq->stats.ipackets += num_rx;
        rxq->stats.ibytes += num_rx_bytes;
 
+       if (trigger && num_rx < nb_pkts)
+               rxq->trigger_seen = trigger;
+
        return num_rx;
 }