Message ID | 1502120958-24130-7-git-send-email-deathsimple@vodafone.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Aug 7, 2017 at 11:49 AM, Christian König <deathsimple@vodafone.de> wrote: > From: Christian König <christian.koenig@amd.com> > > Looks like a better place for this. > > Signed-off-by: Christian König <christian.koenig@amd.com> Series is: Reviewed-by: Alex Deucher <alexander.deucher@amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 - > drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 5 ++- > drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 9 ++-- > drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 50 ---------------------- > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 3 ++ > drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 64 ++++++++++++++++++++++++++-- > 6 files changed, 71 insertions(+), 62 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > index aff89d7..03d6342 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > @@ -1484,8 +1484,6 @@ struct amdgpu_device { > struct amdgpu_mman mman; > struct amdgpu_vram_scratch vram_scratch; > struct amdgpu_wb wb; > - atomic64_t vram_usage; > - atomic64_t vram_vis_usage; > atomic64_t num_bytes_moved; > atomic64_t num_evictions; > atomic64_t num_vram_cpu_page_faults; > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c > index fe974f7..6741deb 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c > @@ -243,7 +243,7 @@ static void amdgpu_cs_get_threshold_for_moves(struct amdgpu_device *adev, > } > > total_vram = adev->mc.real_vram_size - adev->vram_pin_size; > - used_vram = atomic64_read(&adev->vram_usage); > + used_vram = amdgpu_vram_mgr_usage(&adev->mman.bdev.man[TTM_PL_VRAM]); > free_vram = used_vram >= total_vram ? 0 : total_vram - used_vram; > > spin_lock(&adev->mm_stats.lock); > @@ -289,7 +289,8 @@ static void amdgpu_cs_get_threshold_for_moves(struct amdgpu_device *adev, > /* Do the same for visible VRAM if half of it is free */ > if (adev->mc.visible_vram_size < adev->mc.real_vram_size) { > u64 total_vis_vram = adev->mc.visible_vram_size; > - u64 used_vis_vram = atomic64_read(&adev->vram_vis_usage); > + u64 used_vis_vram = > + amdgpu_vram_mgr_vis_usage(&adev->mman.bdev.man[TTM_PL_VRAM]); > > if (used_vis_vram < total_vis_vram) { > u64 free_vis_vram = total_vis_vram - used_vis_vram; > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c > index 3209198..4a6407d 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c > @@ -455,10 +455,10 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file > ui64 = atomic64_read(&adev->num_vram_cpu_page_faults); > return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0; > case AMDGPU_INFO_VRAM_USAGE: > - ui64 = atomic64_read(&adev->vram_usage); > + ui64 = amdgpu_vram_mgr_usage(&adev->mman.bdev.man[TTM_PL_VRAM]); > return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0; > case AMDGPU_INFO_VIS_VRAM_USAGE: > - ui64 = atomic64_read(&adev->vram_vis_usage); > + ui64 = amdgpu_vram_mgr_vis_usage(&adev->mman.bdev.man[TTM_PL_VRAM]); > return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0; > case AMDGPU_INFO_GTT_USAGE: > ui64 = amdgpu_gtt_mgr_usage(&adev->mman.bdev.man[TTM_PL_TT]); > @@ -497,7 +497,8 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file > mem.vram.total_heap_size = adev->mc.real_vram_size; > mem.vram.usable_heap_size = > adev->mc.real_vram_size - adev->vram_pin_size; > - mem.vram.heap_usage = atomic64_read(&adev->vram_usage); > + mem.vram.heap_usage = > + amdgpu_vram_mgr_usage(&adev->mman.bdev.man[TTM_PL_VRAM]); > mem.vram.max_allocation = mem.vram.usable_heap_size * 3 / 4; > > mem.cpu_accessible_vram.total_heap_size = > @@ -506,7 +507,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file > adev->mc.visible_vram_size - > (adev->vram_pin_size - adev->invisible_pin_size); > mem.cpu_accessible_vram.heap_usage = > - atomic64_read(&adev->vram_vis_usage); > + amdgpu_vram_mgr_vis_usage(&adev->mman.bdev.man[TTM_PL_VRAM]); > mem.cpu_accessible_vram.max_allocation = > mem.cpu_accessible_vram.usable_heap_size * 3 / 4; > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c > index d67a997..01a125b 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c > @@ -37,53 +37,6 @@ > #include "amdgpu.h" > #include "amdgpu_trace.h" > > - > - > -static u64 amdgpu_get_vis_part_size(struct amdgpu_device *adev, > - struct ttm_mem_reg *mem) > -{ > - if (mem->start << PAGE_SHIFT >= adev->mc.visible_vram_size) > - return 0; > - > - return ((mem->start << PAGE_SHIFT) + mem->size) > > - adev->mc.visible_vram_size ? > - adev->mc.visible_vram_size - (mem->start << PAGE_SHIFT) : > - mem->size; > -} > - > -static void amdgpu_update_memory_usage(struct amdgpu_device *adev, > - struct ttm_mem_reg *old_mem, > - struct ttm_mem_reg *new_mem) > -{ > - u64 vis_size; > - if (!adev) > - return; > - > - if (new_mem) { > - switch (new_mem->mem_type) { > - case TTM_PL_TT: > - break; > - case TTM_PL_VRAM: > - atomic64_add(new_mem->size, &adev->vram_usage); > - vis_size = amdgpu_get_vis_part_size(adev, new_mem); > - atomic64_add(vis_size, &adev->vram_vis_usage); > - break; > - } > - } > - > - if (old_mem) { > - switch (old_mem->mem_type) { > - case TTM_PL_TT: > - break; > - case TTM_PL_VRAM: > - atomic64_sub(old_mem->size, &adev->vram_usage); > - vis_size = amdgpu_get_vis_part_size(adev, old_mem); > - atomic64_sub(vis_size, &adev->vram_vis_usage); > - break; > - } > - } > -} > - > static void amdgpu_ttm_bo_destroy(struct ttm_buffer_object *tbo) > { > struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev); > @@ -92,7 +45,6 @@ static void amdgpu_ttm_bo_destroy(struct ttm_buffer_object *tbo) > bo = container_of(tbo, struct amdgpu_bo, tbo); > > amdgpu_bo_kunmap(bo); > - amdgpu_update_memory_usage(adev, &bo->tbo.mem, NULL); > > drm_gem_object_release(&bo->gem_base); > amdgpu_bo_unref(&bo->parent); > @@ -990,8 +942,6 @@ void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, > return; > > /* move_notify is called before move happens */ > - amdgpu_update_memory_usage(adev, &bo->mem, new_mem); > - > trace_amdgpu_ttm_bo_move(abo, new_mem->mem_type, old_mem->mem_type); > } > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > index 1307ab5..f22a475 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > @@ -68,6 +68,9 @@ int amdgpu_gtt_mgr_alloc(struct ttm_mem_type_manager *man, > struct ttm_mem_reg *mem); > uint64_t amdgpu_gtt_mgr_usage(struct ttm_mem_type_manager *man); > > +uint64_t amdgpu_vram_mgr_usage(struct ttm_mem_type_manager *man); > +uint64_t amdgpu_vram_mgr_vis_usage(struct ttm_mem_type_manager *man); > + > int amdgpu_copy_buffer(struct amdgpu_ring *ring, uint64_t src_offset, > uint64_t dst_offset, uint32_t byte_count, > struct reservation_object *resv, > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c > index 1eb8d5d..49b0aa1 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c > @@ -28,6 +28,8 @@ > struct amdgpu_vram_mgr { > struct drm_mm mm; > spinlock_t lock; > + uint64_t usage; > + uint64_t vis_usage; > }; > > /** > @@ -79,6 +81,27 @@ static int amdgpu_vram_mgr_fini(struct ttm_mem_type_manager *man) > } > > /** > + * amdgpu_vram_mgr_vis_size - Calculate visible node size > + * > + * @adev: amdgpu device structure > + * @node: MM node structure > + * > + * Calculate how many bytes of the MM node are inside visible VRAM > + */ > +static u64 amdgpu_vram_mgr_vis_size(struct amdgpu_device *adev, > + struct drm_mm_node *node) > +{ > + uint64_t start = node->start << PAGE_SHIFT; > + uint64_t end = (node->size + node->start) << PAGE_SHIFT; > + > + if (start >= adev->mc.visible_vram_size) > + return 0; > + > + return (end > adev->mc.visible_vram_size ? > + adev->mc.visible_vram_size : end) - start; > +} > + > +/** > * amdgpu_vram_mgr_new - allocate new ranges > * > * @man: TTM memory type manager > @@ -93,6 +116,7 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man, > const struct ttm_place *place, > struct ttm_mem_reg *mem) > { > + struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev); > struct amdgpu_vram_mgr *mgr = man->priv; > struct drm_mm *mm = &mgr->mm; > struct drm_mm_node *nodes; > @@ -142,6 +166,9 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man, > if (unlikely(r)) > goto error; > > + mgr->usage += nodes[i].size << PAGE_SHIFT; > + mgr->vis_usage += amdgpu_vram_mgr_vis_size(adev, &nodes[i]); > + > /* Calculate a virtual BO start address to easily check if > * everything is CPU accessible. > */ > @@ -181,6 +208,7 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man, > static void amdgpu_vram_mgr_del(struct ttm_mem_type_manager *man, > struct ttm_mem_reg *mem) > { > + struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev); > struct amdgpu_vram_mgr *mgr = man->priv; > struct drm_mm_node *nodes = mem->mm_node; > unsigned pages = mem->num_pages; > @@ -192,6 +220,8 @@ static void amdgpu_vram_mgr_del(struct ttm_mem_type_manager *man, > while (pages) { > pages -= nodes->size; > drm_mm_remove_node(nodes); > + mgr->usage -= nodes->size << PAGE_SHIFT; > + mgr->vis_usage -= amdgpu_vram_mgr_vis_size(adev, nodes); > ++nodes; > } > spin_unlock(&mgr->lock); > @@ -201,6 +231,34 @@ static void amdgpu_vram_mgr_del(struct ttm_mem_type_manager *man, > } > > /** > + * amdgpu_vram_mgr_usage - how many bytes are used in this domain > + * > + * @man: TTM memory type manager > + * > + * Returns how many bytes are used in this domain. > + */ > +uint64_t amdgpu_vram_mgr_usage(struct ttm_mem_type_manager *man) > +{ > + struct amdgpu_vram_mgr *mgr = man->priv; > + > + return READ_ONCE(mgr->usage); > +} > + > +/** > + * amdgpu_vram_mgr_vis_usage - how many bytes are used in the visible part > + * > + * @man: TTM memory type manager > + * > + * Returns how many bytes are used in the visible part of VRAM > + */ > +uint64_t amdgpu_vram_mgr_vis_usage(struct ttm_mem_type_manager *man) > +{ > + struct amdgpu_vram_mgr *mgr = man->priv; > + > + return READ_ONCE(mgr->vis_usage); > +} > + > +/** > * amdgpu_vram_mgr_debug - dump VRAM table > * > * @man: TTM memory type manager > @@ -211,7 +269,6 @@ static void amdgpu_vram_mgr_del(struct ttm_mem_type_manager *man, > static void amdgpu_vram_mgr_debug(struct ttm_mem_type_manager *man, > struct drm_printer *printer) > { > - struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev); > struct amdgpu_vram_mgr *mgr = man->priv; > > spin_lock(&mgr->lock); > @@ -219,9 +276,8 @@ static void amdgpu_vram_mgr_debug(struct ttm_mem_type_manager *man, > spin_unlock(&mgr->lock); > > drm_printf(printer, "man size:%llu pages, ram usage:%lluMB, vis usage:%lluMB\n", > - adev->mman.bdev.man[TTM_PL_VRAM].size, > - (u64)atomic64_read(&adev->vram_usage) >> 20, > - (u64)atomic64_read(&adev->vram_vis_usage) >> 20); > + man->size, amdgpu_vram_mgr_usage(man) >> 20, > + amdgpu_vram_mgr_vis_usage(man) >> 20); > } > > const struct ttm_mem_type_manager_func amdgpu_vram_mgr_func = { > -- > 2.7.4 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index aff89d7..03d6342 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -1484,8 +1484,6 @@ struct amdgpu_device { struct amdgpu_mman mman; struct amdgpu_vram_scratch vram_scratch; struct amdgpu_wb wb; - atomic64_t vram_usage; - atomic64_t vram_vis_usage; atomic64_t num_bytes_moved; atomic64_t num_evictions; atomic64_t num_vram_cpu_page_faults; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index fe974f7..6741deb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c @@ -243,7 +243,7 @@ static void amdgpu_cs_get_threshold_for_moves(struct amdgpu_device *adev, } total_vram = adev->mc.real_vram_size - adev->vram_pin_size; - used_vram = atomic64_read(&adev->vram_usage); + used_vram = amdgpu_vram_mgr_usage(&adev->mman.bdev.man[TTM_PL_VRAM]); free_vram = used_vram >= total_vram ? 0 : total_vram - used_vram; spin_lock(&adev->mm_stats.lock); @@ -289,7 +289,8 @@ static void amdgpu_cs_get_threshold_for_moves(struct amdgpu_device *adev, /* Do the same for visible VRAM if half of it is free */ if (adev->mc.visible_vram_size < adev->mc.real_vram_size) { u64 total_vis_vram = adev->mc.visible_vram_size; - u64 used_vis_vram = atomic64_read(&adev->vram_vis_usage); + u64 used_vis_vram = + amdgpu_vram_mgr_vis_usage(&adev->mman.bdev.man[TTM_PL_VRAM]); if (used_vis_vram < total_vis_vram) { u64 free_vis_vram = total_vis_vram - used_vis_vram; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index 3209198..4a6407d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -455,10 +455,10 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file ui64 = atomic64_read(&adev->num_vram_cpu_page_faults); return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0; case AMDGPU_INFO_VRAM_USAGE: - ui64 = atomic64_read(&adev->vram_usage); + ui64 = amdgpu_vram_mgr_usage(&adev->mman.bdev.man[TTM_PL_VRAM]); return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0; case AMDGPU_INFO_VIS_VRAM_USAGE: - ui64 = atomic64_read(&adev->vram_vis_usage); + ui64 = amdgpu_vram_mgr_vis_usage(&adev->mman.bdev.man[TTM_PL_VRAM]); return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0; case AMDGPU_INFO_GTT_USAGE: ui64 = amdgpu_gtt_mgr_usage(&adev->mman.bdev.man[TTM_PL_TT]); @@ -497,7 +497,8 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file mem.vram.total_heap_size = adev->mc.real_vram_size; mem.vram.usable_heap_size = adev->mc.real_vram_size - adev->vram_pin_size; - mem.vram.heap_usage = atomic64_read(&adev->vram_usage); + mem.vram.heap_usage = + amdgpu_vram_mgr_usage(&adev->mman.bdev.man[TTM_PL_VRAM]); mem.vram.max_allocation = mem.vram.usable_heap_size * 3 / 4; mem.cpu_accessible_vram.total_heap_size = @@ -506,7 +507,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file adev->mc.visible_vram_size - (adev->vram_pin_size - adev->invisible_pin_size); mem.cpu_accessible_vram.heap_usage = - atomic64_read(&adev->vram_vis_usage); + amdgpu_vram_mgr_vis_usage(&adev->mman.bdev.man[TTM_PL_VRAM]); mem.cpu_accessible_vram.max_allocation = mem.cpu_accessible_vram.usable_heap_size * 3 / 4; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index d67a997..01a125b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -37,53 +37,6 @@ #include "amdgpu.h" #include "amdgpu_trace.h" - - -static u64 amdgpu_get_vis_part_size(struct amdgpu_device *adev, - struct ttm_mem_reg *mem) -{ - if (mem->start << PAGE_SHIFT >= adev->mc.visible_vram_size) - return 0; - - return ((mem->start << PAGE_SHIFT) + mem->size) > - adev->mc.visible_vram_size ? - adev->mc.visible_vram_size - (mem->start << PAGE_SHIFT) : - mem->size; -} - -static void amdgpu_update_memory_usage(struct amdgpu_device *adev, - struct ttm_mem_reg *old_mem, - struct ttm_mem_reg *new_mem) -{ - u64 vis_size; - if (!adev) - return; - - if (new_mem) { - switch (new_mem->mem_type) { - case TTM_PL_TT: - break; - case TTM_PL_VRAM: - atomic64_add(new_mem->size, &adev->vram_usage); - vis_size = amdgpu_get_vis_part_size(adev, new_mem); - atomic64_add(vis_size, &adev->vram_vis_usage); - break; - } - } - - if (old_mem) { - switch (old_mem->mem_type) { - case TTM_PL_TT: - break; - case TTM_PL_VRAM: - atomic64_sub(old_mem->size, &adev->vram_usage); - vis_size = amdgpu_get_vis_part_size(adev, old_mem); - atomic64_sub(vis_size, &adev->vram_vis_usage); - break; - } - } -} - static void amdgpu_ttm_bo_destroy(struct ttm_buffer_object *tbo) { struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev); @@ -92,7 +45,6 @@ static void amdgpu_ttm_bo_destroy(struct ttm_buffer_object *tbo) bo = container_of(tbo, struct amdgpu_bo, tbo); amdgpu_bo_kunmap(bo); - amdgpu_update_memory_usage(adev, &bo->tbo.mem, NULL); drm_gem_object_release(&bo->gem_base); amdgpu_bo_unref(&bo->parent); @@ -990,8 +942,6 @@ void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, return; /* move_notify is called before move happens */ - amdgpu_update_memory_usage(adev, &bo->mem, new_mem); - trace_amdgpu_ttm_bo_move(abo, new_mem->mem_type, old_mem->mem_type); } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index 1307ab5..f22a475 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -68,6 +68,9 @@ int amdgpu_gtt_mgr_alloc(struct ttm_mem_type_manager *man, struct ttm_mem_reg *mem); uint64_t amdgpu_gtt_mgr_usage(struct ttm_mem_type_manager *man); +uint64_t amdgpu_vram_mgr_usage(struct ttm_mem_type_manager *man); +uint64_t amdgpu_vram_mgr_vis_usage(struct ttm_mem_type_manager *man); + int amdgpu_copy_buffer(struct amdgpu_ring *ring, uint64_t src_offset, uint64_t dst_offset, uint32_t byte_count, struct reservation_object *resv, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 1eb8d5d..49b0aa1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -28,6 +28,8 @@ struct amdgpu_vram_mgr { struct drm_mm mm; spinlock_t lock; + uint64_t usage; + uint64_t vis_usage; }; /** @@ -79,6 +81,27 @@ static int amdgpu_vram_mgr_fini(struct ttm_mem_type_manager *man) } /** + * amdgpu_vram_mgr_vis_size - Calculate visible node size + * + * @adev: amdgpu device structure + * @node: MM node structure + * + * Calculate how many bytes of the MM node are inside visible VRAM + */ +static u64 amdgpu_vram_mgr_vis_size(struct amdgpu_device *adev, + struct drm_mm_node *node) +{ + uint64_t start = node->start << PAGE_SHIFT; + uint64_t end = (node->size + node->start) << PAGE_SHIFT; + + if (start >= adev->mc.visible_vram_size) + return 0; + + return (end > adev->mc.visible_vram_size ? + adev->mc.visible_vram_size : end) - start; +} + +/** * amdgpu_vram_mgr_new - allocate new ranges * * @man: TTM memory type manager @@ -93,6 +116,7 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man, const struct ttm_place *place, struct ttm_mem_reg *mem) { + struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev); struct amdgpu_vram_mgr *mgr = man->priv; struct drm_mm *mm = &mgr->mm; struct drm_mm_node *nodes; @@ -142,6 +166,9 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man, if (unlikely(r)) goto error; + mgr->usage += nodes[i].size << PAGE_SHIFT; + mgr->vis_usage += amdgpu_vram_mgr_vis_size(adev, &nodes[i]); + /* Calculate a virtual BO start address to easily check if * everything is CPU accessible. */ @@ -181,6 +208,7 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man, static void amdgpu_vram_mgr_del(struct ttm_mem_type_manager *man, struct ttm_mem_reg *mem) { + struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev); struct amdgpu_vram_mgr *mgr = man->priv; struct drm_mm_node *nodes = mem->mm_node; unsigned pages = mem->num_pages; @@ -192,6 +220,8 @@ static void amdgpu_vram_mgr_del(struct ttm_mem_type_manager *man, while (pages) { pages -= nodes->size; drm_mm_remove_node(nodes); + mgr->usage -= nodes->size << PAGE_SHIFT; + mgr->vis_usage -= amdgpu_vram_mgr_vis_size(adev, nodes); ++nodes; } spin_unlock(&mgr->lock); @@ -201,6 +231,34 @@ static void amdgpu_vram_mgr_del(struct ttm_mem_type_manager *man, } /** + * amdgpu_vram_mgr_usage - how many bytes are used in this domain + * + * @man: TTM memory type manager + * + * Returns how many bytes are used in this domain. + */ +uint64_t amdgpu_vram_mgr_usage(struct ttm_mem_type_manager *man) +{ + struct amdgpu_vram_mgr *mgr = man->priv; + + return READ_ONCE(mgr->usage); +} + +/** + * amdgpu_vram_mgr_vis_usage - how many bytes are used in the visible part + * + * @man: TTM memory type manager + * + * Returns how many bytes are used in the visible part of VRAM + */ +uint64_t amdgpu_vram_mgr_vis_usage(struct ttm_mem_type_manager *man) +{ + struct amdgpu_vram_mgr *mgr = man->priv; + + return READ_ONCE(mgr->vis_usage); +} + +/** * amdgpu_vram_mgr_debug - dump VRAM table * * @man: TTM memory type manager @@ -211,7 +269,6 @@ static void amdgpu_vram_mgr_del(struct ttm_mem_type_manager *man, static void amdgpu_vram_mgr_debug(struct ttm_mem_type_manager *man, struct drm_printer *printer) { - struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev); struct amdgpu_vram_mgr *mgr = man->priv; spin_lock(&mgr->lock); @@ -219,9 +276,8 @@ static void amdgpu_vram_mgr_debug(struct ttm_mem_type_manager *man, spin_unlock(&mgr->lock); drm_printf(printer, "man size:%llu pages, ram usage:%lluMB, vis usage:%lluMB\n", - adev->mman.bdev.man[TTM_PL_VRAM].size, - (u64)atomic64_read(&adev->vram_usage) >> 20, - (u64)atomic64_read(&adev->vram_vis_usage) >> 20); + man->size, amdgpu_vram_mgr_usage(man) >> 20, + amdgpu_vram_mgr_vis_usage(man) >> 20); } const struct ttm_mem_type_manager_func amdgpu_vram_mgr_func = {