Thanks.

To add to what Kent said, this is for providing per-process information 
in rocm-smi or other tools. It should allow us to do something like "ps" 
or "top" for compute processes running on the GPU. Currently it's only 
the PASID. We'll add per-process memory usage and probably user mode 
queue usage as well (there has been a recent request to detect and 
report queue oversubscription because it can have severe performance 
impact).

The change is Reviewed-by: Felix Kuehling <felix.kuehl...@amd.com>

Regards,
   Felix

On 2019-06-19 10:44, Koenig, Christian wrote:
> Ok, that's what I wanted to know. Feel free to add my Acked-by to the patch.
>
> Thanks,
> Christian.
>
> Am 19.06.19 um 16:42 schrieb Russell, Kent:
>> I'd rather it be in debugfs too, but the requirements are that it be exposed 
>> through the SMI. And whenever we do anything that requires root for reading 
>> in the SMI, people complain (they expect root for writing, but I had dozens 
>> of complaints/bug reports when reporting voltage via debugfs required root). 
>> That's why we did things like moving the voltage, memory usage, etc to sysfs.
>>
>> So unfortunately it can't go in debugfs, even though that's where I would 
>> have preferred it. I know that it kind of locks us in interface-wise though.
>>
>>    Kent
>>
>> -----Original Message-----
>> From: Koenig, Christian <christian.koe...@amd.com>
>> Sent: Wednesday, June 19, 2019 10:35 AM
>> To: Russell, Kent <kent.russ...@amd.com>; amd-gfx@lists.freedesktop.org
>> Subject: Re: [PATCH] drm/amdkfd: Add procfs-style information for KFD 
>> processes
>>
>> Do we need a stable interface? Would debugfs do as well?
>>
>> I mean in general looks good for sysfs as well, just want to double check.
>>
>> Christian.
>>
>> Am 19.06.19 um 16:28 schrieb Russell, Kent:
>>> Right now the use case would be to list which processes were created in a 
>>> KFD context, but it would allow for further expansion to include things 
>>> like the GPU associated with the PID, memory usage, etc. For now, the use 
>>> case is listing KFD-related PIDs, but will be expanded later to include 
>>> memory usage for sure (plus other things that I expect will requested later 
>>> on).
>>>     
>>>     Kent
>>>
>>> -----Original Message-----
>>> From: Christian König <ckoenig.leichtzumer...@gmail.com>
>>> Sent: Wednesday, June 19, 2019 10:04 AM
>>> To: Russell, Kent <kent.russ...@amd.com>;
>>> amd-gfx@lists.freedesktop.org
>>> Subject: Re: [PATCH] drm/amdkfd: Add procfs-style information for KFD
>>> processes
>>>
>>> Am 19.06.19 um 16:01 schrieb Russell, Kent:
>>>> Add a folder structure to /sys/class/kfd/kfd/ called proc which
>>>> contains subfolders, each representing an active KFD process' PID,
>>>> containing 1
>>>> file: pasid.
>>> What is the use case of that information? In other words would it be maybe 
>>> better to create debugfs entries instead?
>>>
>>> Christian.
>>>
>>>> Change-Id: Id3dfab8a6250264434b34ccddbcdb459d1da7478
>>>> Signed-off-by: Kent Russell <kent.russ...@amd.com>
>>>> ---
>>>>      drivers/gpu/drm/amd/amdkfd/kfd_module.c  |   6 ++
>>>>      drivers/gpu/drm/amd/amdkfd/kfd_priv.h    |   9 ++
>>>>      drivers/gpu/drm/amd/amdkfd/kfd_process.c | 100 ++++++++++++++++++++++-
>>>>      3 files changed, 113 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_module.c
>>>> b/drivers/gpu/drm/amd/amdkfd/kfd_module.c
>>>> index 932007eb9168..986ff52d5750 100644
>>>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_module.c
>>>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_module.c
>>>> @@ -56,6 +56,11 @@ static int kfd_init(void)
>>>>            if (err < 0)
>>>>                    goto err_create_wq;
>>>>      
>>>> +  /* Ignore the return value, so that we can continue
>>>> +   * to init the KFD, even if procfs isn't craated
>>>> +   */
>>>> +  kfd_procfs_init();
>>>> +
>>>>            kfd_debugfs_init();
>>>>      
>>>>            return 0;
>>>> @@ -72,6 +77,7 @@ static void kfd_exit(void)
>>>>      {
>>>>            kfd_debugfs_fini();
>>>>            kfd_process_destroy_wq();
>>>> +  kfd_procfs_shutdown();
>>>>            kfd_topology_shutdown();
>>>>            kfd_chardev_exit();
>>>>      }
>>>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
>>>> b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
>>>> index da589ee1366c..bd01396c8cea 100644
>>>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
>>>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
>>>> @@ -35,6 +35,7 @@
>>>>      #include <linux/kfifo.h>
>>>>      #include <linux/seq_file.h>
>>>>      #include <linux/kref.h>
>>>> +#include <linux/sysfs.h>
>>>>      #include <kgd_kfd_interface.h>
>>>>      
>>>>      #include "amd_shared.h"
>>>> @@ -718,6 +719,10 @@ struct kfd_process {
>>>>             * restored after an eviction
>>>>             */
>>>>            unsigned long last_restore_timestamp;
>>>> +
>>>> +  /* Kobj for our procfs */
>>>> +  struct kobject *kobj;
>>>> +  struct attribute attr_pasid;
>>>>      };
>>>>      
>>>>      #define KFD_PROCESS_TABLE_SIZE 5 /* bits: 32 entries */ @@ -820,6
>>>> +825,10 @@ int kfd_gtt_sa_free(struct kfd_dev *kfd, struct
>>>> +kfd_mem_obj
>>>> *mem_obj);
>>>>      
>>>>      extern struct device *kfd_device;
>>>>      
>>>> +/* KFD's procfs */
>>>> +void kfd_procfs_init(void);
>>>> +void kfd_procfs_shutdown(void);
>>>> +
>>>>      /* Topology */
>>>>      int kfd_topology_init(void);
>>>>      void kfd_topology_shutdown(void);
>>>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
>>>> b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
>>>> index 4bdae78bab8e..ed2d83f93fd8 100644
>>>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
>>>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
>>>> @@ -68,6 +68,68 @@ static struct kfd_process *create_process(const struct 
>>>> task_struct *thread,
>>>>      static void evict_process_worker(struct work_struct *work);
>>>>      static void restore_process_worker(struct work_struct *work);
>>>>      
>>>> +struct kfd_procfs_tree {
>>>> +  struct kobject *kobj;
>>>> +};
>>>> +
>>>> +static struct kfd_procfs_tree procfs;
>>>> +
>>>> +static ssize_t kfd_procfs_show(struct kobject *kobj, struct attribute 
>>>> *attr,
>>>> +                         char *buffer)
>>>> +{
>>>> +  int val = 0;
>>>> +
>>>> +  if (strcmp(attr->name, "pasid") == 0) {
>>>> +          struct kfd_process *p = container_of(attr, struct kfd_process,
>>>> +                                               attr_pasid);
>>>> +          val = p->pasid;
>>>> +  } else {
>>>> +          pr_err("Invalid attribute");
>>>> +          return -EINVAL;
>>>> +  }
>>>> +
>>>> +  return snprintf(buffer, PAGE_SIZE, "%d\n", val); }
>>>> +
>>>> +static void kfd_procfs_kobj_release(struct kobject *kobj) {
>>>> +  kfree(kobj);
>>>> +}
>>>> +
>>>> +static const struct sysfs_ops kfd_procfs_ops = {
>>>> +  .show = kfd_procfs_show,
>>>> +};
>>>> +
>>>> +static struct kobj_type procfs_type = {
>>>> +  .release = kfd_procfs_kobj_release,
>>>> +  .sysfs_ops = &kfd_procfs_ops,
>>>> +};
>>>> +
>>>> +void kfd_procfs_init(void)
>>>> +{
>>>> +  int ret = 0;
>>>> +
>>>> +  procfs.kobj = kfd_alloc_struct(procfs.kobj);
>>>> +  if (!procfs.kobj)
>>>> +          return;
>>>> +
>>>> +  ret = kobject_init_and_add(procfs.kobj, &procfs_type,
>>>> +                             &kfd_device->kobj, "proc");
>>>> +  if (ret) {
>>>> +          pr_warn("Could not create procfs proc folder");
>>>> +          /* If we fail to create the procfs, clean up */
>>>> +          kfd_procfs_shutdown();
>>>> +  }
>>>> +}
>>>> +
>>>> +void kfd_procfs_shutdown(void)
>>>> +{
>>>> +  if (procfs.kobj) {
>>>> +          kobject_del(procfs.kobj);
>>>> +          kobject_put(procfs.kobj);
>>>> +          procfs.kobj = NULL;
>>>> +  }
>>>> +}
>>>>      
>>>>      int kfd_process_create_wq(void)
>>>>      {
>>>> @@ -206,6 +268,7 @@ struct kfd_process *kfd_create_process(struct file 
>>>> *filep)
>>>>      {
>>>>            struct kfd_process *process;
>>>>            struct task_struct *thread = current;
>>>> +  int ret;
>>>>      
>>>>            if (!thread->mm)
>>>>                    return ERR_PTR(-EINVAL);
>>>> @@ -223,11 +286,36 @@ struct kfd_process *kfd_create_process(struct
>>>> file *filep)
>>>>      
>>>>            /* A prior open of /dev/kfd could have already created the 
>>>> process. */
>>>>            process = find_process(thread);
>>>> -  if (process)
>>>> +  if (process) {
>>>>                    pr_debug("Process already found\n");
>>>> -  else
>>>> +  } else {
>>>>                    process = create_process(thread, filep);
>>>>      
>>>> +          if (!procfs.kobj)
>>>> +                  goto out;
>>>> +
>>>> +          process->kobj = kfd_alloc_struct(process->kobj);
>>>> +          if (!process->kobj) {
>>>> +                  pr_warn("Creating procfs kobject failed");
>>>> +                  goto out;
>>>> +          }
>>>> +          ret = kobject_init_and_add(process->kobj, &procfs_type,
>>>> +                                     procfs.kobj, "%d",
>>>> +                                     (int)process->lead_thread->pid);
>>>> +          if (ret) {
>>>> +                  pr_warn("Creating procfs pid directory failed");
>>>> +                  goto out;
>>>> +          }
>>>> +
>>>> +          process->attr_pasid.name = "pasid";
>>>> +          process->attr_pasid.mode = KFD_SYSFS_FILE_MODE;
>>>> +          sysfs_attr_init(&process->attr_pasid);
>>>> +          ret = sysfs_create_file(process->kobj, &process->attr_pasid);
>>>> +          if (ret)
>>>> +                  pr_warn("Creating pasid for pid %d failed",
>>>> +                                  (int)process->lead_thread->pid);
>>>> +  }
>>>> +out:
>>>>            mutex_unlock(&kfd_processes_mutex);
>>>>      
>>>>            return process;
>>>> @@ -355,6 +443,14 @@ static void kfd_process_wq_release(struct work_struct 
>>>> *work)
>>>>            struct kfd_process *p = container_of(work, struct kfd_process,
>>>>                                                 release_work);
>>>>      
>>>> +  /* Remove the procfs files */
>>>> +  if (p->kobj) {
>>>> +          sysfs_remove_file(p->kobj, &p->attr_pasid);
>>>> +          kobject_del(p->kobj);
>>>> +          kobject_put(p->kobj);
>>>> +          p->kobj = NULL;
>>>> +  }
>>>> +
>>>>            kfd_iommu_unbind_process(p);
>>>>      
>>>>            kfd_process_free_outstanding_kfd_bos(p);
> _______________________________________________
> 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