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

