]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/amd/pm: Make use of __free for cleanup
authorLijo Lazar <lijo.lazar@amd.com>
Mon, 18 Aug 2025 06:14:28 +0000 (11:44 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 29 Aug 2025 14:11:55 +0000 (10:11 -0400)
Use __free(kfree) for memory alloc cleanups in SMUv13.0.6

Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c

index fe2d48dc47afaecf88ad3dd51b766abb4b85ab23..e37b7b5358ea2ec1fdd016ee1ce73e3d2e421343 100644 (file)
@@ -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,37 +559,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;
 }
 
@@ -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);
 }