Re: [PATCH] dma-buf: heaps: Set VM_PFNMAP in mmap for system and cma heaps
From: Daniel Vetter
Date: Fri Feb 26 2021 - 02:38:26 EST
On Fri, Feb 26, 2021 at 5:09 AM John Stultz <john.stultz@xxxxxxxxxx> wrote:
>
>
Per discussion and patches here:
>
https://lore.kernel.org/dri-devel/20210223105951.912577-1-daniel.vetter@xxxxxxxx/
>
>
Daniel is planning on making VM_PFNMAP required on dmabufs.
>
>
Thus to avoid the warn_on noise, set the VM_PFNMAP in the
>
system and cma heap's mmap handler.
>
>
Cc: Daniel Vetter <daniel@xxxxxxxx>
>
Cc: Jason Gunthorpe <jgg@xxxxxxxx>
>
Cc: Christian Koenig <christian.koenig@xxxxxxx>
>
Cc: Sumit Semwal <sumit.semwal@xxxxxxxxxx>
>
Cc: Liam Mark <lmark@xxxxxxxxxxxxxx>
>
Cc: Chris Goldsworthy <cgoldswo@xxxxxxxxxxxxxx>
>
Cc: Laura Abbott <labbott@xxxxxxxxxx>
>
Cc: Brian Starkey <Brian.Starkey@xxxxxxx>
>
Cc: Hridya Valsaraju <hridya@xxxxxxxxxx>
>
Cc: Suren Baghdasaryan <surenb@xxxxxxxxxx>
>
Cc: Sandeep Patil <sspatil@xxxxxxxxxx>
>
Cc: Daniel Mentz <danielmentz@xxxxxxxxxx>
>
Cc: Ørjan Eide <orjan.eide@xxxxxxx>
>
Cc: Robin Murphy <robin.murphy@xxxxxxx>
>
Cc: Ezequiel Garcia <ezequiel@xxxxxxxxxxxxx>
>
Cc: Simon Ser <contact@xxxxxxxxxxx>
>
Cc: James Jones <jajones@xxxxxxxxxx>
>
Cc: linux-media@xxxxxxxxxxxxxxx
>
Cc: dri-devel@xxxxxxxxxxxxxxxxxxxxx
>
Signed-off-by: John Stultz <john.stultz@xxxxxxxxxx>
System heap uses remap_pfn_range so looks fine, but cma heap inserts
pages, and that's not fine for VM_PFNMAP. You need to use
vm_insert_pfn or remap_pfn_range or one of the related pfn mapping
functions for that too. I think this should splat when you run it.
Also note that remap_pfn_range updates the vma flags already correctly
for you, so you probably don't want to do that.
Also given that both deal with struct page there's a ton of divergence
between these two that doesn't make much sense. Maybe could even share
the code fully, aside from how you allocate the struct pages.
-Daniel
>
---
>
drivers/dma-buf/heaps/cma_heap.c | 1 +
>
drivers/dma-buf/heaps/system_heap.c | 4 +++-
>
2 files changed, 4 insertions(+), 1 deletion(-)
>
>
diff --git a/drivers/dma-buf/heaps/cma_heap.c b/drivers/dma-buf/heaps/cma_heap.c
>
index 364fc2f3e499..34bc3987f942 100644
>
--- a/drivers/dma-buf/heaps/cma_heap.c
>
+++ b/drivers/dma-buf/heaps/cma_heap.c
>
@@ -185,6 +185,7 @@ static int cma_heap_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma)
>
>
vma->vm_ops = &dma_heap_vm_ops;
>
vma->vm_private_data = buffer;
>
+ vma->vm_flags |= VM_PFNMAP;
>
>
return 0;
>
}
>
diff --git a/drivers/dma-buf/heaps/system_heap.c b/drivers/dma-buf/heaps/system_heap.c
>
index 3548b20cb98c..8995e3cbfcaf 100644
>
--- a/drivers/dma-buf/heaps/system_heap.c
>
+++ b/drivers/dma-buf/heaps/system_heap.c
>
@@ -228,8 +228,10 @@ static int system_heap_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma)
>
return ret;
>
addr += PAGE_SIZE;
>
if (addr >= vma->vm_end)
>
- return 0;
>
+ break;
>
}
>
+
>
+ vma->vm_flags |= VM_PFNMAP;
>
return 0;
>
}
>
>
--
>
2.25.1
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch