On Thu, 24 Aug 2023 02:34:47 +0100 Adrián Larumbe <adrian.larumbe@xxxxxxxxxxxxx> wrote: > Some BO's might be mapped onto physical memory chunkwise and on demand, > like Panfrost's tiler heap. In this case, even though the > drm_gem_shmem_object page array might already be allocated, only a very > small fraction of the BO is currently backed by system memory, but > drm_show_memory_stats will then proceed to add its entire virtual size to > the file's total resident size regardless. > > This led to very unrealistic RSS sizes being reckoned for Panfrost, where > said tiler heap buffer is initially allocated with a virtual size of 128 > MiB, but only a small part of it will eventually be backed by system memory > after successive GPU page faults. > > Provide a new DRM object generic function that would allow drivers to > return a more accurate RSS size for their BOs. > > Signed-off-by: Adrián Larumbe <adrian.larumbe@xxxxxxxxxxxxx> Reviewed-by: Boris Brezillon <boris.brezillon@xxxxxxxxxxxxx> > --- > drivers/gpu/drm/drm_file.c | 5 ++++- > include/drm/drm_gem.h | 9 +++++++++ > 2 files changed, 13 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c > index 883d83bc0e3d..762965e3d503 100644 > --- a/drivers/gpu/drm/drm_file.c > +++ b/drivers/gpu/drm/drm_file.c > @@ -944,7 +944,10 @@ void drm_show_memory_stats(struct drm_printer *p, struct drm_file *file) > } > > if (s & DRM_GEM_OBJECT_RESIDENT) { > - status.resident += obj->size; > + if (obj->funcs && obj->funcs->rss) > + status.resident += obj->funcs->rss(obj); > + else > + status.resident += obj->size; > } else { > /* If already purged or not yet backed by pages, don't > * count it as purgeable: > diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h > index c0b13c43b459..78ed9fab6044 100644 > --- a/include/drm/drm_gem.h > +++ b/include/drm/drm_gem.h > @@ -208,6 +208,15 @@ struct drm_gem_object_funcs { > */ > enum drm_gem_object_status (*status)(struct drm_gem_object *obj); > > + /** > + * @rss: > + * > + * Return resident size of the object in physical memory. > + * > + * Called by drm_show_memory_stats(). > + */ > + size_t (*rss)(struct drm_gem_object *obj); > + > /** > * @vm_ops: > *