| From c53a9fd5237a5e2357227d85ef17fe9ada3fb279 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 13 Jun 2020 14:32:26 -0500 |
| Subject: drm/amdkfd: Fix reference count leaks. |
| |
| From: Qiushi Wu <wu000273@umn.edu> |
| |
| [ Upstream commit 20eca0123a35305e38b344d571cf32768854168c ] |
| |
| kobject_init_and_add() takes reference even when it fails. |
| If this function returns an error, kobject_put() must be called to |
| properly clean up the memory associated with the object. |
| |
| Signed-off-by: Qiushi Wu <wu000273@umn.edu> |
| Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> |
| Signed-off-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_topology.c | 20 +++++++++++++++----- |
| 1 file changed, 15 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c |
| index 8c6e47c5507fb..74221e096855d 100644 |
| --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c |
| +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c |
| @@ -841,8 +841,10 @@ static int kfd_build_sysfs_node_entry(struct kfd_topology_device *dev, |
| |
| ret = kobject_init_and_add(dev->kobj_node, &node_type, |
| sys_props.kobj_nodes, "%d", id); |
| - if (ret < 0) |
| + if (ret < 0) { |
| + kobject_put(dev->kobj_node); |
| return ret; |
| + } |
| |
| dev->kobj_mem = kobject_create_and_add("mem_banks", dev->kobj_node); |
| if (!dev->kobj_mem) |
| @@ -885,8 +887,10 @@ static int kfd_build_sysfs_node_entry(struct kfd_topology_device *dev, |
| return -ENOMEM; |
| ret = kobject_init_and_add(mem->kobj, &mem_type, |
| dev->kobj_mem, "%d", i); |
| - if (ret < 0) |
| + if (ret < 0) { |
| + kobject_put(mem->kobj); |
| return ret; |
| + } |
| |
| mem->attr.name = "properties"; |
| mem->attr.mode = KFD_SYSFS_FILE_MODE; |
| @@ -904,8 +908,10 @@ static int kfd_build_sysfs_node_entry(struct kfd_topology_device *dev, |
| return -ENOMEM; |
| ret = kobject_init_and_add(cache->kobj, &cache_type, |
| dev->kobj_cache, "%d", i); |
| - if (ret < 0) |
| + if (ret < 0) { |
| + kobject_put(cache->kobj); |
| return ret; |
| + } |
| |
| cache->attr.name = "properties"; |
| cache->attr.mode = KFD_SYSFS_FILE_MODE; |
| @@ -923,8 +929,10 @@ static int kfd_build_sysfs_node_entry(struct kfd_topology_device *dev, |
| return -ENOMEM; |
| ret = kobject_init_and_add(iolink->kobj, &iolink_type, |
| dev->kobj_iolink, "%d", i); |
| - if (ret < 0) |
| + if (ret < 0) { |
| + kobject_put(iolink->kobj); |
| return ret; |
| + } |
| |
| iolink->attr.name = "properties"; |
| iolink->attr.mode = KFD_SYSFS_FILE_MODE; |
| @@ -976,8 +984,10 @@ static int kfd_topology_update_sysfs(void) |
| ret = kobject_init_and_add(sys_props.kobj_topology, |
| &sysprops_type, &kfd_device->kobj, |
| "topology"); |
| - if (ret < 0) |
| + if (ret < 0) { |
| + kobject_put(sys_props.kobj_topology); |
| return ret; |
| + } |
| |
| sys_props.kobj_nodes = kobject_create_and_add("nodes", |
| sys_props.kobj_topology); |
| -- |
| 2.25.1 |
| |