[PATCH] drm/amdgpu: Add sysfs files for returning VRAM/GTT info v2

Christian König ckoenig.leichtzumerken at gmail.com
Thu Feb 28 17:31:48 UTC 2019


Am 28.02.19 um 18:08 schrieb Russell, Kent:
> Add 6 files that return (in bytes):
> The total amount of VRAM/visible VRAM/GTT
> and the current total used VRAM/visible VRAM/GTT
>
> v2: Split used and total into separate files
>
> Change-Id: I0bd702b166b4253887ef76fb1bba8b9aadc7e2c5
> Signed-off-by: Kent Russell <kent.russell at amd.com>

Having a separate DRM_ERROR for each file looks like a bit overkill, but 
not much of a problem.

Anyway patch is Reviewed-by: Christian König <christian.koenig at amd.com>.

And thanks for the LWN link, going to keep that around when somebody 
else asks.

Regards,
Christian.

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c  |  59 ++++++++++
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 109 +++++++++++++++++++
>   2 files changed, 168 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
> index da7b1b92d9cf..62591d081856 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
> @@ -36,6 +36,47 @@ struct amdgpu_gtt_node {
>   	struct ttm_buffer_object *tbo;
>   };
>   
> +/**
> + * DOC: mem_info_gtt_total
> + *
> + * The amdgpu driver provides a sysfs API for reporting current total size of
> + * the GTT.
> + * The file mem_info_gtt_total is used for this, and returns the total size of
> + * the GTT block, in bytes
> + */
> +static ssize_t amdgpu_mem_info_gtt_total_show(struct device *dev,
> +		struct device_attribute *attr, char *buf)
> +{
> +	struct drm_device *ddev = dev_get_drvdata(dev);
> +	struct amdgpu_device *adev = ddev->dev_private;
> +
> +	return snprintf(buf, PAGE_SIZE, "%llu\n",
> +			(adev->mman.bdev.man[TTM_PL_TT].size) * PAGE_SIZE);
> +}
> +
> +/**
> + * DOC: mem_info_gtt_used
> + *
> + * The amdgpu driver provides a sysfs API for reporting current total amount of
> + * used GTT.
> + * The file mem_info_gtt_used is used for this, and returns the current used
> + * size of the GTT block, in bytes
> + */
> +static ssize_t amdgpu_mem_info_gtt_used_show(struct device *dev,
> +		struct device_attribute *attr, char *buf)
> +{
> +	struct drm_device *ddev = dev_get_drvdata(dev);
> +	struct amdgpu_device *adev = ddev->dev_private;
> +
> +	return snprintf(buf, PAGE_SIZE, "%llu\n",
> +			amdgpu_gtt_mgr_usage(&adev->mman.bdev.man[TTM_PL_TT]));
> +}
> +
> +static DEVICE_ATTR(mem_info_gtt_total, S_IRUGO,
> +	           amdgpu_mem_info_gtt_total_show, NULL);
> +static DEVICE_ATTR(mem_info_gtt_used, S_IRUGO,
> +	           amdgpu_mem_info_gtt_used_show, NULL);
> +
>   /**
>    * amdgpu_gtt_mgr_init - init GTT manager and DRM MM
>    *
> @@ -50,6 +91,7 @@ static int amdgpu_gtt_mgr_init(struct ttm_mem_type_manager *man,
>   	struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev);
>   	struct amdgpu_gtt_mgr *mgr;
>   	uint64_t start, size;
> +	int ret;
>   
>   	mgr = kzalloc(sizeof(*mgr), GFP_KERNEL);
>   	if (!mgr)
> @@ -61,6 +103,18 @@ static int amdgpu_gtt_mgr_init(struct ttm_mem_type_manager *man,
>   	spin_lock_init(&mgr->lock);
>   	atomic64_set(&mgr->available, p_size);
>   	man->priv = mgr;
> +
> +	ret = device_create_file(adev->dev, &dev_attr_mem_info_gtt_total);
> +	if (ret) {
> +		DRM_ERROR("Failed to create device file mem_info_gtt_total\n");
> +		return ret;
> +	}
> +	ret = device_create_file(adev->dev, &dev_attr_mem_info_gtt_used);
> +	if (ret) {
> +		DRM_ERROR("Failed to create device file mem_info_gtt_used\n");
> +		return ret;
> +	}
> +
>   	return 0;
>   }
>   
> @@ -74,12 +128,17 @@ static int amdgpu_gtt_mgr_init(struct ttm_mem_type_manager *man,
>    */
>   static int amdgpu_gtt_mgr_fini(struct ttm_mem_type_manager *man)
>   {
> +	struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev);
>   	struct amdgpu_gtt_mgr *mgr = man->priv;
>   	spin_lock(&mgr->lock);
>   	drm_mm_takedown(&mgr->mm);
>   	spin_unlock(&mgr->lock);
>   	kfree(mgr);
>   	man->priv = NULL;
> +
> +	device_remove_file(adev->dev, &dev_attr_mem_info_gtt_total);
> +	device_remove_file(adev->dev, &dev_attr_mem_info_gtt_used);
> +
>   	return 0;
>   }
>   
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
> index 3f9d5d00c9b3..ec9ea3fdbb4a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
> @@ -32,6 +32,85 @@ struct amdgpu_vram_mgr {
>   	atomic64_t vis_usage;
>   };
>   
> +/**
> + * DOC: mem_info_vram_total
> + *
> + * The amdgpu driver provides a sysfs API for reporting current total VRAM
> + * available on the device
> + * The file mem_info_vram_total is used for this and returns the total
> + * amount of VRAM in bytes
> + */
> +static ssize_t amdgpu_mem_info_vram_total_show(struct device *dev,
> +		struct device_attribute *attr, char *buf)
> +{
> +	struct drm_device *ddev = dev_get_drvdata(dev);
> +	struct amdgpu_device *adev = ddev->dev_private;
> +
> +	return snprintf(buf, PAGE_SIZE, "%llu\n", adev->gmc.real_vram_size);
> +}
> +
> +/**
> + * DOC: mem_info_vis_vram_total
> + *
> + * The amdgpu driver provides a sysfs API for reporting current total
> + * visible VRAM available on the device
> + * The file mem_info_vis_vram_total is used for this and returns the total
> + * amount of visible VRAM in bytes
> + */
> +static ssize_t amdgpu_mem_info_vis_vram_total_show(struct device *dev,
> +		struct device_attribute *attr, char *buf)
> +{
> +	struct drm_device *ddev = dev_get_drvdata(dev);
> +	struct amdgpu_device *adev = ddev->dev_private;
> +
> +	return snprintf(buf, PAGE_SIZE, "%llu\n", adev->gmc.visible_vram_size);
> +}
> +
> +/**
> + * DOC: mem_info_vram_used
> + *
> + * The amdgpu driver provides a sysfs API for reporting current total VRAM
> + * available on the device
> + * The file mem_info_vram_used is used for this and returns the total
> + * amount of currently used VRAM in bytes
> + */
> +static ssize_t amdgpu_mem_info_vram_used_show(struct device *dev,
> +		struct device_attribute *attr, char *buf)
> +{
> +	struct drm_device *ddev = dev_get_drvdata(dev);
> +	struct amdgpu_device *adev = ddev->dev_private;
> +
> +	return snprintf(buf, PAGE_SIZE, "%llu\n",
> +		amdgpu_vram_mgr_usage(&adev->mman.bdev.man[TTM_PL_VRAM]));
> +}
> +
> +/**
> + * DOC: mem_info_vis_vram_used
> + *
> + * The amdgpu driver provides a sysfs API for reporting current total of
> + * used visible VRAM
> + * The file mem_info_vis_vram_used is used for this and returns the total
> + * amount of currently used visible VRAM in bytes
> + */
> +static ssize_t amdgpu_mem_info_vis_vram_used_show(struct device *dev,
> +		struct device_attribute *attr, char *buf)
> +{
> +	struct drm_device *ddev = dev_get_drvdata(dev);
> +	struct amdgpu_device *adev = ddev->dev_private;
> +
> +	return snprintf(buf, PAGE_SIZE, "%llu\n",
> +		amdgpu_vram_mgr_vis_usage(&adev->mman.bdev.man[TTM_PL_VRAM]));
> +}
> +
> +static DEVICE_ATTR(mem_info_vram_total, S_IRUGO,
> +		   amdgpu_mem_info_vram_total_show, NULL);
> +static DEVICE_ATTR(mem_info_vis_vram_total, S_IRUGO,
> +		   amdgpu_mem_info_vis_vram_total_show,NULL);
> +static DEVICE_ATTR(mem_info_vram_used, S_IRUGO,
> +		   amdgpu_mem_info_vram_used_show, NULL);
> +static DEVICE_ATTR(mem_info_vis_vram_used, S_IRUGO,
> +		   amdgpu_mem_info_vis_vram_used_show, NULL);
> +
>   /**
>    * amdgpu_vram_mgr_init - init VRAM manager and DRM MM
>    *
> @@ -43,7 +122,9 @@ struct amdgpu_vram_mgr {
>   static int amdgpu_vram_mgr_init(struct ttm_mem_type_manager *man,
>   				unsigned long p_size)
>   {
> +	struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev);
>   	struct amdgpu_vram_mgr *mgr;
> +	int ret;
>   
>   	mgr = kzalloc(sizeof(*mgr), GFP_KERNEL);
>   	if (!mgr)
> @@ -52,6 +133,29 @@ static int amdgpu_vram_mgr_init(struct ttm_mem_type_manager *man,
>   	drm_mm_init(&mgr->mm, 0, p_size);
>   	spin_lock_init(&mgr->lock);
>   	man->priv = mgr;
> +
> +	/* Add the two VRAM-related sysfs files */
> +	ret = device_create_file(adev->dev, &dev_attr_mem_info_vram_total);
> +	if (ret) {
> +		DRM_ERROR("Failed to create device file mem_info_vram_total\n");
> +		return ret;
> +	}
> +	ret = device_create_file(adev->dev, &dev_attr_mem_info_vis_vram_total);
> +	if (ret) {
> +		DRM_ERROR("Failed to create device file mem_info_vis_vram_total\n");
> +		return ret;
> +	}
> +	ret = device_create_file(adev->dev, &dev_attr_mem_info_vram_used);
> +	if (ret) {
> +		DRM_ERROR("Failed to create device file mem_info_vram_used\n");
> +		return ret;
> +	}
> +	ret = device_create_file(adev->dev, &dev_attr_mem_info_vis_vram_used);
> +	if (ret) {
> +		DRM_ERROR("Failed to create device file mem_info_vis_vram_used\n");
> +		return ret;
> +	}
> +
>   	return 0;
>   }
>   
> @@ -65,6 +169,7 @@ static int amdgpu_vram_mgr_init(struct ttm_mem_type_manager *man,
>    */
>   static int amdgpu_vram_mgr_fini(struct ttm_mem_type_manager *man)
>   {
> +	struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev);
>   	struct amdgpu_vram_mgr *mgr = man->priv;
>   
>   	spin_lock(&mgr->lock);
> @@ -72,6 +177,10 @@ static int amdgpu_vram_mgr_fini(struct ttm_mem_type_manager *man)
>   	spin_unlock(&mgr->lock);
>   	kfree(mgr);
>   	man->priv = NULL;
> +	device_remove_file(adev->dev, &dev_attr_mem_info_vram_total);
> +	device_remove_file(adev->dev, &dev_attr_mem_info_vis_vram_total);
> +	device_remove_file(adev->dev, &dev_attr_mem_info_vram_used);
> +	device_remove_file(adev->dev, &dev_attr_mem_info_vis_vram_used);
>   	return 0;
>   }
>   



More information about the amd-gfx mailing list