Hi TJ, On Thu, 18 Jan 2024 at 15:32, Christian König <christian.koe...@amd.com> wrote:
> 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 <tjmerc...@google.com> <tjmerc...@google.com> > > > Acked-by: Christian König <christian.koe...@amd.com> > <christian.koe...@amd.com> > Thanks for the patch; pushed to drm-misc-fixes. Best, Sumit > > > --- > 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; > > > > -- Thanks and regards, Sumit Semwal (he / him) Tech Lead - LCG, Vertical Technologies Linaro.org │ Open source software for ARM SoCs