Re: [PATCH] dma-buf: heaps: Set VM_PFNMAP in mmap for system and cma heaps
From: Daniel Vetter <hidden>
Date: 2021-02-26 07:38:32
Also in:
dri-devel, lkml
On Fri, Feb 26, 2021 at 5:09 AM John Stultz [off-list ref] wrote:
Per discussion and patches here: https://lore.kernel.org/dri-devel/20210223105951.912577-1-daniel.vetter@ffwll.ch/ (local) 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 <redacted> Cc: Jason Gunthorpe <jgg@ziepe.ca> Cc: Christian Koenig <christian.koenig@amd.com> Cc: Sumit Semwal <sumit.semwal@linaro.org> Cc: Liam Mark <redacted> Cc: Chris Goldsworthy <redacted> Cc: Laura Abbott <labbott@kernel.org> Cc: Brian Starkey <Brian.Starkey@arm.com> Cc: Hridya Valsaraju <redacted> Cc: Suren Baghdasaryan <surenb@google.com> Cc: Sandeep Patil <redacted> Cc: Daniel Mentz <redacted> Cc: Ørjan Eide <redacted> Cc: Robin Murphy <robin.murphy@arm.com> Cc: Ezequiel Garcia <redacted> Cc: Simon Ser <redacted> Cc: James Jones <redacted> Cc: linux-media@vger.kernel.org Cc: dri-devel@lists.freedesktop.org Signed-off-by: John Stultz <redacted>
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
quoted hunk ↗ jump to hunk
--- 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