Re: [PATCH 2/2] drm/radeon: Add the missed acpi_put_table() to fix memory leak

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Applied.  Thanks

On Fri, Nov 4, 2022 at 6:05 AM Hanjun Guo <guohanjun@xxxxxxxxxx> wrote:
>
> When the radeon driver reads the bios information from ACPI
> table in radeon_acpi_vfct_bios(), it misses to call acpi_put_table()
> to release the ACPI memory after the init, so add acpi_put_table()
> properly to fix the memory leak.
>
> Fixes: 268ba0a99f89 ("drm/radeon: implement ACPI VFCT vbios fetch (v3)")
> Signed-off-by: Hanjun Guo <guohanjun@xxxxxxxxxx>
> ---
>  drivers/gpu/drm/radeon/radeon_bios.c | 18 +++++++++++-------
>  1 file changed, 11 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon_bios.c b/drivers/gpu/drm/radeon/radeon_bios.c
> index 520d1d6..16730c1 100644
> --- a/drivers/gpu/drm/radeon/radeon_bios.c
> +++ b/drivers/gpu/drm/radeon/radeon_bios.c
> @@ -612,13 +612,14 @@ static bool radeon_acpi_vfct_bios(struct radeon_device *rdev)
>         acpi_size tbl_size;
>         UEFI_ACPI_VFCT *vfct;
>         unsigned long offset;
> +       bool r = false;
>
>         if (!ACPI_SUCCESS(acpi_get_table("VFCT", 1, &hdr)))
>                 return false;
>         tbl_size = hdr->length;
>         if (tbl_size < sizeof(UEFI_ACPI_VFCT)) {
>                 DRM_ERROR("ACPI VFCT table present but broken (too short #1)\n");
> -               return false;
> +               goto out;
>         }
>
>         vfct = (UEFI_ACPI_VFCT *)hdr;
> @@ -631,13 +632,13 @@ static bool radeon_acpi_vfct_bios(struct radeon_device *rdev)
>                 offset += sizeof(VFCT_IMAGE_HEADER);
>                 if (offset > tbl_size) {
>                         DRM_ERROR("ACPI VFCT image header truncated\n");
> -                       return false;
> +                       goto out;
>                 }
>
>                 offset += vhdr->ImageLength;
>                 if (offset > tbl_size) {
>                         DRM_ERROR("ACPI VFCT image truncated\n");
> -                       return false;
> +                       goto out;
>                 }
>
>                 if (vhdr->ImageLength &&
> @@ -649,15 +650,18 @@ static bool radeon_acpi_vfct_bios(struct radeon_device *rdev)
>                         rdev->bios = kmemdup(&vbios->VbiosContent,
>                                              vhdr->ImageLength,
>                                              GFP_KERNEL);
> +                       if (rdev->bios)
> +                          r = true;
>
> -                       if (!rdev->bios)
> -                               return false;
> -                       return true;
> +                       goto out;
>                 }
>         }
>
>         DRM_ERROR("ACPI VFCT table present but broken (too short #2)\n");
> -       return false;
> +
> +out:
> +       acpi_put_table(hdr);
> +       return r;
>  }
>  #else
>  static inline bool radeon_acpi_vfct_bios(struct radeon_device *rdev)
> --
> 1.7.12.4
>



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux