[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