[dpdk-dev] [PATCH] eventdev: fix Rx adapter stalls on event device backpressure

Mattias Rönnblom mattias.ronnblom at ericsson.com
Mon Nov 8 14:25:58 CET 2021


In the Eventdev Ethernet RX Adapter, correctly handle the case where
the circular enqueue buffer head and tail index points to the same
element (i.e., the buffer is full) and the buffer has wrapped.

This bug may be triggered in case there is backpressure from the event
device to the RX adapter.

Fixes: 8113fd15e229 ("eventdev/eth_rx: make enqueue buffer circular")
Cc: ganapati.kundapura at intel.com
Cc: stable at dpdk.org

Signed-off-by: Mattias Rönnblom <mattias.ronnblom at ericsson.com>
---
 lib/eventdev/rte_event_eth_rx_adapter.c | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/lib/eventdev/rte_event_eth_rx_adapter.c b/lib/eventdev/rte_event_eth_rx_adapter.c
index 56318b5a6f..809416d9b7 100644
--- a/lib/eventdev/rte_event_eth_rx_adapter.c
+++ b/lib/eventdev/rte_event_eth_rx_adapter.c
@@ -777,19 +777,25 @@ rxa_flush_event_buffer(struct event_eth_rx_adapter *rx_adapter,
 		       struct eth_event_enqueue_buffer *buf,
 		       struct rte_event_eth_rx_adapter_stats *stats)
 {
-	uint16_t count = buf->last ? buf->last - buf->head : buf->count;
+	uint16_t count = buf->count;
+	uint16_t n = 0;
 
 	if (!count)
 		return 0;
 
-	uint16_t n = rte_event_enqueue_new_burst(rx_adapter->eventdev_id,
-					rx_adapter->event_port_id,
-					&buf->events[buf->head],
-					count);
-	if (n != count)
-		stats->rx_enq_retry++;
+	if (buf->last)
+		count = buf->last - buf->head;
+
+	if (count) {
+		n = rte_event_enqueue_new_burst(rx_adapter->eventdev_id,
+						rx_adapter->event_port_id,
+						&buf->events[buf->head],
+						count);
+		if (n != count)
+			stats->rx_enq_retry++;
 
-	buf->head += n;
+		buf->head += n;
+	}
 
 	if (buf->last && n == count) {
 		uint16_t n1;
-- 
2.25.1



More information about the dev mailing list