event/dpaa2: add retry break in packet enqueue
authorNipun Gupta <nipun.gupta@nxp.com>
Mon, 30 Sep 2019 08:32:13 +0000 (14:02 +0530)
committerJerin Jacob <jerinj@marvell.com>
Sat, 5 Oct 2019 13:39:31 +0000 (15:39 +0200)
The patch adds the break in the TX function, if it is failing
to send the packets out. Previously the system was trying
infinitely to send packet out.

Signed-off-by: Nipun Gupta <nipun.gupta@nxp.com>
drivers/event/dpaa2/dpaa2_eventdev.c

index 9255de1..834d3cb 100644 (file)
@@ -49,6 +49,7 @@
 
 /* Dynamic logging identified for mempool */
 int dpaa2_logtype_event;
+#define DPAA2_EV_TX_RETRY_COUNT 10000
 
 static uint16_t
 dpaa2_eventdev_enqueue_burst(void *port, const struct rte_event ev[],
@@ -59,7 +60,7 @@ dpaa2_eventdev_enqueue_burst(void *port, const struct rte_event ev[],
        struct dpaa2_dpio_dev *dpio_dev;
        uint32_t queue_id = ev[0].queue_id;
        struct dpaa2_eventq *evq_info;
-       uint32_t fqid;
+       uint32_t fqid, retry_count;
        struct qbman_swp *swp;
        struct qbman_fd fd_arr[MAX_TX_RING_SLOTS];
        uint32_t loop, frames_to_send;
@@ -162,13 +163,25 @@ skip_linking:
                }
 send_partial:
                loop = 0;
+               retry_count = 0;
                while (loop < frames_to_send) {
-                       loop += qbman_swp_enqueue_multiple_desc(swp,
+                       ret = qbman_swp_enqueue_multiple_desc(swp,
                                        &eqdesc[loop], &fd_arr[loop],
                                        frames_to_send - loop);
+                       if (unlikely(ret < 0)) {
+                               retry_count++;
+                               if (retry_count > DPAA2_EV_TX_RETRY_COUNT) {
+                                       num_tx += loop;
+                                       nb_events -= loop;
+                                       return num_tx + loop;
+                               }
+                       } else {
+                               loop += ret;
+                               retry_count = 0;
+                       }
                }
-               num_tx += frames_to_send;
-               nb_events -= frames_to_send;
+               num_tx += loop;
+               nb_events -= loop;
        }
 
        return num_tx;