drm/amdkfd: Fix reference count leaks.
authorQiushi Wu <wu000273@umn.edu>
Sat, 13 Jun 2020 19:32:26 +0000 (14:32 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 1 Jul 2020 05:59:21 +0000 (01:59 -0400)
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>
drivers/gpu/drm/amd/amdkfd/kfd_topology.c

index 4025efc..cd18baf 100644 (file)
@@ -636,8 +636,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)
@@ -684,8 +686,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;
@@ -703,8 +707,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;
@@ -722,8 +728,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;
@@ -802,8 +810,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);