lkml.org 
[lkml]   [2019]   [May]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH 20/24] iommu/dma: Refactor iommu_dma_mmap
    From
    Date
    On 20/05/2019 08:29, Christoph Hellwig wrote:
    > Inline __iommu_dma_mmap_pfn into the main function, and use the
    > fact that __iommu_dma_get_pages return NULL for remapped contigous
    > allocations to simplify the code flow a bit.

    This would be a good point to get rid of __iommu_dma_mmap() now too.

    Robin.

    > Signed-off-by: Christoph Hellwig <hch@lst.de>
    > Reviewed-by: Robin Murphy <robin.murphy@arm.com>
    > ---
    > drivers/iommu/dma-iommu.c | 46 ++++++++++-----------------------------
    > 1 file changed, 11 insertions(+), 35 deletions(-)
    >
    > diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c
    > index fa95794868a4..84150ca7b572 100644
    > --- a/drivers/iommu/dma-iommu.c
    > +++ b/drivers/iommu/dma-iommu.c
    > @@ -1042,31 +1042,12 @@ static void *iommu_dma_alloc(struct device *dev, size_t size,
    > return cpu_addr;
    > }
    >
    > -static int __iommu_dma_mmap_pfn(struct vm_area_struct *vma,
    > - unsigned long pfn, size_t size)
    > -{
    > - int ret = -ENXIO;
    > - unsigned long nr_vma_pages = vma_pages(vma);
    > - unsigned long nr_pages = PAGE_ALIGN(size) >> PAGE_SHIFT;
    > - unsigned long off = vma->vm_pgoff;
    > -
    > - if (off < nr_pages && nr_vma_pages <= (nr_pages - off)) {
    > - ret = remap_pfn_range(vma, vma->vm_start,
    > - pfn + off,
    > - vma->vm_end - vma->vm_start,
    > - vma->vm_page_prot);
    > - }
    > -
    > - return ret;
    > -}
    > -
    > static int iommu_dma_mmap(struct device *dev, struct vm_area_struct *vma,
    > void *cpu_addr, dma_addr_t dma_addr, size_t size,
    > unsigned long attrs)
    > {
    > unsigned long nr_pages = PAGE_ALIGN(size) >> PAGE_SHIFT;
    > - unsigned long off = vma->vm_pgoff;
    > - struct page **pages;
    > + unsigned long pfn, off = vma->vm_pgoff;
    > int ret;
    >
    > vma->vm_page_prot = arch_dma_mmap_pgprot(dev, vma->vm_page_prot, attrs);
    > @@ -1077,24 +1058,19 @@ static int iommu_dma_mmap(struct device *dev, struct vm_area_struct *vma,
    > if (off >= nr_pages || vma_pages(vma) > nr_pages - off)
    > return -ENXIO;
    >
    > - if (!is_vmalloc_addr(cpu_addr)) {
    > - unsigned long pfn = page_to_pfn(virt_to_page(cpu_addr));
    > - return __iommu_dma_mmap_pfn(vma, pfn, size);
    > - }
    > + if (is_vmalloc_addr(cpu_addr)) {
    > + struct page **pages = __iommu_dma_get_pages(cpu_addr);
    >
    > - if (attrs & DMA_ATTR_FORCE_CONTIGUOUS) {
    > - /*
    > - * DMA_ATTR_FORCE_CONTIGUOUS allocations are always remapped,
    > - * hence in the vmalloc space.
    > - */
    > - unsigned long pfn = vmalloc_to_pfn(cpu_addr);
    > - return __iommu_dma_mmap_pfn(vma, pfn, size);
    > + if (pages)
    > + return __iommu_dma_mmap(pages, size, vma);
    > + pfn = vmalloc_to_pfn(cpu_addr);
    > + } else {
    > + pfn = page_to_pfn(virt_to_page(cpu_addr));
    > }
    >
    > - pages = __iommu_dma_get_pages(cpu_addr);
    > - if (!pages)
    > - return -ENXIO;
    > - return __iommu_dma_mmap(pages, size, vma);
    > + return remap_pfn_range(vma, vma->vm_start, pfn + off,
    > + vma->vm_end - vma->vm_start,
    > + vma->vm_page_prot);
    > }
    >
    > static int iommu_dma_get_sgtable(struct device *dev, struct sg_table *sgt,
    >

    \
     
     \ /
      Last update: 2019-05-22 19:13    [W:2.092 / U:0.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site