OSDN Git Service

drm/amdkfd: add helper function for kfd sysfs create
authorPhilip Yang <Philip.Yang@amd.com>
Wed, 16 Jun 2021 14:02:18 +0000 (10:02 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 30 Jun 2021 04:18:23 +0000 (00:18 -0400)
No functionality change. Modify kfd_sysfs_create_file to use kobject as
parameter, so it becomes common helper function to remove duplicate code
and will simplify new kfd sysfs file create in future.

Move pr_warn to helper function if sysfs file create failed. Set helper
function as void return because caller doesn't use the helper function
return value.

Signed-off-by: Philip Yang <Philip.Yang@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_process.c

index 09b98a8..3147dc8 100644 (file)
@@ -484,34 +484,31 @@ int kfd_procfs_add_queue(struct queue *q)
        return 0;
 }
 
-static int kfd_sysfs_create_file(struct kfd_process *p, struct attribute *attr,
+static void kfd_sysfs_create_file(struct kobject *kobj, struct attribute *attr,
                                 char *name)
 {
-       int ret = 0;
+       int ret;
 
-       if (!p || !attr || !name)
-               return -EINVAL;
+       if (!kobj || !attr || !name)
+               return;
 
        attr->name = name;
        attr->mode = KFD_SYSFS_FILE_MODE;
        sysfs_attr_init(attr);
 
-       ret = sysfs_create_file(p->kobj, attr);
-
-       return ret;
+       ret = sysfs_create_file(kobj, attr);
+       if (ret)
+               pr_warn("Create sysfs %s/%s failed %d", kobj->name, name, ret);
 }
 
-static int kfd_procfs_add_sysfs_stats(struct kfd_process *p)
+static void kfd_procfs_add_sysfs_stats(struct kfd_process *p)
 {
-       int ret = 0;
+       int ret;
        int i;
        char stats_dir_filename[MAX_SYSFS_FILENAME_LEN];
 
-       if (!p)
-               return -EINVAL;
-
-       if (!p->kobj)
-               return -EFAULT;
+       if (!p || !p->kobj)
+               return;
 
        /*
         * Create sysfs files for each GPU:
@@ -521,63 +518,43 @@ static int kfd_procfs_add_sysfs_stats(struct kfd_process *p)
         */
        for (i = 0; i < p->n_pdds; i++) {
                struct kfd_process_device *pdd = p->pdds[i];
-               struct kobject *kobj_stats;
 
                snprintf(stats_dir_filename, MAX_SYSFS_FILENAME_LEN,
                                "stats_%u", pdd->dev->id);
-               kobj_stats = kfd_alloc_struct(kobj_stats);
-               if (!kobj_stats)
-                       return -ENOMEM;
+               pdd->kobj_stats = kfd_alloc_struct(pdd->kobj_stats);
+               if (!pdd->kobj_stats)
+                       return;
 
-               ret = kobject_init_and_add(kobj_stats,
-                                               &procfs_stats_type,
-                                               p->kobj,
-                                               stats_dir_filename);
+               ret = kobject_init_and_add(pdd->kobj_stats,
+                                          &procfs_stats_type,
+                                          p->kobj,
+                                          stats_dir_filename);
 
                if (ret) {
                        pr_warn("Creating KFD proc/stats_%s folder failed",
-                                       stats_dir_filename);
-                       kobject_put(kobj_stats);
-                       goto err;
+                               stats_dir_filename);
+                       kobject_put(pdd->kobj_stats);
+                       pdd->kobj_stats = NULL;
+                       return;
                }
 
-               pdd->kobj_stats = kobj_stats;
-               pdd->attr_evict.name = "evicted_ms";
-               pdd->attr_evict.mode = KFD_SYSFS_FILE_MODE;
-               sysfs_attr_init(&pdd->attr_evict);
-               ret = sysfs_create_file(kobj_stats, &pdd->attr_evict);
-               if (ret)
-                       pr_warn("Creating eviction stats for gpuid %d failed",
-                                       (int)pdd->dev->id);
-
+               kfd_sysfs_create_file(pdd->kobj_stats, &pdd->attr_evict,
+                                     "evicted_ms");
                /* Add sysfs file to report compute unit occupancy */
-               if (pdd->dev->kfd2kgd->get_cu_occupancy != NULL) {
-                       pdd->attr_cu_occupancy.name = "cu_occupancy";
-                       pdd->attr_cu_occupancy.mode = KFD_SYSFS_FILE_MODE;
-                       sysfs_attr_init(&pdd->attr_cu_occupancy);
-                       ret = sysfs_create_file(kobj_stats,
-                                               &pdd->attr_cu_occupancy);
-                       if (ret)
-                               pr_warn("Creating %s failed for gpuid: %d",
-                                       pdd->attr_cu_occupancy.name,
-                                       (int)pdd->dev->id);
-               }
+               if (pdd->dev->kfd2kgd->get_cu_occupancy)
+                       kfd_sysfs_create_file(pdd->kobj_stats,
+                                             &pdd->attr_cu_occupancy,
+                                             "cu_occupancy");
        }
-err:
-       return ret;
 }
 
 
