[PATCH v2] drm/amd/pm: Make use of __free for cleanup

Lazar, Lijo Lijo.Lazar at amd.com
Thu Aug 21 13:04:33 UTC 2025


[Public]

<ping>

Thanks,
Lijo
-----Original Message-----
From: amd-gfx <amd-gfx-bounces at lists.freedesktop.org> On Behalf Of Lijo Lazar
Sent: Monday, August 18, 2025 1:05 PM
To: amd-gfx at lists.freedesktop.org
Cc: Zhang, Hawking <Hawking.Zhang at amd.com>; Deucher, Alexander <Alexander.Deucher at amd.com>; Kamal, Asad <Asad.Kamal at amd.com>
Subject: [PATCH v2] drm/amd/pm: Make use of __free for cleanup

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

Signed-off-by: Lijo Lazar <lijo.lazar 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