The acpi_get_table() should be coupled with acpi_put_table() if
the mapped table is not used at runtime to release the table
mapping.

In kfd_create_crat_image_acpi(), crat_table is copied to pcrat_image,
and in kfd_create_vcrat_image_cpu(), the acpi_table is only used to
get the OEM info, so those table mappings need to be release after
using it.

Signed-off-by: Hanjun Guo <[email protected]>
---
 drivers/gpu/drm/amd/amdkfd/kfd_crat.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
index 1009a3b..d378e61 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
@@ -756,6 +756,7 @@ int kfd_create_crat_image_acpi(void **crat_image, size_t 
*size)
        struct acpi_table_header *crat_table;
        acpi_status status;
        void *pcrat_image;
+       int rc = 0;
 
        if (!crat_image)
                return -EINVAL;
@@ -776,17 +777,21 @@ int kfd_create_crat_image_acpi(void **crat_image, size_t 
*size)
 
        if (ignore_crat) {
                pr_info("CRAT table disabled by module option\n");
-               return -ENODATA;
+               rc = -ENODATA;
+               goto out;
        }
 
        pcrat_image = kmemdup(crat_table, crat_table->length, GFP_KERNEL);
-       if (!pcrat_image)
-               return -ENOMEM;
+       if (!pcrat_image) {
+               rc = -ENOMEM;
+               goto out;
+       }
 
        *crat_image = pcrat_image;
        *size = crat_table->length;
-
-       return 0;
+out:
+       acpi_put_table(crat_table);
+       return rc;
 }
 
 /* Memory required to create Virtual CRAT.
@@ -970,6 +975,7 @@ static int kfd_create_vcrat_image_cpu(void *pcrat_image, 
size_t *size)
                                CRAT_OEMID_LENGTH);
                memcpy(crat_table->oem_table_id, acpi_table->oem_table_id,
                                CRAT_OEMTABLEID_LENGTH);
+               acpi_put_table(acpi_table);
        }
        crat_table->total_entries = 0;
        crat_table->num_domains = 0;
-- 
1.7.12.4

Reply via email to