From: Gagandeep Singh <[email protected]>

qdma_cntx_idx_ring_eq() copied the context indices into the ring one
element at a time in a loop, updating the tail on every iteration.

Replace the per-element loop with rte_memcpy(), handling the ring
wrap-around as at most two contiguous copies, and update the tail once.
This reduces the per-burst overhead on the dequeue completion path.

Signed-off-by: Gagandeep Singh <[email protected]>
---
 drivers/dma/dpaa2/dpaa2_qdma.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/drivers/dma/dpaa2/dpaa2_qdma.c b/drivers/dma/dpaa2/dpaa2_qdma.c
index 4ad72c5816..1e9ec463aa 100644
--- a/drivers/dma/dpaa2/dpaa2_qdma.c
+++ b/drivers/dma/dpaa2/dpaa2_qdma.c
@@ -66,15 +66,23 @@ qdma_cntx_idx_ring_eq(struct qdma_cntx_idx_ring *ring,
        const uint16_t *elem, uint16_t nb,
        uint16_t *free_space)
 {
-       uint16_t i;
-
        if (unlikely(nb > ring->free_space))
                return 0;
 
-       for (i = 0; i < nb; i++) {
-               ring->cntx_idx_ring[ring->tail] = elem[i];
-               ring->tail = (ring->tail + 1) &
-                       (DPAA2_QDMA_MAX_DESC - 1);
+       if ((ring->tail + nb) < DPAA2_QDMA_MAX_DESC) {
+               rte_memcpy(&ring->cntx_idx_ring[ring->tail],
+                       elem, nb * sizeof(uint16_t));
+               ring->tail += nb;
+       } else {
+               rte_memcpy(&ring->cntx_idx_ring[ring->tail],
+                       elem,
+                       (DPAA2_QDMA_MAX_DESC - ring->tail) *
+                       sizeof(uint16_t));
+               rte_memcpy(&ring->cntx_idx_ring[0],
+                       &elem[DPAA2_QDMA_MAX_DESC - ring->tail],
+                       (nb - DPAA2_QDMA_MAX_DESC + ring->tail) *
+                       sizeof(uint16_t));
+               ring->tail = (ring->tail + nb) & (DPAA2_QDMA_MAX_DESC - 1);
        }
        ring->free_space -= nb;
        ring->nb_in_ring += nb;
-- 
2.43.0

Reply via email to