From 63990aeb08f45f0acd435f67fd52a3736a493563 Mon Sep 17 00:00:00 2001 From: Bruce Richardson Date: Tue, 11 Jan 2022 13:41:04 +0000 Subject: [PATCH] dma/idxd: fix wrap-around in burst capacity calculation The burst capacity calculation code assumes that the write and read (i.e. ids_returned) values both wrap at the ring-size, but the read value instead wraps as UINT16_MAX. Therefore, instead of just adding ring-size to the write value in case the read is greater, we need to just always mask the result to ensure a correct, in-range, value. Fixes: 9459de4edc99 ("dma/idxd: add burst capacity") Cc: stable@dpdk.org Reported-by: Sunil Pai G Signed-off-by: Bruce Richardson Tested-by: Sunil Pai G Acked-by: Kevin Laatz --- drivers/dma/idxd/idxd_common.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/dma/idxd/idxd_common.c b/drivers/dma/idxd/idxd_common.c index 4442d1cbbd..ea6413cc7a 100644 --- a/drivers/dma/idxd/idxd_common.c +++ b/drivers/dma/idxd/idxd_common.c @@ -480,10 +480,8 @@ idxd_burst_capacity(const void *dev_private, uint16_t vchan __rte_unused) idxd->batch_idx_write + 1 == idxd->batch_idx_read) return 0; - /* For descriptors, check for wrap-around on write but not read */ - if (idxd->ids_returned > write_idx) - write_idx += idxd->desc_ring_mask + 1; - used_space = write_idx - idxd->ids_returned; + /* Subtract and mask to get in correct range */ + used_space = (write_idx - idxd->ids_returned) & idxd->desc_ring_mask; const int ret = RTE_MIN((idxd->desc_ring_mask - used_space), (idxd->max_batch_size - idxd->batch_size)); -- 2.39.5