From: Jun Yang <[email protected]>

qdma_cntx_idx_ring_eq() copied the completion indices into the ring one
element at a time, masking the tail against DPAA2_QDMA_MAX_DESC on every
iteration. The number of elements and the available free space are both
known on entry, so the per-element masking is avoidable work in the
dequeue path.

Replace the loop with at most two memcpy() calls, one for the region up
to the end of the ring and one for the wrapped remainder, and advance
ring->tail by the full count once.

No functional change.

Signed-off-by: Jun Yang <[email protected]>
Signed-off-by: Prashant Gupta <[email protected]>
---
 drivers/dma/dpaa2/dpaa2_qdma.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/dma/dpaa2/dpaa2_qdma.c b/drivers/dma/dpaa2/dpaa2_qdma.c
index f7d94bb799..7d3f3d2003 100644
--- a/drivers/dma/dpaa2/dpaa2_qdma.c
+++ b/drivers/dma/dpaa2/dpaa2_qdma.c
@@ -66,16 +66,19 @@ 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;
+       uint16_t first;
 
        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);
-       }
+       first = RTE_MIN(nb, (uint16_t)(DPAA2_QDMA_MAX_DESC - ring->tail));
+       memcpy(&ring->cntx_idx_ring[ring->tail], elem,
+               first * sizeof(uint16_t));
+       if (nb > first)
+               memcpy(&ring->cntx_idx_ring[0], &elem[first],
+                       (nb - first) * 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