Message ID | 20190430105214.24628-2-hch@lst.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [01/25] arm64/iommu: handle non-remapped addresses in ->mmap and ->get_sgtable | expand |
On Tue, Apr 30, 2019 at 06:51:50AM -0400, Christoph Hellwig wrote: > DMA allocations that can't sleep may return non-remapped addresses, but > we do not properly handle them in the mmap and get_sgtable methods. > Resolve non-vmalloc addresses using virt_to_page to handle this corner > case. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > Reviewed-by: Robin Murphy <robin.murphy@arm.com> Acked-by: Catalin Marinas <catalin.marinas@arm.com>
On Fri, May 03, 2019 at 12:33:53PM +0100, Catalin Marinas wrote: > On Tue, Apr 30, 2019 at 06:51:50AM -0400, Christoph Hellwig wrote: > > DMA allocations that can't sleep may return non-remapped addresses, but > > we do not properly handle them in the mmap and get_sgtable methods. > > Resolve non-vmalloc addresses using virt_to_page to handle this corner > > case. > > > > Signed-off-by: Christoph Hellwig <hch@lst.de> > > Reviewed-by: Robin Murphy <robin.murphy@arm.com> > > Acked-by: Catalin Marinas <catalin.marinas@arm.com> Given that this is a bug fix mostly separate from the rest of the series - do you want to pick it up for 5.2 and maybe add a Cc for stable?
On Tue, May 07, 2019 at 08:37:20AM +0200, Christoph Hellwig wrote: > On Fri, May 03, 2019 at 12:33:53PM +0100, Catalin Marinas wrote: > > On Tue, Apr 30, 2019 at 06:51:50AM -0400, Christoph Hellwig wrote: > > > DMA allocations that can't sleep may return non-remapped addresses, but > > > we do not properly handle them in the mmap and get_sgtable methods. > > > Resolve non-vmalloc addresses using virt_to_page to handle this corner > > > case. > > > > > > Signed-off-by: Christoph Hellwig <hch@lst.de> > > > Reviewed-by: Robin Murphy <robin.murphy@arm.com> > > > > Acked-by: Catalin Marinas <catalin.marinas@arm.com> > > Given that this is a bug fix mostly separate from the rest of the > series - do you want to pick it up for 5.2 and maybe add a Cc for > stable? Sure thing; I'll probably send it after -rc1 unless we get some other fixes in during the merge window. Will
diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c index 78c0a72f822c..674860e3e478 100644 --- a/arch/arm64/mm/dma-mapping.c +++ b/arch/arm64/mm/dma-mapping.c @@ -249,6 +249,11 @@ static int __iommu_mmap_attrs(struct device *dev, struct vm_area_struct *vma, if (dma_mmap_from_dev_coherent(dev, vma, cpu_addr, size, &ret)) return ret; + if (!is_vmalloc_addr(cpu_addr)) { + unsigned long pfn = page_to_pfn(virt_to_page(cpu_addr)); + return __swiotlb_mmap_pfn(vma, pfn, size); + } + if (attrs & DMA_ATTR_FORCE_CONTIGUOUS) { /* * DMA_ATTR_FORCE_CONTIGUOUS allocations are always remapped, @@ -272,6 +277,11 @@ static int __iommu_get_sgtable(struct device *dev, struct sg_table *sgt, unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT; struct vm_struct *area = find_vm_area(cpu_addr); + if (!is_vmalloc_addr(cpu_addr)) { + struct page *page = virt_to_page(cpu_addr); + return __swiotlb_get_sgtable_page(sgt, page, size); + } + if (attrs & DMA_ATTR_FORCE_CONTIGUOUS) { /* * DMA_ATTR_FORCE_CONTIGUOUS allocations are always remapped,