[PATCH 28/37] drm/amdkfd: Add support for displaying VRAM usage

Felix Kuehling felix.kuehling at amd.com
Mon Dec 11 19:52:28 UTC 2017


On 2017-12-11 12:28 PM, Christian König wrote:
> Am 11.12.2017 um 17:40 schrieb Oded Gabbay:
>> On Mon, Dec 11, 2017 at 5:32 PM, Oded Gabbay <oded.gabbay at gmail.com>
>> wrote:
>>> On Sat, Dec 9, 2017 at 6:09 AM, Felix Kuehling
>>> <Felix.Kuehling at amd.com> wrote:
>>>> From: Kent Russell <kent.russell at amd.com>
>>>>
>>>> Add a sysfs file in topology (node/x/memory_banks/X/used_memory) that
>>>> reports the current VRAM usage for that node. Only works for GPU nodes
>>>> at this time.
>>>>
>>> As with patch 22 (perf counters), I would not expect this information
>>> to be included in the topology. It doesn't describe the properties of
>>> the device, but a current state.
>>> Oded
>> For example, in amdgpu, the VRAM usage is reported in the INFO IOCTL
>> (AMDGPU_INFO_VRAM_USAGE). See function  amdgpu_info_ioctl()
>
> Yep, completely agree.
>
> That stuff is runtime properties and not static attribute nor
> configuration or setup.
>
> So either debugfs or IOCTL are the two best options as far as I can see.

Right. I admit, this feature was a bit of a hack to quickly enable the
HIP team without having to change a bunch of interfaces (ioctls, Thunk,
and Runtime).

This patch isn't critical for enabling dGPU support. I'll drop it for
now and we can reimplement it properly later.

Regards,
  Felix

>
> Christian.
>
>>
>> Thanks,
>>
>> Oded
>>
>>
>>>> Signed-off-by: Kent Russell <kent.russell at amd.com>
>>>> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
>>>> ---
>>>>   drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 49
>>>> +++++++++++++++++++++++++++----
>>>>   drivers/gpu/drm/amd/amdkfd/kfd_topology.h |  4 ++-
>>>>   2 files changed, 46 insertions(+), 7 deletions(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
>>>> b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
>>>> index 7f0d41e..7f04038 100644
>>>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
>>>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
>>>> @@ -186,6 +186,8 @@ struct kfd_topology_device
>>>> *kfd_create_topology_device(
>>>>                  sysfs_show_gen_prop(buffer, "%s %llu\n", name, value)
>>>>   #define sysfs_show_32bit_val(buffer, value) \
>>>>                  sysfs_show_gen_prop(buffer, "%u\n", value)
>>>> +#define sysfs_show_64bit_val(buffer, value) \
>>>> +               sysfs_show_gen_prop(buffer, "%llu\n", value)
>>>>   #define sysfs_show_str_val(buffer, value) \
>>>>                  sysfs_show_gen_prop(buffer, "%s\n", value)
>>>>
>>>> @@ -268,11 +270,23 @@ static ssize_t mem_show(struct kobject *kobj,
>>>> struct attribute *attr,
>>>>   {
>>>>          ssize_t ret;
>>>>          struct kfd_mem_properties *mem;
>>>> +       uint64_t used_mem;
>>>>
>>>>          /* Making sure that the buffer is an empty string */
>>>>          buffer[0] = 0;
>>>>
>>>> -       mem = container_of(attr, struct kfd_mem_properties, attr);
>>>> +       if (strcmp(attr->name, "used_memory") == 0) {
>>>> +               mem = container_of(attr, struct kfd_mem_properties,
>>>> attr_used);
>>>> +               if (mem->gpu) {
>>>> +                       used_mem = mem->gpu->kfd2kgd->get_vram_usage(
>>>> +                                                              
>>>> mem->gpu->kgd);
>>>> +                       return sysfs_show_64bit_val(buffer, used_mem);
>>>> +               }
>>>> +               /* TODO: Report APU/CPU-allocated memory; For now
>>>> return 0 */
>>>> +               return 0;
>>>> +       }
>>>> +
>>>> +       mem = container_of(attr, struct kfd_mem_properties,
>>>> attr_props);
>>>>          sysfs_show_32bit_prop(buffer, "heap_type", mem->heap_type);
>>>>          sysfs_show_64bit_prop(buffer, "size_in_bytes",
>>>> mem->size_in_bytes);
>>>>          sysfs_show_32bit_prop(buffer, "flags", mem->flags);
>>>> @@ -527,7 +541,12 @@ static void kfd_remove_sysfs_node_entry(struct
>>>> kfd_topology_device *dev)
>>>>          if (dev->kobj_mem) {
>>>>                  list_for_each_entry(mem, &dev->mem_props, list)
>>>>                          if (mem->kobj) {
>>>> -                               kfd_remove_sysfs_file(mem->kobj,
>>>> &mem->attr);
>>>> +                               /* TODO: Remove when CPU/APU
>>>> supported */
>>>> +                               if (dev->node_props.cpu_cores_count
>>>> == 0)
>>>> +                                       sysfs_remove_file(mem->kobj,
>>>> +                                                      
>>>> &mem->attr_used);
>>>> +                               kfd_remove_sysfs_file(mem->kobj,
>>>> +                                               &mem->attr_props);
>>>>                                  mem->kobj = NULL;
>>>>                          }
>>>>                  kobject_del(dev->kobj_mem);
>>>> @@ -629,12 +648,23 @@ static int kfd_build_sysfs_node_entry(struct
>>>> kfd_topology_device *dev,
>>>>                  if (ret < 0)
>>>>                          return ret;
>>>>
>>>> -               mem->attr.name = "properties";
>>>> -               mem->attr.mode = KFD_SYSFS_FILE_MODE;
>>>> -               sysfs_attr_init(&mem->attr);
>>>> -               ret = sysfs_create_file(mem->kobj, &mem->attr);
>>>> +               mem->attr_props.name = "properties";
>>>> +               mem->attr_props.mode = KFD_SYSFS_FILE_MODE;
>>>> +               sysfs_attr_init(&mem->attr_props);
>>>> +               ret = sysfs_create_file(mem->kobj, &mem->attr_props);
>>>>                  if (ret < 0)
>>>>                          return ret;
>>>> +
>>>> +               /* TODO: Support APU/CPU memory usage */
>>>> +               if (dev->node_props.cpu_cores_count == 0) {
>>>> +                       mem->attr_used.name = "used_memory";
>>>> +                       mem->attr_used.mode = KFD_SYSFS_FILE_MODE;
>>>> +                       sysfs_attr_init(&mem->attr_used);
>>>> +                       ret = sysfs_create_file(mem->kobj,
>>>> &mem->attr_used);
>>>> +                       if (ret < 0)
>>>> +                               return ret;
>>>> +               }
>>>> +
>>>>                  i++;
>>>>          }
>>>>
>>>> @@ -1075,15 +1105,22 @@ static struct kfd_topology_device
>>>> *kfd_assign_gpu(struct kfd_dev *gpu)
>>>>   {
>>>>          struct kfd_topology_device *dev;
>>>>          struct kfd_topology_device *out_dev = NULL;
>>>> +       struct kfd_mem_properties *mem;
>>>>
>>>>          down_write(&topology_lock);
>>>>          list_for_each_entry(dev, &topology_device_list, list)
>>>>                  if (!dev->gpu && (dev->node_props.simd_count > 0)) {
>>>>                          dev->gpu = gpu;
>>>>                          out_dev = dev;
>>>> +
>>>> +                       /* Assign mem->gpu */
>>>> +                       list_for_each_entry(mem, &dev->mem_props,
>>>> list)
>>>> +                               mem->gpu = dev->gpu;
>>>> +
>>>>                          break;
>>>>                  }
>>>>          up_write(&topology_lock);
>>>> +
>>>>          return out_dev;
>>>>   }
>>>>
>>>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.h
>>>> b/drivers/gpu/drm/amd/amdkfd/kfd_topology.h
>>>> index 53fca1f..0f698d8 100644
>>>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.h
>>>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.h
>>>> @@ -93,7 +93,9 @@ struct kfd_mem_properties {
>>>>          uint32_t                width;
>>>>          uint32_t                mem_clk_max;
>>>>          struct kobject          *kobj;
>>>> -       struct attribute        attr;
>>>> +       struct kfd_dev          *gpu;
>>>> +       struct attribute        attr_props;
>>>> +       struct attribute        attr_used;
>>>>   };
>>>>
>>>>   #define HSA_CACHE_TYPE_DATA            0x00000001
>>>> -- 
>>>> 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