The pasid is a per-process-per-device attribute,
therefore this commit implements per
struct kfd_process_device->pasid in sysfs

Signed-off-by: Zhu Lingshan <[email protected]>
---
 drivers/gpu/drm/amd/amdkfd/kfd_priv.h    |  9 ++-------
 drivers/gpu/drm/amd/amdkfd/kfd_process.c | 18 +++++++++++-------
 2 files changed, 13 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h 
b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
index 70ef051511bb..6a3cfeccacd8 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
@@ -864,6 +864,8 @@ struct kfd_process_device {
        bool has_reset_queue;
 
        u32 pasid;
+       char pasid_filename[MAX_SYSFS_FILENAME_LEN];
+       struct attribute attr_pasid;
 };
 
 #define qpd_to_pdd(x) container_of(x, struct kfd_process_device, qpd)
@@ -983,7 +985,6 @@ struct kfd_process {
        /* Kobj for our procfs */
        struct kobject *kobj;
        struct kobject *kobj_queues;
-       struct attribute attr_pasid;
 
        /* Keep track cwsr init */
        bool has_cwsr;
@@ -1100,12 +1101,6 @@ void kfd_process_device_remove_obj_handle(struct 
kfd_process_device *pdd,
                                        int handle);
 struct kfd_process *kfd_lookup_process_by_pid(struct pid *pid);
 
-/* PASIDs */
-int kfd_pasid_init(void);
-void kfd_pasid_exit(void);
-u32 kfd_pasid_alloc(void);
-void kfd_pasid_free(u32 pasid);
-
 /* Doorbells */
 size_t kfd_doorbell_process_slice(struct kfd_dev *kfd);
 int kfd_doorbell_init(struct kfd_dev *kfd);
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index ddfe30c13e9d..24cf3b250b37 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
@@ -328,9 +328,11 @@ static int kfd_get_cu_occupancy(struct attribute *attr, 
char *buffer)
 static ssize_t kfd_procfs_show(struct kobject *kobj, struct attribute *attr,
                               char *buffer)
 {
-       if (strcmp(attr->name, "pasid") == 0)
-               return snprintf(buffer, PAGE_SIZE, "%d\n", 0);
-       else if (strncmp(attr->name, "vram_", 5) == 0) {
+       if (strncmp(attr->name, "pasid_", 6) == 0) {
+               struct kfd_process_device *pdd = container_of(attr, struct 
kfd_process_device,
+                                                             attr_pasid);
+               return snprintf(buffer, PAGE_SIZE, "%u\n", pdd->pasid);
+       } else if (strncmp(attr->name, "vram_", 5) == 0) {
                struct kfd_process_device *pdd = container_of(attr, struct 
kfd_process_device,
                                                              attr_vram);
                return snprintf(buffer, PAGE_SIZE, "%llu\n", 
atomic64_read(&pdd->vram_usage));
@@ -662,6 +664,7 @@ static void kfd_procfs_add_sysfs_files(struct kfd_process 
*p)
         * Create sysfs files for each GPU:
         * - proc/<pid>/vram_<gpuid>
         * - proc/<pid>/sdma_<gpuid>
+        * - proc/<pid>/pasid_<gpuid>
         */
        for (i = 0; i < p->n_pdds; i++) {
                struct kfd_process_device *pdd = p->pdds[i];
@@ -675,6 +678,10 @@ static void kfd_procfs_add_sysfs_files(struct kfd_process 
*p)
                         pdd->dev->id);
                kfd_sysfs_create_file(p->kobj, &pdd->attr_sdma,
                                            pdd->sdma_filename);
+
+               snprintf(pdd->pasid_filename, MAX_SYSFS_FILENAME_LEN, 
"pasid_%u",
+                        pdd->dev->id);
+               kfd_sysfs_create_file(p->kobj, &pdd->attr_pasid, 
pdd->pasid_filename);
        }
 }
 
@@ -888,9 +895,6 @@ struct kfd_process *kfd_create_process(struct task_struct 
*thread)
                        goto out;
                }
 
-               kfd_sysfs_create_file(process->kobj, &process->attr_pasid,
-                                     "pasid");
-
                process->kobj_queues = kobject_create_and_add("queues",
                                                        process->kobj);
                if (!process->kobj_queues)
@@ -1104,7 +1108,6 @@ static void kfd_process_remove_sysfs(struct kfd_process 
*p)
        if (!p->kobj)
                return;
 
-       sysfs_remove_file(p->kobj, &p->attr_pasid);
        kobject_del(p->kobj_queues);
        kobject_put(p->kobj_queues);
        p->kobj_queues = NULL;
@@ -1114,6 +1117,7 @@ static void kfd_process_remove_sysfs(struct kfd_process 
*p)
 
                sysfs_remove_file(p->kobj, &pdd->attr_vram);
                sysfs_remove_file(p->kobj, &pdd->attr_sdma);
+               sysfs_remove_file(p->kobj, &pdd->attr_pasid);
 
                sysfs_remove_file(pdd->kobj_stats, &pdd->attr_evict);
                if (pdd->dev->kfd2kgd->get_cu_occupancy)
-- 
2.51.0

Reply via email to