[PATCH v2] drm/amd/pm: Make use of __free for cleanup
Alex Deucher
alexdeucher at gmail.com
Thu Aug 21 13:11:00 UTC 2025
On Mon, Aug 18, 2025 at 3:44 AM Lijo Lazar <lijo.lazar at amd.com> wrote:
>
> Use __free(kfree) for memory alloc cleanups in SMUv13.0.6
>
> Signed-off-by: Lijo Lazar <lijo.lazar at amd.com>
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> v2: Use __free in metrics related functions also.
>
> .../drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c | 63 ++++++++-----------
> 1 file changed, 25 insertions(+), 38 deletions(-)
>
> 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 627a8188d868..b5d1b2427c3c 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
> @@ -535,6 +535,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;
> @@ -553,37 +556,32 @@ 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;
> }
>
> @@ -2619,9 +2617,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;
> @@ -2646,17 +2644,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;
> @@ -2727,8 +2722,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);
> }
> @@ -2739,31 +2732,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;
> @@ -2949,7 +2937,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);
> }
> --
> 2.49.0
>
More information about the amd-gfx
mailing list