[PATCH 2/2] drm/amdgpu: move vram usage tracking into the vram manager v2

Deucher, Alexander Alexander.Deucher at amd.com
Tue Aug 8 15:22:19 UTC 2017


> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces at lists.freedesktop.org] On Behalf
> Of Christian König
> Sent: Tuesday, August 08, 2017 8:34 AM
> To: amd-gfx at lists.freedesktop.org
> Subject: [PATCH 2/2] drm/amdgpu: move vram usage tracking into the vram
> manager v2
> 
> From: Christian König <christian.koenig at amd.com>
> 
> Looks like a better place for this.
> 
> v2: use atomic64_t members instead
> 
> Signed-off-by: Christian König <christian.koenig at amd.com>

Series is:
Reviewed-by: Alex Deucher <alexander.deucher at 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 | 72
> ++++++++++++++++++++++++++--
>  6 files changed, 79 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..26e9006 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;
> +	atomic64_t usage;
> +	atomic64_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,11 +116,13 @@ 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;
>  	enum drm_mm_insert_mode mode;
>  	unsigned long lpfn, num_nodes, pages_per_node, pages_left;
> +	uint64_t usage = 0, vis_usage = 0;
>  	unsigned i;
>  	int r;
> 
> @@ -142,6 +167,9 @@ static int amdgpu_vram_mgr_new(struct
> ttm_mem_type_manager *man,
>  		if (unlikely(r))
>  			goto error;
> 
> +		usage += nodes[i].size << PAGE_SHIFT;
> +		vis_usage += amdgpu_vram_mgr_vis_size(adev, &nodes[i]);
> +
>  		/* Calculate a virtual BO start address to easily check if
>  		 * everything is CPU accessible.
>  		 */
> @@ -155,6 +183,9 @@ static int amdgpu_vram_mgr_new(struct
> ttm_mem_type_manager *man,
>  	}
>  	spin_unlock(&mgr->lock);
> 
> +	atomic64_add(usage, &mgr->usage);
> +	atomic64_add(vis_usage, &mgr->vis_usage);
> +
>  	mem->mm_node = nodes;
> 
>  	return 0;
> @@ -181,8 +212,10 @@ 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;
> +	uint64_t usage = 0, vis_usage = 0;
>  	unsigned pages = mem->num_pages;
> 
>  	if (!mem->mm_node)
> @@ -192,15 +225,48 @@ static void amdgpu_vram_mgr_del(struct
> ttm_mem_type_manager *man,
>  	while (pages) {
>  		pages -= nodes->size;
>  		drm_mm_remove_node(nodes);
> +		usage += nodes->size << PAGE_SHIFT;
> +		vis_usage += amdgpu_vram_mgr_vis_size(adev, nodes);
>  		++nodes;
>  	}
>  	spin_unlock(&mgr->lock);
> 
> +	atomic64_sub(usage, &mgr->usage);
> +	atomic64_sub(vis_usage, &mgr->vis_usage);
> +
>  	kfree(mem->mm_node);
>  	mem->mm_node = NULL;
>  }
> 
>  /**
> + * 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 atomic64_read(&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 atomic64_read(&mgr->vis_usage);
> +}
> +
> +/**
>   * amdgpu_vram_mgr_debug - dump VRAM table
>   *
>   * @man: TTM memory type manager
> @@ -211,7 +277,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 +284,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
> 
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list