]> git.droids-corp.org - dpdk.git/commitdiff
eventdev/eth_rx: fix stalls on event device backpressure
authorMattias Rönnblom <mattias.ronnblom@ericsson.com>
Wed, 10 Nov 2021 11:14:00 +0000 (12:14 +0100)
committerJerin Jacob <jerinj@marvell.com>
Mon, 15 Nov 2021 07:22:38 +0000 (08:22 +0100)
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 <mattias.ronnblom@ericsson.com>
Acked-by: Jay Jayatheerthan <jay.jayatheerthan@intel.com>
lib/eventdev/rte_event_eth_rx_adapter.c

index 56318b5a6f7dd37deaaf825c4e0fbb9ae29ea262..809416d9b79c4e6183872f433571a8abb8952510 100644 (file)
@@ -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;