summaryrefslogtreecommitdiffstats
path: root/drivers/iommu
diff options
context:
space:
mode:
authorAlex Williamson <alex.williamson@redhat.com>2017-11-03 17:50:31 +0100
committerAlex Williamson <alex.williamson@redhat.com>2017-11-03 17:50:31 +0100
commit07d1c91b6c649705fdd9acf58001071845ecf068 (patch)
tree24218f13c7107d4079bbc0dc556aedf6a19d182f /drivers/iommu
parentMerge branches 'iommu/fixes', 'arm/omap', 'arm/exynos', 'x86/amd', 'x86/vt-d'... (diff)
downloadlinux-07d1c91b6c649705fdd9acf58001071845ecf068.tar.xz
linux-07d1c91b6c649705fdd9acf58001071845ecf068.zip
iommu/amd: Fix alloc_irq_index() increment
On an is_allocated() interrupt index, we ALIGN() the current index and then increment it via the for loop, guaranteeing that it is no longer aligned for alignments >1. We instead need to align the next index, to guarantee forward progress, moving the increment-only to the case where the index was found to be unallocated. Fixes: 37946d95fc1a ('iommu/amd: Add align parameter to alloc_irq_index()') Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Diffstat (limited to 'drivers/iommu')
-rw-r--r--drivers/iommu/amd_iommu.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
index 9dc7facfd2e5..3c1a29104f0e 100644
--- a/drivers/iommu/amd_iommu.c
+++ b/drivers/iommu/amd_iommu.c
@@ -3682,13 +3682,12 @@ static int alloc_irq_index(u16 devid, int count, bool align)
/* Scan table for free entries */
for (index = ALIGN(table->min_index, alignment), c = 0;
- index < MAX_IRQS_PER_TABLE;
- index++) {
+ index < MAX_IRQS_PER_TABLE;) {
if (!iommu->irte_ops->is_allocated(table, index)) {
c += 1;
} else {
c = 0;
- index = ALIGN(index, alignment);
+ index = ALIGN(index + 1, alignment);
continue;
}
@@ -3699,6 +3698,8 @@ static int alloc_irq_index(u16 devid, int count, bool align)
index -= count - 1;
goto out;
}
+
+ index++;
}
index = -ENOSPC;