Skip to content

Commit

Permalink
iommu/vt-d: Fix infinite loop in free_all_cpu_cached_iovas
Browse files Browse the repository at this point in the history
Per VT-d spec Section 10.4.2 ("Capability Register"), the maximum
number of possible domains is 64K; indeed this is the maximum value
that the cap_ndoms() macro will expand to.  Since the value 65536
will not fix in a u16, the 'did' variable must be promoted to an
int, otherwise the test for < 65536 will always be true and the
loop will never end.

The symptom, in my case, was a hung machine during suspend.

Fixes: 3bd4f91 ("iommu/vt-d: Fix overflow of iommu->domains array")
Signed-off-by: Aaron Campbell <aaron@monkey.org>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
  • Loading branch information
Aaron Campbell authored and Joerg Roedel committed Jul 4, 2016
1 parent a99cde4 commit 0caa761
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions drivers/iommu/intel-iommu.c
Original file line number Diff line number Diff line change
@@ -4602,13 +4602,13 @@ static void free_all_cpu_cached_iovas(unsigned int cpu)
for (i = 0; i < g_num_of_iommus; i++) {
struct intel_iommu *iommu = g_iommus[i];
struct dmar_domain *domain;
u16 did;
int did;

if (!iommu)
continue;

for (did = 0; did < cap_ndoms(iommu->cap); did++) {
domain = get_iommu_domain(iommu, did);
domain = get_iommu_domain(iommu, (u16)did);

if (!domain)
continue;

0 comments on commit 0caa761

Please sign in to comment.