[PATCH v2] drm/amd/pm: Optimize get gpu metrics data function

Lazar, Lijo lijo.lazar at amd.com
Thu May 22 10:48:42 UTC 2025



On 5/22/2025 2:46 PM, Asad Kamal wrote:
> Optimize get gpu metrics data function for smu_v13_0_12 to
> allocate metrics structure only once
> 
> v2: Free and alloc moved to same function(Kevin)
> 
> Signed-off-by: Asad Kamal <asad.kamal at amd.com>
> Reviewed-by: Yang Wang <kevinyang.wang at amd.com>

Reviewed-by: Lijo Lazar <lijo.lazar at amd.com>

Thanks,
Lijo

> ---
>  drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c | 6 ++----
>  drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c  | 8 ++++++--
>  drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.h  | 2 +-
>  3 files changed, 9 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c
> index 5a8824cc1c63..411756a2e79f 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c
> +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c
> @@ -322,7 +322,7 @@ int smu_v13_0_12_get_smu_metrics_data(struct smu_context *smu,
>  	return ret;
>  }
>  
> -ssize_t smu_v13_0_12_get_gpu_metrics(struct smu_context *smu, void **table)
> +ssize_t smu_v13_0_12_get_gpu_metrics(struct smu_context *smu, void **table, void *smu_metrics)
>  {
>  	struct smu_table_context *smu_table = &smu->smu_table;
>  	struct gpu_metrics_v1_8 *gpu_metrics =
> @@ -334,8 +334,7 @@ ssize_t smu_v13_0_12_get_gpu_metrics(struct smu_context *smu, void **table)
>  	struct amdgpu_xcp *xcp;
>  	u32 inst_mask;
>  
> -	metrics = kzalloc(sizeof(MetricsTable_t), GFP_KERNEL);
> -	memcpy(metrics, smu_table->metrics_table, sizeof(MetricsTable_t));
> +	metrics = (MetricsTable_t *)smu_metrics;
>  
>  	smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 8);
>  
> @@ -477,7 +476,6 @@ ssize_t smu_v13_0_12_get_gpu_metrics(struct smu_context *smu, void **table)
>  	gpu_metrics->firmware_timestamp = metrics->Timestamp;
>  
>  	*table = (void *)gpu_metrics;
> -	kfree(metrics);
>  
>  	return sizeof(*gpu_metrics);
>  }
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
> index 78d831c20768..22dd3cf5a28d 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
> +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
> @@ -2660,6 +2660,7 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table
>  	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;
> @@ -2672,8 +2673,11 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table
>  	}
>  
>  	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);
> +	    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;
> +	}
>  
>  	metrics_v1 = (MetricsTableV1_t *)metrics_v0;
>  	metrics_v2 = (MetricsTableV2_t *)metrics_v0;
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.h b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.h
> index 1ccc150882eb..253c1cf9f386 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.h
> +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.h
> @@ -80,7 +80,7 @@ int smu_v13_0_12_get_max_metrics_size(void);
>  int smu_v13_0_12_setup_driver_pptable(struct smu_context *smu);
>  int smu_v13_0_12_get_smu_metrics_data(struct smu_context *smu,
>  				      MetricsMember_t member, uint32_t *value);
> -ssize_t smu_v13_0_12_get_gpu_metrics(struct smu_context *smu, void **table);
> +ssize_t smu_v13_0_12_get_gpu_metrics(struct smu_context *smu, void **table, void *smu_metrics);
>  extern const struct cmn2asic_mapping smu_v13_0_12_feature_mask_map[];
>  extern const struct cmn2asic_msg_mapping smu_v13_0_12_message_map[];
>  #endif



More information about the amd-gfx mailing list