Skip to content

Commit b48ca92

Browse files
Yu Zhangjoergroedel
authored andcommitted
iommupt: Always add IOVA range to iotlb_gather in gather_range_pages()
Add current (iova, len) to the iotlb gather, regardless of the setting of PT_FEAT_FLUSH_RANGE or PT_FEAT_FLUSH_RANGE_NO_GAPS. In gather_range_pages(), the current IOVA range is only added to iotlb_gather when PT_FEAT_FLUSH_RANGE is set. Yet a virtual IOMMU with NpCache uses only PT_FEAT_FLUSH_RANGE_NO_GAPS. In that case, iotlb_gather will stay empty (start=ULONG_MAX, end=0) after initialization, and the current (iova, len) will not be added to the iotlb_gather, causing subsequent iommu_iotlb_sync() to perform IOTLB invalidation with wrong parameters (e.g., amd_iommu_iotlb_sync() computes size from gather->end - gather->start + 1, leading to an invalid range). The disjoint check and sync for PT_FEAT_FLUSH_RANGE_NO_GAPS remain unchanged: when the new range is disjoint from the existing gather, we still sync first and then add the new range, so semantics for NO_GAPS are preserved. Fixes: 7c53f42 ("iommupt: Add unmap_pages op") Cc: stable@vger.kernel.org Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Signed-off-by: Yu Zhang <zhangyu1@linux.microsoft.com> Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
1 parent 12248a3 commit b48ca92

1 file changed

Lines changed: 1 addition & 2 deletions

File tree

drivers/iommu/generic_pt/iommu_pt.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,9 @@ static void gather_range_pages(struct iommu_iotlb_gather *iotlb_gather,
5858
* Note that the sync frees the gather's free list, so we must
5959
* not have any pages on that list that are covered by iova/len
6060
*/
61-
} else if (pt_feature(common, PT_FEAT_FLUSH_RANGE)) {
62-
iommu_iotlb_gather_add_range(iotlb_gather, iova, len);
6361
}
6462

63+
iommu_iotlb_gather_add_range(iotlb_gather, iova, len);
6564
iommu_pages_list_splice(free_list, &iotlb_gather->freelist);
6665
}
6766

0 commit comments

Comments
 (0)