Commit edc9d17e authored by Lijo Lazar's avatar Lijo Lazar Committed by Alex Deucher
Browse files

drm/amd/pm: Make use of __free for cleanup



Use __free(kfree) for memory alloc cleanups in SMUv13.0.6

Signed-off-by: default avatarLijo Lazar <lijo.lazar@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 9c044228
Loading
Loading
Loading
Loading
+25 −38
Original line number Diff line number Diff line
@@ -538,6 +538,9 @@ static int smu_v13_0_6_tables_init(struct smu_context *smu)
{
	struct smu_table_context *smu_table = &smu->smu_table;
	struct smu_table *tables = smu_table->tables;
	void *gpu_metrics_table __free(kfree) = NULL;
	void *driver_pptable __free(kfree) = NULL;
	void *metrics_table __free(kfree) = NULL;
	struct amdgpu_device *adev = smu->adev;
	int gpu_metrcs_size = METRICS_TABLE_SIZE;
	int ret;
@@ -556,36 +559,31 @@ static int smu_v13_0_6_tables_init(struct smu_context *smu)
		       PAGE_SIZE,
		       AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT);

	smu_table->metrics_table = kzalloc(METRICS_TABLE_SIZE, GFP_KERNEL);
	if (!smu_table->metrics_table)
	metrics_table = kzalloc(METRICS_TABLE_SIZE, GFP_KERNEL);
	if (!metrics_table)
		return -ENOMEM;
	smu_table->metrics_time = 0;

	smu_table->gpu_metrics_table_size = sizeof(struct gpu_metrics_v1_8);
	smu_table->gpu_metrics_table =
	gpu_metrics_table =
		kzalloc(smu_table->gpu_metrics_table_size, GFP_KERNEL);
	if (!smu_table->gpu_metrics_table) {
		kfree(smu_table->metrics_table);
	if (!gpu_metrics_table)
		return -ENOMEM;
	}

	smu_table->driver_pptable =
		kzalloc(sizeof(struct PPTable_t), GFP_KERNEL);
	if (!smu_table->driver_pptable) {
		kfree(smu_table->metrics_table);
		kfree(smu_table->gpu_metrics_table);
	driver_pptable = kzalloc(sizeof(struct PPTable_t), GFP_KERNEL);
	if (!driver_pptable)
		return -ENOMEM;
	}

	if (amdgpu_ip_version(smu->adev, MP1_HWIP, 0) ==
	    IP_VERSION(13, 0, 12)) {
		ret = smu_v13_0_12_tables_init(smu);
		if (ret) {
			kfree(smu_table->metrics_table);
			kfree(smu_table->gpu_metrics_table);
		if (ret)
			return ret;
	}
	}

	smu_table->gpu_metrics_table = no_free_ptr(gpu_metrics_table);
	smu_table->metrics_table = no_free_ptr(metrics_table);
	smu_table->driver_pptable = no_free_ptr(driver_pptable);

	return 0;
}
@@ -2622,9 +2620,9 @@ static ssize_t smu_v13_0_6_get_xcp_metrics(struct smu_context *smu, int xcp_id,
	const u8 num_jpeg_rings = AMDGPU_MAX_JPEG_RINGS_4_0_3;
	int version = smu_v13_0_6_get_metrics_version(smu);
	struct amdgpu_partition_metrics_v1_0 *xcp_metrics;
	MetricsTableV0_t *metrics_v0 __free(kfree) = NULL;
	struct amdgpu_device *adev = smu->adev;
	int ret, inst, i, j, k, idx;
	MetricsTableV0_t *metrics_v0;
	MetricsTableV1_t *metrics_v1;
	MetricsTableV2_t *metrics_v2;
	struct amdgpu_xcp *xcp;
@@ -2649,17 +2647,14 @@ static ssize_t smu_v13_0_6_get_xcp_metrics(struct smu_context *smu, int xcp_id,
		return -ENOMEM;

	ret = smu_v13_0_6_get_metrics_table(smu, metrics_v0, false);
	if (ret) {
		kfree(metrics_v0);
	if (ret)
		return ret;
	}

	if (amdgpu_ip_version(smu->adev, MP1_HWIP, 0) ==
		    IP_VERSION(13, 0, 12) &&
	    smu_v13_0_6_cap_supported(smu, SMU_CAP(STATIC_METRICS))) {
		ret = smu_v13_0_12_get_xcp_metrics(smu, xcp, table, metrics_v0);
		goto out;
	}
	    smu_v13_0_6_cap_supported(smu, SMU_CAP(STATIC_METRICS)))
		return smu_v13_0_12_get_xcp_metrics(smu, xcp, table,
						    metrics_v0);

	metrics_v1 = (MetricsTableV1_t *)metrics_v0;
	metrics_v2 = (MetricsTableV2_t *)metrics_v0;
@@ -2730,8 +2725,6 @@ static ssize_t smu_v13_0_6_get_xcp_metrics(struct smu_context *smu, int xcp_id,
			idx++;
		}
	}
out:
	kfree(metrics_v0);

	return sizeof(*xcp_metrics);
}
@@ -2742,31 +2735,26 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table
	struct gpu_metrics_v1_8 *gpu_metrics =
		(struct gpu_metrics_v1_8 *)smu_table->gpu_metrics_table;
	int version = smu_v13_0_6_get_metrics_version(smu);
	MetricsTableV0_t *metrics_v0 __free(kfree) = NULL;
	int ret = 0, xcc_id, inst, i, j, k, idx;
	struct amdgpu_device *adev = smu->adev;
	MetricsTableV0_t *metrics_v0;
	MetricsTableV1_t *metrics_v1;
	MetricsTableV2_t *metrics_v2;
	struct amdgpu_xcp *xcp;
	u16 link_width_level;
	ssize_t num_bytes;
	u8 num_jpeg_rings;
	u32 inst_mask;
	bool per_inst;

	metrics_v0 = kzalloc(METRICS_TABLE_SIZE, GFP_KERNEL);
	ret = smu_v13_0_6_get_metrics_table(smu, metrics_v0, false);
	if (ret) {
		kfree(metrics_v0);
	if (ret)
		return ret;
	}

	if (amdgpu_ip_version(smu->adev, MP1_HWIP, 0) == IP_VERSION(13, 0, 12) &&
	    smu_v13_0_6_cap_supported(smu, SMU_CAP(STATIC_METRICS))) {
		num_bytes = smu_v13_0_12_get_gpu_metrics(smu, table, metrics_v0);
		kfree(metrics_v0);
		return num_bytes;
	}
	if (amdgpu_ip_version(smu->adev, MP1_HWIP, 0) ==
		    IP_VERSION(13, 0, 12) &&
	    smu_v13_0_6_cap_supported(smu, SMU_CAP(STATIC_METRICS)))
		return smu_v13_0_12_get_gpu_metrics(smu, table, metrics_v0);

	metrics_v1 = (MetricsTableV1_t *)metrics_v0;
	metrics_v2 = (MetricsTableV2_t *)metrics_v0;
@@ -2952,7 +2940,6 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table
	gpu_metrics->firmware_timestamp = GET_METRIC_FIELD(Timestamp, version);

	*table = (void *)gpu_metrics;
	kfree(metrics_v0);

	return sizeof(*gpu_metrics);
}