]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/amdkfd: Put ACPI table after using it
authorHanjun Guo <guohanjun@huawei.com>
Fri, 13 Nov 2020 03:11:14 +0000 (11:11 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 13 Nov 2020 22:29:46 +0000 (17:29 -0500)
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 which can prevent the memory leak.

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 information, so those two table mappings need to be released
after using it.

Fixes: 174de876d6d0 ("drm/amdkfd: Group up CRAT related functions")
Fixes: 520b8fb755cc ("drm/amdkfd: Add topology support for CPUs")
Signed-off-by: Hanjun Guo <guohanjun@huawei.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_crat.c

index e0d354bd2d32d2d2ef73baea104c2d0811efb445..8cac497c2c459aa86421ddbce9eab12d6544ce03 100644 (file)
@@ -780,6 +780,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;
@@ -804,14 +805,17 @@ int kfd_create_crat_image_acpi(void **crat_image, size_t *size)
        }
 
        pcrat_image = kvmalloc(crat_table->length, GFP_KERNEL);
-       if (!pcrat_image)
-               return -ENOMEM;
+       if (!pcrat_image) {
+               rc = -ENOMEM;
+               goto out;
+       }
 
        memcpy(pcrat_image, crat_table, crat_table->length);
        *crat_image = pcrat_image;
        *size = crat_table->length;
-
-       return 0;
+out:
+       acpi_put_table(crat_table);
+       return rc;
 }
 
 /* Memory required to create Virtual CRAT.
@@ -994,6 +998,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;