drm/panfrost: Add fdinfo support for memory stats
authorAdrián Larumbe <adrian.larumbe@collabora.com>
Fri, 29 Sep 2023 18:14:29 +0000 (19:14 +0100)
committerBoris Brezillon <boris.brezillon@collabora.com>
Wed, 4 Oct 2023 11:04:15 +0000 (13:04 +0200)
A new DRM GEM object function is added so that drm_show_memory_stats can
provide more accurate memory usage numbers.

Ideally, in panfrost_gem_status, the BO's purgeable flag would be checked
after locking the driver's shrinker mutex, but drm_show_memory_stats takes
over the drm file's object handle database spinlock, so there's potential
for a race condition here.

Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230929181616.2769345-4-adrian.larumbe@collabora.com
drivers/gpu/drm/panfrost/panfrost_drv.c
drivers/gpu/drm/panfrost/panfrost_gem.c

index 97e5bc4a82c82de396e8e388dacec18b543e44a6..b834777b409b076d5273eccf1fba20952e9e3360 100644 (file)
@@ -568,6 +568,8 @@ static void panfrost_show_fdinfo(struct drm_printer *p, struct drm_file *file)
        struct panfrost_device *pfdev = dev->dev_private;
 
        panfrost_gpu_show_fdinfo(pfdev, file->driver_priv, p);
+
+       drm_show_memory_stats(p, file);
 }
 
 static const struct file_operations panfrost_drm_driver_fops = {
index 3c812fbd126fd0f6b951eff0f0873a32e104722f..de238b71b321b4b7fe7d61cdd532aa6f2802da56 100644 (file)
@@ -195,6 +195,20 @@ static int panfrost_gem_pin(struct drm_gem_object *obj)
        return drm_gem_shmem_pin(&bo->base);
 }
 
+static enum drm_gem_object_status panfrost_gem_status(struct drm_gem_object *obj)
+{
+       struct panfrost_gem_object *bo = to_panfrost_bo(obj);
+       enum drm_gem_object_status res = 0;
+
+       if (bo->base.pages)
+               res |= DRM_GEM_OBJECT_RESIDENT;
+
+       if (bo->base.madv == PANFROST_MADV_DONTNEED)
+               res |= DRM_GEM_OBJECT_PURGEABLE;
+
+       return res;
+}
+
 static const struct drm_gem_object_funcs panfrost_gem_funcs = {
        .free = panfrost_gem_free_object,
        .open = panfrost_gem_open,
@@ -206,6 +220,7 @@ static const struct drm_gem_object_funcs panfrost_gem_funcs = {
        .vmap = drm_gem_shmem_object_vmap,
        .vunmap = drm_gem_shmem_object_vunmap,
        .mmap = drm_gem_shmem_object_mmap,
+       .status = panfrost_gem_status,
        .vm_ops = &drm_gem_shmem_vm_ops,
 };