Track page access/dirty status in gem-shmem for better integration with the overall memory management. Gem-shmem has long had two flag bits in struct drm_gem_shmem_object, named pages_mark_accessed_on_put and pages_mark_dirty_on_put, but never used them much; except for some odd cases in drivers. Therefore pages in gem-shmem where never marked correctly. (Other DRM memory managers do some course-grain tracking at least).
Patches 1 and 2 switch from PFN-based mapping to page mapping. The pages are already available; only the mmap handling needs to be adapted. Patch 3 adds tracking access and dirty status in mmap. Patch 4 adds tracking access and dirty status in vmap. Becasue there's no fault handling here, we refer to the existing status bits in struct drm_gem_shmem_object. Each page's status will be updated by the page release in drm_gem_put_pages(). The imagination driver requires a small fix to make it work correctly. Tested with CONFIG_VM=y by running animations on DRM's bochs driver for several hours. This uses gem-shmem's mmap and vmap extensively. v2: - fix possible OOB access into page array (Matthew) - simplify fault-handler error handling (Boris) - simplify internal interfaces (Matthew) Thomas Zimmermann (4): drm/gem-shmem: Return vm_fault_t from drm_gem_shmem_try_map_pmd() drm/gem-shmem: Map pages in mmap fault handler drm/gem-shmem: Track folio accessed/dirty status in mmap drm/gem-shmem: Track folio accessed/dirty status in vmap drivers/gpu/drm/drm_gem_shmem_helper.c | 77 ++++++++++++++++++-------- drivers/gpu/drm/imagination/pvr_gem.c | 6 +- 2 files changed, 57 insertions(+), 26 deletions(-) base-commit: 6e53f6296065672f8a0c7f98b4b6c409dac382b4 -- 2.52.0
