]> git.droids-corp.org - dpdk.git/commitdiff
dma/idxd: fix wrap-around in burst capacity calculation
authorBruce Richardson <bruce.richardson@intel.com>
Tue, 11 Jan 2022 13:41:04 +0000 (13:41 +0000)
committerThomas Monjalon <thomas@monjalon.net>
Thu, 20 Jan 2022 13:05:14 +0000 (14:05 +0100)
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 <sunil.pai.g@intel.com>
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Tested-by: Sunil Pai G <sunil.pai.g@intel.com>
Acked-by: Kevin Laatz <kevin.laatz@intel.com>
drivers/dma/idxd/idxd_common.c

index 4442d1cbbddea714387f5fcae2dbc1ef8c987e1c..ea6413cc7a90b1d7a3287dbf8172c0266d2e9d55 100644 (file)
@@ -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));