]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
drm/amdkfd: fix sysfs kobj leak
authorPhilip Yang <Philip.Yang@amd.com>
Mon, 21 Jun 2021 22:51:26 +0000 (18:51 -0400)
committerStefan Bader <stefan.bader@canonical.com>
Mon, 20 Sep 2021 13:40:09 +0000 (15:40 +0200)
BugLink: https://bugs.launchpad.net/bugs/1939738
[ 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>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
drivers/gpu/drm/amd/amdkfd/kfd_process.c
drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c

index 65803e153a223d1536522042503c45dd5251ee8b..d243e60c6eef779c216d8b591f3535c442952829 100644 (file)
@@ -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;
index eb1635ac89887c18534e1ce1e969469386fcbf45..43c07ac2c6fce4056b1328c1f0dc9574190b8d14 100644 (file)
@@ -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);