Skip to content

Commit 1196f1f

Browse files
Alex Mastroawilliam
authored andcommitted
vfio/type1: move iova increment to unmap_unpin_*() caller
Move incrementing iova to the caller of these functions as part of preparing to handle end of address space map/unmap. Tested-by: Alejandro Jimenez <[email protected]> Fixes: 73fa0d1 ("vfio: Type1 IOMMU implementation") Reviewed-by: Jason Gunthorpe <[email protected]> Reviewed-by: Alejandro Jimenez <[email protected]> Signed-off-by: Alex Mastro <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alex Williamson <[email protected]>
1 parent 6012379 commit 1196f1f

File tree

1 file changed

+10
-10
lines changed

1 file changed

+10
-10
lines changed

drivers/vfio/vfio_iommu_type1.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,7 +1083,7 @@ static long vfio_sync_unpin(struct vfio_dma *dma, struct vfio_domain *domain,
10831083
#define VFIO_IOMMU_TLB_SYNC_MAX 512
10841084

10851085
static size_t unmap_unpin_fast(struct vfio_domain *domain,
1086-
struct vfio_dma *dma, dma_addr_t *iova,
1086+
struct vfio_dma *dma, dma_addr_t iova,
10871087
size_t len, phys_addr_t phys, long *unlocked,
10881088
struct list_head *unmapped_list,
10891089
int *unmapped_cnt,
@@ -1093,18 +1093,17 @@ static size_t unmap_unpin_fast(struct vfio_domain *domain,
10931093
struct vfio_regions *entry = kzalloc(sizeof(*entry), GFP_KERNEL);
10941094

10951095
if (entry) {
1096-
unmapped = iommu_unmap_fast(domain->domain, *iova, len,
1096+
unmapped = iommu_unmap_fast(domain->domain, iova, len,
10971097
iotlb_gather);
10981098

10991099
if (!unmapped) {
11001100
kfree(entry);
11011101
} else {
1102-
entry->iova = *iova;
1102+
entry->iova = iova;
11031103
entry->phys = phys;
11041104
entry->len = unmapped;
11051105
list_add_tail(&entry->list, unmapped_list);
11061106

1107-
*iova += unmapped;
11081107
(*unmapped_cnt)++;
11091108
}
11101109
}
@@ -1123,18 +1122,17 @@ static size_t unmap_unpin_fast(struct vfio_domain *domain,
11231122
}
11241123

11251124
static size_t unmap_unpin_slow(struct vfio_domain *domain,
1126-
struct vfio_dma *dma, dma_addr_t *iova,
1125+
struct vfio_dma *dma, dma_addr_t iova,
11271126
size_t len, phys_addr_t phys,
11281127
long *unlocked)
11291128
{
1130-
size_t unmapped = iommu_unmap(domain->domain, *iova, len);
1129+
size_t unmapped = iommu_unmap(domain->domain, iova, len);
11311130

11321131
if (unmapped) {
1133-
*unlocked += vfio_unpin_pages_remote(dma, *iova,
1132+
*unlocked += vfio_unpin_pages_remote(dma, iova,
11341133
phys >> PAGE_SHIFT,
11351134
unmapped >> PAGE_SHIFT,
11361135
false);
1137-
*iova += unmapped;
11381136
cond_resched();
11391137
}
11401138
return unmapped;
@@ -1197,16 +1195,18 @@ static long vfio_unmap_unpin(struct vfio_iommu *iommu, struct vfio_dma *dma,
11971195
* First, try to use fast unmap/unpin. In case of failure,
11981196
* switch to slow unmap/unpin path.
11991197
*/
1200-
unmapped = unmap_unpin_fast(domain, dma, &iova, len, phys,
1198+
unmapped = unmap_unpin_fast(domain, dma, iova, len, phys,
12011199
&unlocked, &unmapped_region_list,
12021200
&unmapped_region_cnt,
12031201
&iotlb_gather);
12041202
if (!unmapped) {
1205-
unmapped = unmap_unpin_slow(domain, dma, &iova, len,
1203+
unmapped = unmap_unpin_slow(domain, dma, iova, len,
12061204
phys, &unlocked);
12071205
if (WARN_ON(!unmapped))
12081206
break;
12091207
}
1208+
1209+
iova += unmapped;
12101210
}
12111211

12121212
dma->iommu_mapped = false;

0 commit comments

Comments
 (0)