]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amd/pm: Optimize get gpu metrics data function
authorAsad Kamal <asad.kamal@amd.com>
Wed, 21 May 2025 11:17:50 +0000 (19:17 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 29 May 2025 14:56:50 +0000 (10:56 -0400)
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@amd.com>
Reviewed-by: Yang Wang <kevinyang.wang@amd.com>
Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.h

index 69f92bd35bf2e5937ce932d4de05a6498a24c38d..e0d356f93ab064058cba3573d0776c705d8b6466 100644 (file)
@@ -378,7 +378,7 @@ ssize_t smu_v13_0_12_get_xcp_metrics(struct smu_context *smu, struct amdgpu_xcp
        return sizeof(*xcp_metrics);
 }
 
-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 =
@@ -390,8 +390,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);
 
@@ -533,7 +532,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);
 }
index 0a9488576a4eb5fb423bc4412956b88c327bf2c6..271458b74f2de565cf5a607300eed1ca1a88d42f 100644 (file)
@@ -2669,6 +2669,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;
@@ -2681,8 +2682,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;
index 1a54675c576fbfd11b0c849512db0c71f30100e3..d38d6d76b1e79861345810f467131f2b2a61eaff 100644 (file)
@@ -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);
 ssize_t smu_v13_0_12_get_xcp_metrics(struct smu_context *smu,
                                     struct amdgpu_xcp *xcp, void *table,
                                     void *smu_metrics);