Am 11.12.2017 um 17:40 schrieb Oded Gabbay:
On Mon, Dec 11, 2017 at 5:32 PM, Oded Gabbay <oded.gab...@gmail.com> wrote:
On Sat, Dec 9, 2017 at 6:09 AM, Felix Kuehling <felix.kuehl...@amd.com> wrote:
From: Kent Russell <kent.russ...@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.

Christian.


Thanks,

Oded


Signed-off-by: Kent Russell <kent.russ...@amd.com>
Signed-off-by: Felix Kuehling <felix.kuehl...@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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to