Hi

Am 20.05.26 um 15:11 schrieb Igor Torrente:
[...]

I'm not familiar with the drm_gem, code so I don't any more insightful information
to share.  But hopefully we can find a better fix for this.

Do you have huge pages enabled ?

Best regards
Thomas


BR,
Igor Torrente

---
  drivers/gpu/drm/drm_gem_shmem_helper.c | 20 ++++++++++++++++++++
  1 file changed, 20 insertions(+)

diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c
index c3a054899ba3..0c86ad40a049 100644
--- a/drivers/gpu/drm/drm_gem_shmem_helper.c
+++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
@@ -598,6 +598,9 @@ static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
      if (ret != VM_FAULT_NOPAGE)
          ret = vmf_insert_pfn(vma, vmf->address, pfn);
  +    if (likely(!(ret & VM_FAULT_ERROR)))
+        folio_mark_accessed(folio);
+
  out:
      dma_resv_unlock(obj->resv);
  @@ -638,10 +641,27 @@ static void drm_gem_shmem_vm_close(struct vm_area_struct *vma)
      drm_gem_vm_close(vma);
  }
  +static vm_fault_t drm_gem_shmem_pfn_mkwrite(struct vm_fault *vmf)
+{
+    struct vm_area_struct *vma = vmf->vma;
+    struct drm_gem_object *obj = vma->vm_private_data;
+    struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
+    pgoff_t page_offset = vmf->pgoff - vma->vm_pgoff; /* page offset within VMA */
+    struct page *page = shmem->pages[page_offset];
+    struct folio *folio = page_folio(page);
+
+    file_update_time(vma->vm_file);
+
+    folio_mark_dirty(folio);
+
+    return 0;
+}
+
  const struct vm_operations_struct drm_gem_shmem_vm_ops = {
      .fault = drm_gem_shmem_fault,
      .open = drm_gem_shmem_vm_open,
      .close = drm_gem_shmem_vm_close,
+    .pfn_mkwrite = drm_gem_shmem_pfn_mkwrite,
  };
  EXPORT_SYMBOL_GPL(drm_gem_shmem_vm_ops);

--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich, (HRB 36809, AG Nürnberg)


Reply via email to