drm/amdkfd: Put ACPI table after using it
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:174de876d6("drm/amdkfd: Group up CRAT related functions") Fixes:520b8fb755("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>
This commit is contained in:
@@ -780,6 +780,7 @@ int kfd_create_crat_image_acpi(void **crat_image, size_t *size)
|
|||||||
struct acpi_table_header *crat_table;
|
struct acpi_table_header *crat_table;
|
||||||
acpi_status status;
|
acpi_status status;
|
||||||
void *pcrat_image;
|
void *pcrat_image;
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
if (!crat_image)
|
if (!crat_image)
|
||||||
return -EINVAL;
|
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);
|
pcrat_image = kvmalloc(crat_table->length, GFP_KERNEL);
|
||||||
if (!pcrat_image)
|
if (!pcrat_image) {
|
||||||
return -ENOMEM;
|
rc = -ENOMEM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(pcrat_image, crat_table, crat_table->length);
|
memcpy(pcrat_image, crat_table, crat_table->length);
|
||||||
*crat_image = pcrat_image;
|
*crat_image = pcrat_image;
|
||||||
*size = crat_table->length;
|
*size = crat_table->length;
|
||||||
|
out:
|
||||||
return 0;
|
acpi_put_table(crat_table);
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Memory required to create Virtual CRAT.
|
/* 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);
|
CRAT_OEMID_LENGTH);
|
||||||
memcpy(crat_table->oem_table_id, acpi_table->oem_table_id,
|
memcpy(crat_table->oem_table_id, acpi_table->oem_table_id,
|
||||||
CRAT_OEMTABLEID_LENGTH);
|
CRAT_OEMTABLEID_LENGTH);
|
||||||
|
acpi_put_table(acpi_table);
|
||||||
}
|
}
|
||||||
crat_table->total_entries = 0;
|
crat_table->total_entries = 0;
|
||||||
crat_table->num_domains = 0;
|
crat_table->num_domains = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user