diff mbox series

[-next] drm/amdgpu/sdma: add missing release_firmware() in amdgpu_sdma_init_microcode()

Message ID 20220929142015.746674-1-yangyingliang@huawei.com (mailing list archive)
State New, archived
Headers show
Series [-next] drm/amdgpu/sdma: add missing release_firmware() in amdgpu_sdma_init_microcode() | expand

Commit Message

Yang Yingliang Sept. 29, 2022, 2:20 p.m. UTC
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: 60704abdddd9 ("drm/amdgpu: add function to init SDMA microcode")
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

Comments

Alex Deucher Sept. 30, 2022, 2:53 p.m. UTC | #1
Applied.  Thanks.

On Thu, Sep 29, 2022 at 10:04 AM Yang Yingliang
<yangyingliang@huawei.com> wrote:
>
> 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: 60704abdddd9 ("drm/amdgpu: add function to init SDMA microcode")
> Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
> index 3949b7e3907f..43cf8632cc1a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
> @@ -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;
>                 }
>         }
>
> --
> 2.25.1
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
index 3949b7e3907f..43cf8632cc1a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
@@ -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;
 		}
 	}