[PATCH] drm/amdgpu: Add sysfs files for returning VRAM/GTT info
Christian König
ckoenig.leichtzumerken at gmail.com
Thu Feb 28 15:56:03 UTC 2019
Am 28.02.19 um 16:32 schrieb Russell, Kent:
> Add 3 files that return:
> The total amount of VRAM and the current total used VRAM
> The total amount of VRAM and the current total used visible VRAM
> The total GTT size and the current total of used GTT
>
> Each returns 2 integers, total and used, in bytes
Well that is a good start, but unfortunately violates the rules for
sysfs. You need to return one value per file.
So you should create 6 files in total.
Regards,
Christian.
>
> Change-Id: I0bd702b166b4253887ef76fb1bba8b9aadc7e2c5
> Signed-off-by: Kent Russell <kent.russell at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 36 +++++++++++
> drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 67 ++++++++++++++++++++
> 2 files changed, 103 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..adfa211c5152 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
> @@ -36,6 +36,30 @@ struct amdgpu_gtt_node {
> struct ttm_buffer_object *tbo;
> };
>
> +/**
> + * DOC: mem_info_gtt
> + *
> + * The amdgpu driver provides a sysfs API for reporting current GTT information
> + * The file mem_info_gtt is used for this.
> + * The file returns the total size of the GTT block and the current amount of
> + * used GTT as 2 separate integers, in bytes
> + */
> +static ssize_t amdgpu_mem_info_gtt_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;
> + uint64_t used_gtt, total_gtt;
> +
> + used_gtt = amdgpu_gtt_mgr_usage(&adev->mman.bdev.man[TTM_PL_TT]);
> + total_gtt = (adev->mman.bdev.man[TTM_PL_TT].size) * PAGE_SIZE;
> +
> + return snprintf(buf, PAGE_SIZE, "%llu %llu\n",
> + total_gtt, used_gtt);
> +}
> +
> +static DEVICE_ATTR(mem_info_gtt, S_IRUGO, amdgpu_mem_info_gtt_show, NULL);
> +
> /**
> * amdgpu_gtt_mgr_init - init GTT manager and DRM MM
> *
> @@ -50,6 +74,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 +86,13 @@ 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);
> + if (ret) {
> + DRM_ERROR("Failed to create device file mem_info_gtt\n");
> + return ret;
> + }
> +
> return 0;
> }
>
> @@ -74,12 +106,16 @@ 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);
> +
> 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..d0bada997cba 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
> @@ -32,6 +32,55 @@ struct amdgpu_vram_mgr {
> atomic64_t vis_usage;
> };
>
> +/**
> + * DOC: mem_info_vram
> + *
> + * The amdgpu driver provides a sysfs API for reporting current VRAM information
> + * The file mem_info_vram is used for this.
> + * The file returns the total amount of VRAM and the current total amount of
> + * used VRAM as 2 separate integers, in bytes
> + */
> +static ssize_t amdgpu_mem_info_vram_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;
> + uint64_t used_vram, total_vram;
> +
> + used_vram = amdgpu_vram_mgr_usage(&adev->mman.bdev.man[TTM_PL_VRAM]);
> + total_vram = adev->gmc.real_vram_size;
> +
> + return snprintf(buf, PAGE_SIZE, "%llu %llu\n", total_vram, used_vram);
> +}
> +
> +/**
> + * DOC: mem_info_vis_vram
> + *
> + * The amdgpu driver provides a sysfs API for reporting current visible VRAM
> + * information
> + * The file mem_info_vis_vram is used for this.
> + * The file returns the total amount of VRAM and the current total amount of
> + * used visible VRAM as 2 separate integers, in bytes
> + */
> +static ssize_t amdgpu_mem_info_vis_vram_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;
> + uint64_t used_vis_vram, total_vram;
> +
> + used_vis_vram =
> + amdgpu_vram_mgr_vis_usage(&adev->mman.bdev.man[TTM_PL_VRAM]);
> + total_vram = adev->gmc.real_vram_size;
> +
> + return snprintf(buf, PAGE_SIZE, "%llu %llu\n",
> + total_vram, used_vis_vram);
> +}
> +
> +static DEVICE_ATTR(mem_info_vram, S_IRUGO, amdgpu_mem_info_vram_show, NULL);
> +static DEVICE_ATTR(mem_info_vis_vram, S_IRUGO, amdgpu_mem_info_vis_vram_show,
> + NULL);
> +
> /**
> * amdgpu_vram_mgr_init - init VRAM manager and DRM MM
> *
> @@ -43,7 +92,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 +103,19 @@ 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);
> + if (ret) {
> + DRM_ERROR("Failed to create device file mem_info_vram\n");
> + return ret;
> + }
> + ret = device_create_file(adev->dev, &dev_attr_mem_info_vis_vram);
> + if (ret) {
> + DRM_ERROR("Failed to create device file mem_info_vis_vram\n");
> + return ret;
> + }
> +
> return 0;
> }
>
> @@ -65,6 +129,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 +137,8 @@ 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);
> + device_remove_file(adev->dev, &dev_attr_mem_info_vis_vram);
> return 0;
> }
>
More information about the amd-gfx
mailing list