-static int kfd_procfs_add_sysfs_files(struct kfd_process *p)
+static void kfd_procfs_add_sysfs_files(struct kfd_process *p)
 {
-       int ret = 0;
        int i;
 
-       if (!p)
-               return -EINVAL;
-
-       if (!p->kobj)
-               return -EFAULT;
+       if (!p || !p->kobj)
+               return;
 
        /*
         * Create sysfs files for each GPU:
@@ -589,20 +566,14 @@ static int kfd_procfs_add_sysfs_files(struct kfd_process *p)
 
                snprintf(pdd->vram_filename, MAX_SYSFS_FILENAME_LEN, "vram_%u",
                         pdd->dev->id);
-               ret = kfd_sysfs_create_file(p, &pdd->attr_vram, pdd->vram_filename);
-               if (ret)
-                       pr_warn("Creating vram usage for gpu id %d failed",
-                               (int)pdd->dev->id);
+               kfd_sysfs_create_file(p->kobj, &pdd->attr_vram,
+                                     pdd->vram_filename);
 
                snprintf(pdd->sdma_filename, MAX_SYSFS_FILENAME_LEN, "sdma_%u",
                         pdd->dev->id);
-               ret = kfd_sysfs_create_file(p, &pdd->attr_sdma, pdd->sdma_filename);
-               if (ret)
-                       pr_warn("Creating sdma usage for gpu id %d failed",
-                               (int)pdd->dev->id);
+               kfd_sysfs_create_file(p->kobj, &pdd->attr_sdma,
+                                           pdd->sdma_filename);
        }
-
-       return ret;
 }
 
 void kfd_procfs_del_queue(struct queue *q)
@@ -800,28 +771,16 @@ struct kfd_process *kfd_create_process(struct file *filep)
                        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);
+               kfd_sysfs_create_file(process->kobj, &process->attr_pasid,
+                                     "pasid");
 
                process->kobj_queues = kobject_create_and_add("queues",
                                                        process->kobj);
                if (!process->kobj_queues)
                        pr_warn("Creating KFD proc/queues folder failed");
 
-               ret = kfd_procfs_add_sysfs_stats(process);
-               if (ret)
-                       pr_warn("Creating sysfs stats dir for pid %d failed",
-                               (int)process->lead_thread->pid);
-
-               ret = kfd_procfs_add_sysfs_files(process);
-               if (ret)
-                       pr_warn("Creating sysfs usage file for pid %d failed",
-                               (int)process->lead_thread->pid);
+               kfd_procfs_add_sysfs_stats(process);
+               kfd_procfs_add_sysfs_files(process);
        }
 out:
        if (!IS_ERR(process))