Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e56d565d authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'iommu-v4.15-rc3' of git://github.com/awilliam/linux-vfio

Pull IOMMU fix from Alex Williamson:
 "Fix VT-d handling of scatterlists where sg->offset exceeds PAGE_SIZE"

* tag 'iommu-v4.15-rc3' of git://github.com/awilliam/linux-vfio:
  iommu/vt-d: Fix scatterlist offset handling
parents f9efc944 29a90b70
Loading
Loading
Loading
Loading
+5 −3
Original line number Original line Diff line number Diff line
@@ -2250,10 +2250,12 @@ static int __domain_mapping(struct dmar_domain *domain, unsigned long iov_pfn,
		uint64_t tmp;
		uint64_t tmp;


		if (!sg_res) {
		if (!sg_res) {
			unsigned int pgoff = sg->offset & ~PAGE_MASK;

			sg_res = aligned_nrpages(sg->offset, sg->length);
			sg_res = aligned_nrpages(sg->offset, sg->length);
			sg->dma_address = ((dma_addr_t)iov_pfn << VTD_PAGE_SHIFT) + sg->offset;
			sg->dma_address = ((dma_addr_t)iov_pfn << VTD_PAGE_SHIFT) + pgoff;
			sg->dma_length = sg->length;
			sg->dma_length = sg->length;
			pteval = page_to_phys(sg_page(sg)) | prot;
			pteval = (sg_phys(sg) - pgoff) | prot;
			phys_pfn = pteval >> VTD_PAGE_SHIFT;
			phys_pfn = pteval >> VTD_PAGE_SHIFT;
		}
		}


@@ -3787,7 +3789,7 @@ static int intel_nontranslate_map_sg(struct device *hddev,


	for_each_sg(sglist, sg, nelems, i) {
	for_each_sg(sglist, sg, nelems, i) {
		BUG_ON(!sg_page(sg));
		BUG_ON(!sg_page(sg));
		sg->dma_address = page_to_phys(sg_page(sg)) + sg->offset;
		sg->dma_address = sg_phys(sg);
		sg->dma_length = sg->length;
		sg->dma_length = sg->length;
	}
	}
	return nelems;
	return nelems;