Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/amdgpu: expose more memory stats in fdinfo

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>

authored by

Marek Olšák and committed by
Alex Deucher
d6530c33 28f7e897

+76 -28
+19 -5
drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.c
··· 60 60 struct amdgpu_fpriv *fpriv = file->driver_priv; 61 61 struct amdgpu_vm *vm = &fpriv->vm; 62 62 63 - uint64_t vram_mem = 0, gtt_mem = 0, cpu_mem = 0; 63 + struct amdgpu_mem_stats stats; 64 64 ktime_t usage[AMDGPU_HW_IP_NUM]; 65 65 uint32_t bus, dev, fn, domain; 66 66 unsigned int hw_ip; 67 67 int ret; 68 68 69 + memset(&stats, 0, sizeof(stats)); 69 70 bus = adev->pdev->bus->number; 70 71 domain = pci_domain_nr(adev->pdev->bus); 71 72 dev = PCI_SLOT(adev->pdev->devfn); ··· 76 75 if (ret) 77 76 return; 78 77 79 - amdgpu_vm_get_memory(vm, &vram_mem, &gtt_mem, &cpu_mem); 78 + amdgpu_vm_get_memory(vm, &stats); 80 79 amdgpu_bo_unreserve(vm->root.bo); 81 80 82 81 amdgpu_ctx_mgr_usage(&fpriv->ctx_mgr, usage); ··· 91 90 seq_printf(m, "drm-driver:\t%s\n", file->minor->dev->driver->name); 92 91 seq_printf(m, "drm-pdev:\t%04x:%02x:%02x.%d\n", domain, bus, dev, fn); 93 92 seq_printf(m, "drm-client-id:\t%Lu\n", vm->immediate.fence_context); 94 - seq_printf(m, "drm-memory-vram:\t%llu KiB\n", vram_mem/1024UL); 95 - seq_printf(m, "drm-memory-gtt: \t%llu KiB\n", gtt_mem/1024UL); 96 - seq_printf(m, "drm-memory-cpu: \t%llu KiB\n", cpu_mem/1024UL); 93 + seq_printf(m, "drm-memory-vram:\t%llu KiB\n", stats.vram/1024UL); 94 + seq_printf(m, "drm-memory-gtt: \t%llu KiB\n", stats.gtt/1024UL); 95 + seq_printf(m, "drm-memory-cpu: \t%llu KiB\n", stats.cpu/1024UL); 96 + seq_printf(m, "amd-memory-visible-vram:\t%llu KiB\n", 97 + stats.visible_vram/1024UL); 98 + seq_printf(m, "amd-evicted-vram:\t%llu KiB\n", 99 + stats.evicted_vram/1024UL); 100 + seq_printf(m, "amd-evicted-visible-vram:\t%llu KiB\n", 101 + stats.evicted_visible_vram/1024UL); 102 + seq_printf(m, "amd-requested-vram:\t%llu KiB\n", 103 + stats.requested_vram/1024UL); 104 + seq_printf(m, "amd-requested-visible-vram:\t%llu KiB\n", 105 + stats.requested_visible_vram/1024UL); 106 + seq_printf(m, "amd-requested-gtt:\t%llu KiB\n", 107 + stats.requested_gtt/1024UL); 108 + 97 109 for (hw_ip = 0; hw_ip < AMDGPU_HW_IP_NUM; ++hw_ip) { 98 110 if (!usage[hw_ip]) 99 111 continue;
+22 -5
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
··· 1265 1265 trace_amdgpu_bo_move(abo, new_mem->mem_type, old_mem->mem_type); 1266 1266 } 1267 1267 1268 - void amdgpu_bo_get_memory(struct amdgpu_bo *bo, uint64_t *vram_mem, 1269 - uint64_t *gtt_mem, uint64_t *cpu_mem) 1268 + void amdgpu_bo_get_memory(struct amdgpu_bo *bo, 1269 + struct amdgpu_mem_stats *stats) 1270 1270 { 1271 1271 unsigned int domain; 1272 + uint64_t size = amdgpu_bo_size(bo); 1272 1273 1273 1274 domain = amdgpu_mem_type_to_domain(bo->tbo.resource->mem_type); 1274 1275 switch (domain) { 1275 1276 case AMDGPU_GEM_DOMAIN_VRAM: 1276 - *vram_mem += amdgpu_bo_size(bo); 1277 + stats->vram += size; 1278 + if (amdgpu_bo_in_cpu_visible_vram(bo)) 1279 + stats->visible_vram += size; 1277 1280 break; 1278 1281 case AMDGPU_GEM_DOMAIN_GTT: 1279 - *gtt_mem += amdgpu_bo_size(bo); 1282 + stats->gtt += size; 1280 1283 break; 1281 1284 case AMDGPU_GEM_DOMAIN_CPU: 1282 1285 default: 1283 - *cpu_mem += amdgpu_bo_size(bo); 1286 + stats->cpu += size; 1284 1287 break; 1288 + } 1289 + 1290 + if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) { 1291 + stats->requested_vram += size; 1292 + if (bo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) 1293 + stats->requested_visible_vram += size; 1294 + 1295 + if (domain != AMDGPU_GEM_DOMAIN_VRAM) { 1296 + stats->evicted_vram += size; 1297 + if (bo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) 1298 + stats->evicted_visible_vram += size; 1299 + } 1300 + } else if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_GTT) { 1301 + stats->requested_gtt += size; 1285 1302 } 1286 1303 } 1287 1304
+23 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
··· 126 126 struct amdgpu_vm_bo_base entries[]; 127 127 }; 128 128 129 + struct amdgpu_mem_stats { 130 + /* current VRAM usage, includes visible VRAM */ 131 + uint64_t vram; 132 + /* current visible VRAM usage */ 133 + uint64_t visible_vram; 134 + /* current GTT usage */ 135 + uint64_t gtt; 136 + /* current system memory usage */ 137 + uint64_t cpu; 138 + /* sum of evicted buffers, includes visible VRAM */ 139 + uint64_t evicted_vram; 140 + /* sum of evicted buffers due to CPU access */ 141 + uint64_t evicted_visible_vram; 142 + /* how much userspace asked for, includes vis.VRAM */ 143 + uint64_t requested_vram; 144 + /* how much userspace asked for */ 145 + uint64_t requested_visible_vram; 146 + /* how much userspace asked for */ 147 + uint64_t requested_gtt; 148 + }; 149 + 129 150 static inline struct amdgpu_bo *ttm_to_amdgpu_bo(struct ttm_buffer_object *tbo) 130 151 { 131 152 return container_of(tbo, struct amdgpu_bo, tbo); ··· 346 325 int amdgpu_bo_sync_wait(struct amdgpu_bo *bo, void *owner, bool intr); 347 326 u64 amdgpu_bo_gpu_offset(struct amdgpu_bo *bo); 348 327 u64 amdgpu_bo_gpu_offset_no_check(struct amdgpu_bo *bo); 349 - void amdgpu_bo_get_memory(struct amdgpu_bo *bo, uint64_t *vram_mem, 350 - uint64_t *gtt_mem, uint64_t *cpu_mem); 328 + void amdgpu_bo_get_memory(struct amdgpu_bo *bo, 329 + struct amdgpu_mem_stats *stats); 351 330 void amdgpu_bo_add_to_shadow_list(struct amdgpu_bo_vm *vmbo); 352 331 int amdgpu_bo_restore_shadow(struct amdgpu_bo *shadow, 353 332 struct dma_fence **fence);
+9 -14
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
··· 920 920 return r; 921 921 } 922 922 923 - void amdgpu_vm_get_memory(struct amdgpu_vm *vm, uint64_t *vram_mem, 924 - uint64_t *gtt_mem, uint64_t *cpu_mem) 923 + void amdgpu_vm_get_memory(struct amdgpu_vm *vm, 924 + struct amdgpu_mem_stats *stats) 925 925 { 926 926 struct amdgpu_bo_va *bo_va, *tmp; 927 927 ··· 929 929 list_for_each_entry_safe(bo_va, tmp, &vm->idle, base.vm_status) { 930 930 if (!bo_va->base.bo) 931 931 continue; 932 - amdgpu_bo_get_memory(bo_va->base.bo, vram_mem, 933 - gtt_mem, cpu_mem); 932 + amdgpu_bo_get_memory(bo_va->base.bo, stats); 934 933 } 935 934 list_for_each_entry_safe(bo_va, tmp, &vm->evicted, base.vm_status) { 936 935 if (!bo_va->base.bo) 937 936 continue; 938 - amdgpu_bo_get_memory(bo_va->base.bo, vram_mem, 939 - gtt_mem, cpu_mem); 937 + amdgpu_bo_get_memory(bo_va->base.bo, stats); 940 938 } 941 939 list_for_each_entry_safe(bo_va, tmp, &vm->relocated, base.vm_status) { 942 940 if (!bo_va->base.bo) 943 941 continue; 944 - amdgpu_bo_get_memory(bo_va->base.bo, vram_mem, 945 - gtt_mem, cpu_mem); 942 + amdgpu_bo_get_memory(bo_va->base.bo, stats); 946 943 } 947 944 list_for_each_entry_safe(bo_va, tmp, &vm->moved, base.vm_status) { 948 945 if (!bo_va->base.bo) 949 946 continue; 950 - amdgpu_bo_get_memory(bo_va->base.bo, vram_mem, 951 - gtt_mem, cpu_mem); 947 + amdgpu_bo_get_memory(bo_va->base.bo, stats); 952 948 } 953 949 list_for_each_entry_safe(bo_va, tmp, &vm->invalidated, base.vm_status) { 954 950 if (!bo_va->base.bo) 955 951 continue; 956 - amdgpu_bo_get_memory(bo_va->base.bo, vram_mem, 957 - gtt_mem, cpu_mem); 952 + amdgpu_bo_get_memory(bo_va->base.bo, stats); 958 953 } 959 954 list_for_each_entry_safe(bo_va, tmp, &vm->done, base.vm_status) { 960 955 if (!bo_va->base.bo) 961 956 continue; 962 - amdgpu_bo_get_memory(bo_va->base.bo, vram_mem, 963 - gtt_mem, cpu_mem); 957 + amdgpu_bo_get_memory(bo_va->base.bo, stats); 964 958 } 965 959 spin_unlock(&vm->status_lock); 966 960 } 961 + 967 962 /** 968 963 * amdgpu_vm_bo_update - update all BO mappings in the vm page table 969 964 *
+3 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
··· 40 40 struct amdgpu_job; 41 41 struct amdgpu_bo_list_entry; 42 42 struct amdgpu_bo_vm; 43 + struct amdgpu_mem_stats; 43 44 44 45 /* 45 46 * GPUVM handling ··· 458 457 459 458 void amdgpu_vm_move_to_lru_tail(struct amdgpu_device *adev, 460 459 struct amdgpu_vm *vm); 461 - void amdgpu_vm_get_memory(struct amdgpu_vm *vm, uint64_t *vram_mem, 462 - uint64_t *gtt_mem, uint64_t *cpu_mem); 460 + void amdgpu_vm_get_memory(struct amdgpu_vm *vm, 461 + struct amdgpu_mem_stats *stats); 463 462 464 463 int amdgpu_vm_pt_clear(struct amdgpu_device *adev, struct amdgpu_vm *vm, 465 464 struct amdgpu_bo_vm *vmbo, bool immediate);