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:
Philip Yang 2021-06-16 10:02:18 -04:00 коммит произвёл Alex Deucher
Родитель ff4b601a05
Коммит 75ae84c89b
1 изменённых файлов: 39 добавлений и 80 удалений

Просмотреть файл

@ -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))