Commit c4cb773c authored by Hanjun Guo's avatar Hanjun Guo Committed by Alex Deucher
Browse files

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: 174de876 ("drm/amdkfd: Group up CRAT related functions")
Fixes: 520b8fb7 ("drm/amdkfd: Add topology support for CPUs")
Signed-off-by: default avatarHanjun Guo <guohanjun@huawei.com>
Reviewed-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 1cb02795
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -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;