In amdgpu_get_xgmi_hive(), we should not call kfree() after
kobject_put() as the PUT will call kfree(). Besides, we should
not call kobject_get() again for the new *alloced* as its
refcount will be initialized to 1 for the returned *hive*.

In amdgpu_device_ip_init(), we need to check the returned *hive*
which can be NULL before we dereference it.

Signed-off-by: Liang He <win...@126.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 5 +++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c   | 4 ----
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index f1e9663b4051..00976e15b698 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -2462,6 +2462,11 @@ static int amdgpu_device_ip_init(struct amdgpu_device 
*adev)
                        if (!amdgpu_sriov_vf(adev)) {
                                struct amdgpu_hive_info *hive = 
amdgpu_get_xgmi_hive(adev);
 
+                               if (WARN_ON(!hive)) {
+                                       r = -ENOENT;
+                                       goto init_failed;
+                               }
+
                                if (!hive->reset_domain ||
                                    
!amdgpu_reset_get_reset_domain(hive->reset_domain)) {
                                        r = -ENOENT;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
index 47159e9a0884..26adc7293468 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
@@ -386,7 +386,6 @@ struct amdgpu_hive_info *amdgpu_get_xgmi_hive(struct 
amdgpu_device *adev)
        if (ret) {
                dev_err(adev->dev, "XGMI: failed initializing kobject for xgmi 
hive\n");
                kobject_put(&hive->kobj);
-               kfree(hive);
                hive = NULL;
                goto pro_end;
        }
@@ -410,7 +409,6 @@ struct amdgpu_hive_info *amdgpu_get_xgmi_hive(struct 
amdgpu_device *adev)
                                dev_err(adev->dev, "XGMI: failed initializing 
reset domain for xgmi hive\n");
                                ret = -ENOMEM;
                                kobject_put(&hive->kobj);
-                               kfree(hive);
                                hive = NULL;
                                goto pro_end;
                        }
@@ -437,8 +435,6 @@ struct amdgpu_hive_info *amdgpu_get_xgmi_hive(struct 
amdgpu_device *adev)
        list_add_tail(&hive->node, &xgmi_hive_list);
 
 pro_end:
-       if (hive)
-               kobject_get(&hive->kobj);
        mutex_unlock(&xgmi_mutex);
        return hive;
 }
-- 
2.25.1

Reply via email to