drm/amdgpu/sdma: add missing release_firmware() in amdgpu_sdma_init_microcode()
authorYang Yingliang <yangyingliang@huawei.com>
Thu, 29 Sep 2022 14:20:15 +0000 (22:20 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 6 Oct 2022 16:05:01 +0000 (12:05 -0400)
In some error path in amdgpu_sdma_init_microcode(), release_firmware() is
not called, the memory allocated in request_firmware() will be leaked,
calling amdgpu_sdma_destroy_inst_ctx() which calls release_firmware() to
avoid memory leak.

Fixes: 15aa13056d11da ("drm/amdgpu: add function to init SDMA microcode")
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c

index 3949b7e..43cf863 100644 (file)
@@ -222,8 +222,10 @@ int amdgpu_sdma_init_microcode(struct amdgpu_device *adev,
                adev->sdma.instance[instance].fw->data;
        version_major = le16_to_cpu(header->header_version_major);
 
-       if ((duplicate && instance) || (!duplicate && version_major > 1))
-               return -EINVAL;
+       if ((duplicate && instance) || (!duplicate && version_major > 1)) {
+               err = -EINVAL;
+               goto out;
+       }
 
        err = amdgpu_sdma_init_inst_ctx(&adev->sdma.instance[instance]);
        if (err)
@@ -272,7 +274,7 @@ int amdgpu_sdma_init_microcode(struct amdgpu_device *adev,
                                ALIGN(le32_to_cpu(sdma_hdr->ctl_ucode_size_bytes), PAGE_SIZE);
                        break;
                default:
-                       return -EINVAL;
+                       err = -EINVAL;
                }
        }