|
@@ -1484,6 +1484,10 @@ static unsigned long iommu_unmap_page(struct protection_domain *dom,
|
|
|
|
|
|
/* Large PTE found which maps this address */
|
|
|
unmap_size = PTE_PAGE_SIZE(*pte);
|
|
|
+
|
|
|
+ /* Only unmap from the first pte in the page */
|
|
|
+ if ((unmap_size - 1) & bus_addr)
|
|
|
+ break;
|
|
|
count = PAGE_SIZE_PTE_COUNT(unmap_size);
|
|
|
for (i = 0; i < count; i++)
|
|
|
pte[i] = 0ULL;
|
|
@@ -1493,7 +1497,7 @@ static unsigned long iommu_unmap_page(struct protection_domain *dom,
|
|
|
unmapped += unmap_size;
|
|
|
}
|
|
|
|
|
|
- BUG_ON(!is_power_of_2(unmapped));
|
|
|
+ BUG_ON(unmapped && !is_power_of_2(unmapped));
|
|
|
|
|
|
return unmapped;
|
|
|
}
|