Fix IOVA reserve failure for memory regions listed in dma-ranges in the following cases.
- start address of memory region is 0x0. - end address of a memory region is equal to start address of next memory region. Fixes: aadad097cd46f ("iommu/dma: Reserve IOVA for PCIe inaccessible DMA address") Signed-off-by: Srinath Mannam <srinath.man...@broadcom.com> --- drivers/iommu/dma-iommu.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index 5141d49a046b..0a3f67a4f9ae 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -213,14 +213,21 @@ static int iova_reserve_pci_windows(struct pci_dev *dev, resource_list_for_each_entry(window, &bridge->dma_ranges) { end = window->res->start - window->offset; resv_iova: + if (end < start) { + /* dma_ranges list should be sorted */ + dev_err(&dev->dev, "Failed to reserve IOVA\n"); + return -EINVAL; + } + /* + * Skip the cases when start address of first memory region is + * 0x0 and end address of one memory region and start address + * of next memory region are equal. Reserve IOVA for rest of + * addresses fall in between given memory ranges. + */ if (end > start) { lo = iova_pfn(iovad, start); hi = iova_pfn(iovad, end); reserve_iova(iovad, lo, hi); - } else { - /* dma_ranges list should be sorted */ - dev_err(&dev->dev, "Failed to reserve IOVA\n"); - return -EINVAL; } start = window->res->end - window->offset + 1; -- 2.17.1 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu