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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

> 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
>


[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux