| From 6cb2941170a29630146c0b9de31afd01a762e943 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 21 Jun 2021 18:51:26 -0400 |
| Subject: drm/amdkfd: fix sysfs kobj leak |
| |
| From: Philip Yang <Philip.Yang@amd.com> |
| |
| [ Upstream commit dcdb4d904b4bd3078fe8d4d24b1658560d6078ef ] |
| |
| 3 cases of kobj leak, which causes memory leak: |
| |
| kobj_type must have release() method to free memory from release |
| callback. Don't need NULL default_attrs to init kobj. |
| |
| sysfs files created under kobj_status should be removed with kobj_status |
| as parent kobject. |
| |
| Remove queue sysfs files when releasing queue from process MMU notifier |
| release callback. |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/amd/amdkfd/kfd_process.c | 14 ++++++-------- |
| .../gpu/drm/amd/amdkfd/kfd_process_queue_manager.c | 1 + |
| 2 files changed, 7 insertions(+), 8 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c |
| index 65803e153a22..d243e60c6eef 100644 |
| --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c |
| +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c |
| @@ -452,13 +452,9 @@ static const struct sysfs_ops procfs_stats_ops = { |
| .show = kfd_procfs_stats_show, |
| }; |
| |
| -static struct attribute *procfs_stats_attrs[] = { |
| - NULL |
| -}; |
| - |
| static struct kobj_type procfs_stats_type = { |
| .sysfs_ops = &procfs_stats_ops, |
| - .default_attrs = procfs_stats_attrs, |
| + .release = kfd_procfs_kobj_release, |
| }; |
| |
| int kfd_procfs_add_queue(struct queue *q) |
| @@ -973,9 +969,11 @@ static void kfd_process_wq_release(struct work_struct *work) |
| list_for_each_entry(pdd, &p->per_device_data, per_device_list) { |
| sysfs_remove_file(p->kobj, &pdd->attr_vram); |
| sysfs_remove_file(p->kobj, &pdd->attr_sdma); |
| - sysfs_remove_file(p->kobj, &pdd->attr_evict); |
| - if (pdd->dev->kfd2kgd->get_cu_occupancy != NULL) |
| - sysfs_remove_file(p->kobj, &pdd->attr_cu_occupancy); |
| + |
| + sysfs_remove_file(pdd->kobj_stats, &pdd->attr_evict); |
| + if (pdd->dev->kfd2kgd->get_cu_occupancy) |
| + sysfs_remove_file(pdd->kobj_stats, |
| + &pdd->attr_cu_occupancy); |
| kobject_del(pdd->kobj_stats); |
| kobject_put(pdd->kobj_stats); |
| pdd->kobj_stats = NULL; |
| diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c |
| index eb1635ac8988..43c07ac2c6fc 100644 |
| --- a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c |
| +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c |
| @@ -153,6 +153,7 @@ void pqm_uninit(struct process_queue_manager *pqm) |
| if (pqn->q && pqn->q->gws) |
| amdgpu_amdkfd_remove_gws_from_process(pqm->process->kgd_process_info, |
| pqn->q->gws); |
| + kfd_procfs_del_queue(pqn->q); |
| uninit_queue(pqn->q); |
| list_del(&pqn->process_queue_list); |
| kfree(pqn); |
| -- |
| 2.30.2 |
| |