From: Donald Lee <donald_...@trendmicro.com>
After pmd_rx_burst be triggered, it doesn't retrieve all the frames. It may leave some pending frames there. Signed-off-by: Donald Lee <donald_...@trendmicro.com> --- drivers/net/tap/rte_eth_tap.c | 7 ++++++- drivers/net/tap/rte_eth_tap.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c index 3841842f0..e2785e011 100644 --- a/drivers/net/tap/rte_eth_tap.c +++ b/drivers/net/tap/rte_eth_tap.c @@ -353,10 +353,11 @@ pmd_rx_burst(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) unsigned long num_rx_bytes = 0; uint32_t trigger = tap_trigger; - if (trigger == rxq->trigger_seen) + if (trigger == rxq->trigger_seen && !rxq->keep_trigger) return 0; if (trigger) rxq->trigger_seen = trigger; + rxq->keep_trigger = 0; process_private = rte_eth_devices[rxq->in_port].process_private; rte_compiler_barrier(); for (num_rx = 0; num_rx < nb_pkts; ) { @@ -431,6 +432,9 @@ pmd_rx_burst(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) bufs[num_rx++] = mbuf; num_rx_bytes += mbuf->pkt_len; } + /* may have pending packets, keep trigger */ + if (num_rx == nb_pkts) + rxq->keep_trigger = 1; end: rxq->stats.ipackets += num_rx; rxq->stats.ibytes += num_rx_bytes; @@ -1352,6 +1356,7 @@ tap_rx_queue_setup(struct rte_eth_dev *dev, rxq->mp = mp; rxq->trigger_seen = 1; /* force initial burst */ + rxq->keep_trigger = 0; rxq->in_port = dev->data->port_id; rxq->queue_id = rx_queue_id; rxq->nb_rx_desc = nb_desc; diff --git a/drivers/net/tap/rte_eth_tap.h b/drivers/net/tap/rte_eth_tap.h index 8d6d53dc0..842e8c0b7 100644 --- a/drivers/net/tap/rte_eth_tap.h +++ b/drivers/net/tap/rte_eth_tap.h @@ -45,6 +45,7 @@ struct pkt_stats { struct rx_queue { struct rte_mempool *mp; /* Mempool for RX packets */ uint32_t trigger_seen; /* Last seen Rx trigger value */ + uint16_t keep_trigger; /* Keep trigger state */ uint16_t in_port; /* Port ID */ uint16_t queue_id; /* queue ID*/ struct pkt_stats stats; /* Stats for this RX queue */ -- 2.19.1