drm/panfrost: Implement generic DRM object RSS reporting function
authorAdrián Larumbe <adrian.larumbe@collabora.com>
Fri, 29 Sep 2023 18:14:31 +0000 (19:14 +0100)
committerBoris Brezillon <boris.brezillon@collabora.com>
Wed, 4 Oct 2023 11:04:15 +0000 (13:04 +0200)
BO's RSS is updated every time new pages are allocated on demand and mapped
for the object at GPU page fault's IRQ handler, but only for heap buffers.
The reason this is unnecessary for non-heap buffers is that they are mapped
onto the GPU's VA space and backed by physical memory in their entirety at
BO creation time.

This calculation is unnecessary for imported PRIME objects, since heap
buffers cannot be exported by our driver, and the actual BO RSS size is the
one reported in its attached dmabuf structure.

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-6-adrian.larumbe@collabora.com
drivers/gpu/drm/panfrost/panfrost_gem.c
drivers/gpu/drm/panfrost/panfrost_gem.h
drivers/gpu/drm/panfrost/panfrost_mmu.c

index de238b71b321b4b7fe7d61cdd532aa6f2802da56..0cf64456e29a4f74cc21e8fa3e57772e4eb506ee 100644 (file)
@@ -209,6 +209,20 @@ static enum drm_gem_object_status panfrost_gem_status(struct drm_gem_object *obj
        return res;
 }
 
+static size_t panfrost_gem_rss(struct drm_gem_object *obj)
+{
+       struct panfrost_gem_object *bo = to_panfrost_bo(obj);
+
+       if (bo->is_heap) {
+               return bo->heap_rss_size;
+       } else if (bo->base.pages) {
+               WARN_ON(bo->heap_rss_size);
+               return bo->base.base.size;
+       }
+
+       return 0;
+}
+
 static const struct drm_gem_object_funcs panfrost_gem_funcs = {
        .free = panfrost_gem_free_object,
        .open = panfrost_gem_open,
@@ -221,6 +235,7 @@ static const struct drm_gem_object_funcs panfrost_gem_funcs = {
        .vunmap = drm_gem_shmem_object_vunmap,
        .mmap = drm_gem_shmem_object_mmap,
        .status = panfrost_gem_status,
+       .rss = panfrost_gem_rss,
        .vm_ops = &drm_gem_shmem_vm_ops,
 };
 
index ad2877eeeccdfc4dcce337b3e3600b9dc0ce3fcc..13c0a8149c3ad014b310da90ec758dad8ed825f5 100644 (file)
@@ -36,6 +36,11 @@ struct panfrost_gem_object {
         */
        atomic_t gpu_usecount;
 
+       /*
+        * Object chunk size currently mapped onto physical memory
+        */
+       size_t heap_rss_size;
+
        bool noexec             :1;
        bool is_heap            :1;
 };
index d54d4e7b21951b114a03506903dd694fc3c8606c..846dd697c4106b091439c245e09069b691b51705 100644 (file)
@@ -522,6 +522,7 @@ static int panfrost_mmu_map_fault_addr(struct panfrost_device *pfdev, int as,
                   IOMMU_WRITE | IOMMU_READ | IOMMU_NOEXEC, sgt);
 
        bomapping->active = true;
+       bo->heap_rss_size += SZ_2M;
 
        dev_dbg(pfdev->dev, "mapped page fault @ AS%d %llx", as, addr);