From: Mattias Rönnblom Date: Wed, 10 Nov 2021 11:14:00 +0000 (+0100) Subject: eventdev/eth_rx: fix stalls on event device backpressure X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=572dce2bf9f45e7bb46a6a58953058715971a6f0;p=dpdk.git eventdev/eth_rx: fix stalls on event device backpressure In the Eventdev Ethernet RX Adapter, correctly handle the case where the circular enqueue buffer head and last index point to the same element. 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") Signed-off-by: Mattias Rönnblom Acked-by: Jay Jayatheerthan --- 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;