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

Deucher, Alexander Alexander.Deucher at amd.com
Thu Feb 28 16:12:30 UTC 2019


> -----Original Message-----
> From: amd-gfx <amd-gfx-bounces at lists.freedesktop.org> On Behalf Of
> Kuehling, Felix
> Sent: Thursday, February 28, 2019 11:09 AM
> To: Koenig, Christian <Christian.Koenig at amd.com>; Russell, Kent
> <Kent.Russell at amd.com>; amd-gfx at lists.freedesktop.org
> Subject: Re: [PATCH] drm/amdgpu: Add sysfs files for returning VRAM/GTT
> info
> 
> On 2/28/2019 9:56 AM, Christian König wrote:
> > 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.
> 
> Is this rule written down anywhere. I see that space-separated lists of things
> are common. E.g. scaling_available_governors in the cpufreq directories.
> 
> In Documentation/admin-guide/sysfs-rules.rst I don't see any rule about
> single value per file. Maybe that's because these rules are more from user
> mode usage of sysfs rather than for kernel implementations.

This (two values) is also more consistent with the pcie bw file IIRC.

Alex

> 
> Regards,
>    Felix
> 
> 
> >
> > 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;
> >>   }
> >
> > _______________________________________________
> > amd-gfx mailing list
> > amd-gfx at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/amd-gfx
> _______________________________________________
> 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