drm/amdkfd: add helper function for kfd sysfs create
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>
This commit is contained in:
Родитель
ff4b601a05
Коммит
75ae84c89b
|
@ -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))
|
||||
|
|
Загрузка…
Ссылка в новой задаче