[PATCH] dma-buf: heaps: Don't track CMA dma-buf pages under RssFile
Christian König
christian.koenig at amd.com
Thu Jan 18 10:02:22 UTC 2024
Am 17.01.24 um 19:11 schrieb T.J. Mercier:
> DMA buffers allocated from the CMA dma-buf heap get counted under
> RssFile for processes that map them and trigger page faults. In
> addition to the incorrect accounting reported to userspace, reclaim
> behavior was influenced by the MM_FILEPAGES counter until linux 6.8, but
> this memory is not reclaimable. [1] Change the CMA dma-buf heap to set
> VM_PFNMAP on the VMA so MM does not poke at the memory managed by this
> dma-buf heap, and use vmf_insert_pfn to correct the RSS accounting.
>
> The system dma-buf heap does not suffer from this issue since
> remap_pfn_range is used during the mmap of the buffer, which also sets
> VM_PFNMAP on the VMA.
Mhm, not an issue with this patch but Daniel wanted to add a check for
VM_PFNMAP to dma_buf_mmap() which would have noted this earlier.
I don't fully remember the discussion but for some reason that was never
committed. We should probably try that again.
> [1]https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/mm/vmscan.c?id=fb46e22a9e3863e08aef8815df9f17d0f4b9aede
>
> Fixes: b61614ec318a ("dma-buf: heaps: Add CMA heap to dmabuf heaps")
> Signed-off-by: T.J. Mercier<tjmercier at google.com>
Acked-by: Christian König <christian.koenig at amd.com>
> ---
> drivers/dma-buf/heaps/cma_heap.c | 7 +++----
> 1 file changed, 3 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/dma-buf/heaps/cma_heap.c b/drivers/dma-buf/heaps/cma_heap.c
> index ee899f8e6721..4a63567e93ba 100644
> --- a/drivers/dma-buf/heaps/cma_heap.c
> +++ b/drivers/dma-buf/heaps/cma_heap.c
> @@ -168,10 +168,7 @@ static vm_fault_t cma_heap_vm_fault(struct vm_fault *vmf)
> if (vmf->pgoff > buffer->pagecount)
> return VM_FAULT_SIGBUS;
>
> - vmf->page = buffer->pages[vmf->pgoff];
> - get_page(vmf->page);
> -
> - return 0;
> + return vmf_insert_pfn(vma, vmf->address, page_to_pfn(buffer->pages[vmf->pgoff]));
> }
>
> static const struct vm_operations_struct dma_heap_vm_ops = {
> @@ -185,6 +182,8 @@ static int cma_heap_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma)
> if ((vma->vm_flags & (VM_SHARED | VM_MAYSHARE)) == 0)
> return -EINVAL;
>
> + vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP);
> +
> vma->vm_ops = &dma_heap_vm_ops;
> vma->vm_private_data = buffer;
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20240118/08150605/attachment.htm>
More information about the dri-devel
mailing list