drm/amdgpu: expose more memory stats in fdinfo
authorMarek Olšák <marek.olsak@amd.com>
Mon, 30 Jan 2023 06:52:40 +0000 (01:52 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 13 Mar 2023 21:27:48 +0000 (17:27 -0400)
This will be used for performance investigations.

Signed-off-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.c
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h

index 99a7855ab1bc146df177fcb5d16b10959eb92641..c57252f004e8e261cd0521fdf003bc5f9c333c9d 100644 (file)
@@ -60,12 +60,13 @@ void amdgpu_show_fdinfo(struct seq_file *m, struct file *f)
        struct amdgpu_fpriv *fpriv = file->driver_priv;
        struct amdgpu_vm *vm = &fpriv->vm;
 
-       uint64_t vram_mem = 0, gtt_mem = 0, cpu_mem = 0;
+       struct amdgpu_mem_stats stats;
        ktime_t usage[AMDGPU_HW_IP_NUM];
        uint32_t bus, dev, fn, domain;
        unsigned int hw_ip;
        int ret;
 
+       memset(&stats, 0, sizeof(stats));
        bus = adev->pdev->bus->number;
        domain = pci_domain_nr(adev->pdev->bus);
        dev = PCI_SLOT(adev->pdev->devfn);
@@ -75,7 +76,7 @@ void amdgpu_show_fdinfo(struct seq_file *m, struct file *f)
        if (ret)
                return;
 
-       amdgpu_vm_get_memory(vm, &vram_mem, &gtt_mem, &cpu_mem);
+       amdgpu_vm_get_memory(vm, &stats);
        amdgpu_bo_unreserve(vm->root.bo);
 
        amdgpu_ctx_mgr_usage(&fpriv->ctx_mgr, usage);
@@ -90,9 +91,22 @@ void amdgpu_show_fdinfo(struct seq_file *m, struct file *f)
        seq_printf(m, "drm-driver:\t%s\n", file->minor->dev->driver->name);
        seq_printf(m, "drm-pdev:\t%04x:%02x:%02x.%d\n", domain, bus, dev, fn);
        seq_printf(m, "drm-client-id:\t%Lu\n", vm->immediate.fence_context);
-       seq_printf(m, "drm-memory-vram:\t%llu KiB\n", vram_mem/1024UL);
-       seq_printf(m, "drm-memory-gtt: \t%llu KiB\n", gtt_mem/1024UL);
-       seq_printf(m, "drm-memory-cpu: \t%llu KiB\n", cpu_mem/1024UL);
+       seq_printf(m, "drm-memory-vram:\t%llu KiB\n", stats.vram/1024UL);
+       seq_printf(m, "drm-memory-gtt: \t%llu KiB\n", stats.gtt/1024UL);
+       seq_printf(m, "drm-memory-cpu: \t%llu KiB\n", stats.cpu/1024UL);
+       seq_printf(m, "amd-memory-visible-vram:\t%llu KiB\n",
+                  stats.visible_vram/1024UL);
+       seq_printf(m, "amd-evicted-vram:\t%llu KiB\n",
+                  stats.evicted_vram/1024UL);
+       seq_printf(m, "amd-evicted-visible-vram:\t%llu KiB\n",
+                  stats.evicted_visible_vram/1024UL);
+       seq_printf(m, "amd-requested-vram:\t%llu KiB\n",
+                  stats.requested_vram/1024UL);
+       seq_printf(m, "amd-requested-visible-vram:\t%llu KiB\n",
+                  stats.requested_visible_vram/1024UL);
+       seq_printf(m, "amd-requested-gtt:\t%llu KiB\n",
+                  stats.requested_gtt/1024UL);
+
        for (hw_ip = 0; hw_ip < AMDGPU_HW_IP_NUM; ++hw_ip) {
                if (!usage[hw_ip])
                        continue;
index 6c7d672412b21454278ecd151f61c1ef5c59987e..7c9b788ae0a908ac38e9bdf418d287a49cab4b8a 100644 (file)
@@ -1265,24 +1265,41 @@ void amdgpu_bo_move_notify(struct ttm_buffer_object *bo,
        trace_amdgpu_bo_move(abo, new_mem->mem_type, old_mem->mem_type);
 }
 
-void amdgpu_bo_get_memory(struct amdgpu_bo *bo, uint64_t *vram_mem,
-                               uint64_t *gtt_mem, uint64_t *cpu_mem)
+void amdgpu_bo_get_memory(struct amdgpu_bo *bo,
+                         struct amdgpu_mem_stats *stats)
 {
        unsigned int domain;
+       uint64_t size = amdgpu_bo_size(bo);
 
        domain = amdgpu_mem_type_to_domain(bo->tbo.resource->mem_type);
        switch (domain) {
        case AMDGPU_GEM_DOMAIN_VRAM:
-               *vram_mem += amdgpu_bo_size(bo);
+               stats->vram += size;
+               if (amdgpu_bo_in_cpu_visible_vram(bo))
+                       stats->visible_vram += size;
                break;
        case AMDGPU_GEM_DOMAIN_GTT:
-               *gtt_mem += amdgpu_bo_size(bo);
+               stats->gtt += size;
                break;
        case AMDGPU_GEM_DOMAIN_CPU:
        default:
-               *cpu_mem += amdgpu_bo_size(bo);
+               stats->cpu += size;
                break;
        }
+
+       if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) {
+               stats->requested_vram += size;
+               if (bo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)
+                       stats->requested_visible_vram += size;
+
+               if (domain != AMDGPU_GEM_DOMAIN_VRAM) {
+                       stats->evicted_vram += size;
+                       if (bo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)
+                               stats->evicted_visible_vram += size;
+               }
+       } else if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_GTT) {
+               stats->requested_gtt += size;
+       }
 }
 
 /**
index 93207badf83f39ba8ae96779110a2f45b91dc5bc..8fdfa739a4f2e8e555e4d78cac0ac987368233c3 100644 (file)
@@ -126,6 +126,27 @@ struct amdgpu_bo_vm {
        struct amdgpu_vm_bo_base        entries[];
 };
 
+struct amdgpu_mem_stats {
+       /* current VRAM usage, includes visible VRAM */
+       uint64_t vram;
+       /* current visible VRAM usage */
+       uint64_t visible_vram;
+       /* current GTT usage */
+       uint64_t gtt;
+       /* current system memory usage */
+       uint64_t cpu;
+       /* sum of evicted buffers, includes visible VRAM */
+       uint64_t evicted_vram;
+       /* sum of evicted buffers due to CPU access */
+       uint64_t evicted_visible_vram;
+       /* how much userspace asked for, includes vis.VRAM */
+       uint64_t requested_vram;
+       /* how much userspace asked for */
+       uint64_t requested_visible_vram;
+       /* how much userspace asked for */
+       uint64_t requested_gtt;
+};
+
 static inline struct amdgpu_bo *ttm_to_amdgpu_bo(struct ttm_buffer_object *tbo)
 {
        return container_of(tbo, struct amdgpu_bo, tbo);
@@ -325,8 +346,8 @@ int amdgpu_bo_sync_wait_resv(struct amdgpu_device *adev, struct dma_resv *resv,
 int amdgpu_bo_sync_wait(struct amdgpu_bo *bo, void *owner, bool intr);
 u64 amdgpu_bo_gpu_offset(struct amdgpu_bo *bo);
 u64 amdgpu_bo_gpu_offset_no_check(struct amdgpu_bo *bo);
-void amdgpu_bo_get_memory(struct amdgpu_bo *bo, uint64_t *vram_mem,
-                               uint64_t *gtt_mem, uint64_t *cpu_mem);
+void amdgpu_bo_get_memory(struct amdgpu_bo *bo,
+                         struct amdgpu_mem_stats *stats);
 void amdgpu_bo_add_to_shadow_list(struct amdgpu_bo_vm *vmbo);
 int amdgpu_bo_restore_shadow(struct amdgpu_bo *shadow,
                             struct dma_fence **fence);
index 8f00adac5152fefa72cbc194eaeca2f3ea9b6e04..286e326bb4bd93c7ed1e47ee20d5cff688079c9b 100644 (file)
@@ -920,8 +920,8 @@ error_unlock:
        return r;
 }
 
-void amdgpu_vm_get_memory(struct amdgpu_vm *vm, uint64_t *vram_mem,
-                               uint64_t *gtt_mem, uint64_t *cpu_mem)
+void amdgpu_vm_get_memory(struct amdgpu_vm *vm,
+                         struct amdgpu_mem_stats *stats)
 {
        struct amdgpu_bo_va *bo_va, *tmp;
 
@@ -929,41 +929,36 @@ void amdgpu_vm_get_memory(struct amdgpu_vm *vm, uint64_t *vram_mem,
        list_for_each_entry_safe(bo_va, tmp, &vm->idle, base.vm_status) {
                if (!bo_va->base.bo)
                        continue;
-               amdgpu_bo_get_memory(bo_va->base.bo, vram_mem,
-                               gtt_mem, cpu_mem);
+               amdgpu_bo_get_memory(bo_va->base.bo, stats);
        }
        list_for_each_entry_safe(bo_va, tmp, &vm->evicted, base.vm_status) {
                if (!bo_va->base.bo)
                        continue;
-               amdgpu_bo_get_memory(bo_va->base.bo, vram_mem,
-                               gtt_mem, cpu_mem);
+               amdgpu_bo_get_memory(bo_va->base.bo, stats);
        }
        list_for_each_entry_safe(bo_va, tmp, &vm->relocated, base.vm_status) {
                if (!bo_va->base.bo)
                        continue;
-               amdgpu_bo_get_memory(bo_va->base.bo, vram_mem,
-                               gtt_mem, cpu_mem);
+               amdgpu_bo_get_memory(bo_va->base.bo, stats);
        }
        list_for_each_entry_safe(bo_va, tmp, &vm->moved, base.vm_status) {
                if (!bo_va->base.bo)
                        continue;
-               amdgpu_bo_get_memory(bo_va->base.bo, vram_mem,
-                               gtt_mem, cpu_mem);
+               amdgpu_bo_get_memory(bo_va->base.bo, stats);
        }
        list_for_each_entry_safe(bo_va, tmp, &vm->invalidated, base.vm_status) {
                if (!bo_va->base.bo)
                        continue;
-               amdgpu_bo_get_memory(bo_va->base.bo, vram_mem,
-                               gtt_mem, cpu_mem);
+               amdgpu_bo_get_memory(bo_va->base.bo, stats);
        }
        list_for_each_entry_safe(bo_va, tmp, &vm->done, base.vm_status) {
                if (!bo_va->base.bo)
                        continue;
-               amdgpu_bo_get_memory(bo_va->base.bo, vram_mem,
-                               gtt_mem, cpu_mem);
+               amdgpu_bo_get_memory(bo_va->base.bo, stats);
        }
        spin_unlock(&vm->status_lock);
 }
+
 /**
  * amdgpu_vm_bo_update - update all BO mappings in the vm page table
  *
index 856a64bc7a89fc53839fc2dd65ff88ec23a875cf..6f085f0b4ef3f818b449d2a09d2f5c5f0fff9786 100644 (file)
@@ -40,6 +40,7 @@ struct amdgpu_bo_va;
 struct amdgpu_job;
 struct amdgpu_bo_list_entry;
 struct amdgpu_bo_vm;
+struct amdgpu_mem_stats;
 
 /*
  * GPUVM handling
@@ -457,8 +458,8 @@ void amdgpu_vm_set_task_info(struct amdgpu_vm *vm);
 
 void amdgpu_vm_move_to_lru_tail(struct amdgpu_device *adev,
                                struct amdgpu_vm *vm);
-void amdgpu_vm_get_memory(struct amdgpu_vm *vm, uint64_t *vram_mem,
-                               uint64_t *gtt_mem, uint64_t *cpu_mem);
+void amdgpu_vm_get_memory(struct amdgpu_vm *vm,
+                         struct amdgpu_mem_stats *stats);
 
 int amdgpu_vm_pt_clear(struct amdgpu_device *adev, struct amdgpu_vm *vm,
                       struct amdgpu_bo_vm *vmbo, bool immediate);