Thread (4 messages) 4 messages, 3 authors, 2021-03-02

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help