| From 97db3a0202da5f77fe210f1e74e2c0a16c57400d Mon Sep 17 00:00:00 2001 |
| From: Jerry Snitselaar <jsnitsel@redhat.com> |
| Date: Sat, 19 Jan 2019 10:38:05 -0700 |
| Subject: iommu/amd: Unmap all mapped pages in error path of map_sg |
| |
| [ Upstream commit f1724c0883bb0ce93b8dcb94b53dcca3b75ac9a7 ] |
| |
| In the error path of map_sg there is an incorrect if condition |
| for breaking out of the loop that searches the scatterlist |
| for mapped pages to unmap. Instead of breaking out of the |
| loop once all the pages that were mapped have been unmapped, |
| it will break out of the loop after it has unmapped 1 page. |
| Fix the condition, so it breaks out of the loop only after |
| all the mapped pages have been unmapped. |
| |
| Fixes: 80187fd39dcb ("iommu/amd: Optimize map_sg and unmap_sg") |
| Cc: Joerg Roedel <joro@8bytes.org> |
| Signed-off-by: Jerry Snitselaar <jsnitsel@redhat.com> |
| Signed-off-by: Joerg Roedel <jroedel@suse.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/iommu/amd_iommu.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c |
| index 2a5c05ca7fca..2ab87e3f07e6 100644 |
| --- a/drivers/iommu/amd_iommu.c |
| +++ b/drivers/iommu/amd_iommu.c |
| @@ -2555,7 +2555,7 @@ static int map_sg(struct device *dev, struct scatterlist *sglist, |
| bus_addr = address + s->dma_address + (j << PAGE_SHIFT); |
| iommu_unmap_page(domain, bus_addr, PAGE_SIZE); |
| |
| - if (--mapped_pages) |
| + if (--mapped_pages == 0) |
| goto out_free_iova; |
| } |
| } |
| -- |
| 2.19.1 |
| |