@@ -538,6 +538,9 @@ static int smu_v13_0_6_tables_init(struct smu_context *smu)
538538{
539539 struct smu_table_context * smu_table = & smu -> smu_table ;
540540 struct smu_table * tables = smu_table -> tables ;
541+ void * gpu_metrics_table __free (kfree ) = NULL ;
542+ void * driver_pptable __free (kfree ) = NULL ;
543+ void * metrics_table __free (kfree ) = NULL ;
541544 struct amdgpu_device * adev = smu -> adev ;
542545 int gpu_metrcs_size = METRICS_TABLE_SIZE ;
543546 int ret ;
@@ -556,37 +559,32 @@ static int smu_v13_0_6_tables_init(struct smu_context *smu)
556559 PAGE_SIZE ,
557560 AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT );
558561
559- smu_table -> metrics_table = kzalloc (METRICS_TABLE_SIZE , GFP_KERNEL );
560- if (!smu_table -> metrics_table )
562+ metrics_table = kzalloc (METRICS_TABLE_SIZE , GFP_KERNEL );
563+ if (!metrics_table )
561564 return - ENOMEM ;
562565 smu_table -> metrics_time = 0 ;
563566
564567 smu_table -> gpu_metrics_table_size = sizeof (struct gpu_metrics_v1_8 );
565- smu_table -> gpu_metrics_table =
568+ gpu_metrics_table =
566569 kzalloc (smu_table -> gpu_metrics_table_size , GFP_KERNEL );
567- if (!smu_table -> gpu_metrics_table ) {
568- kfree (smu_table -> metrics_table );
570+ if (!gpu_metrics_table )
569571 return - ENOMEM ;
570- }
571572
572- smu_table -> driver_pptable =
573- kzalloc (sizeof (struct PPTable_t ), GFP_KERNEL );
574- if (!smu_table -> driver_pptable ) {
575- kfree (smu_table -> metrics_table );
576- kfree (smu_table -> gpu_metrics_table );
573+ driver_pptable = kzalloc (sizeof (struct PPTable_t ), GFP_KERNEL );
574+ if (!driver_pptable )
577575 return - ENOMEM ;
578- }
579576
580577 if (amdgpu_ip_version (smu -> adev , MP1_HWIP , 0 ) ==
581578 IP_VERSION (13 , 0 , 12 )) {
582579 ret = smu_v13_0_12_tables_init (smu );
583- if (ret ) {
584- kfree (smu_table -> metrics_table );
585- kfree (smu_table -> gpu_metrics_table );
580+ if (ret )
586581 return ret ;
587- }
588582 }
589583
584+ smu_table -> gpu_metrics_table = no_free_ptr (gpu_metrics_table );
585+ smu_table -> metrics_table = no_free_ptr (metrics_table );
586+ smu_table -> driver_pptable = no_free_ptr (driver_pptable );
587+
590588 return 0 ;
591589}
592590
@@ -2622,9 +2620,9 @@ static ssize_t smu_v13_0_6_get_xcp_metrics(struct smu_context *smu, int xcp_id,
26222620 const u8 num_jpeg_rings = AMDGPU_MAX_JPEG_RINGS_4_0_3 ;
26232621 int version = smu_v13_0_6_get_metrics_version (smu );
26242622 struct amdgpu_partition_metrics_v1_0 * xcp_metrics ;
2623+ MetricsTableV0_t * metrics_v0 __free (kfree ) = NULL ;
26252624 struct amdgpu_device * adev = smu -> adev ;
26262625 int ret , inst , i , j , k , idx ;
2627- MetricsTableV0_t * metrics_v0 ;
26282626 MetricsTableV1_t * metrics_v1 ;
26292627 MetricsTableV2_t * metrics_v2 ;
26302628 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,
26492647 return - ENOMEM ;
26502648
26512649 ret = smu_v13_0_6_get_metrics_table (smu , metrics_v0 , false);
2652- if (ret ) {
2653- kfree (metrics_v0 );
2650+ if (ret )
26542651 return ret ;
2655- }
26562652
26572653 if (amdgpu_ip_version (smu -> adev , MP1_HWIP , 0 ) ==
26582654 IP_VERSION (13 , 0 , 12 ) &&
2659- smu_v13_0_6_cap_supported (smu , SMU_CAP (STATIC_METRICS ))) {
2660- ret = smu_v13_0_12_get_xcp_metrics (smu , xcp , table , metrics_v0 );
2661- goto out ;
2662- }
2655+ smu_v13_0_6_cap_supported (smu , SMU_CAP (STATIC_METRICS )))
2656+ return smu_v13_0_12_get_xcp_metrics (smu , xcp , table ,
2657+ metrics_v0 );
26632658
26642659 metrics_v1 = (MetricsTableV1_t * )metrics_v0 ;
26652660 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,
27302725 idx ++ ;
27312726 }
27322727 }
2733- out :
2734- kfree (metrics_v0 );
27352728
27362729 return sizeof (* xcp_metrics );
27372730}
@@ -2742,31 +2735,26 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table
27422735 struct gpu_metrics_v1_8 * gpu_metrics =
27432736 (struct gpu_metrics_v1_8 * )smu_table -> gpu_metrics_table ;
27442737 int version = smu_v13_0_6_get_metrics_version (smu );
2738+ MetricsTableV0_t * metrics_v0 __free (kfree ) = NULL ;
27452739 int ret = 0 , xcc_id , inst , i , j , k , idx ;
27462740 struct amdgpu_device * adev = smu -> adev ;
2747- MetricsTableV0_t * metrics_v0 ;
27482741 MetricsTableV1_t * metrics_v1 ;
27492742 MetricsTableV2_t * metrics_v2 ;
27502743 struct amdgpu_xcp * xcp ;
27512744 u16 link_width_level ;
2752- ssize_t num_bytes ;
27532745 u8 num_jpeg_rings ;
27542746 u32 inst_mask ;
27552747 bool per_inst ;
27562748
27572749 metrics_v0 = kzalloc (METRICS_TABLE_SIZE , GFP_KERNEL );
27582750 ret = smu_v13_0_6_get_metrics_table (smu , metrics_v0 , false);
2759- if (ret ) {
2760- kfree (metrics_v0 );
2751+ if (ret )
27612752 return ret ;
2762- }
27632753
2764- if (amdgpu_ip_version (smu -> adev , MP1_HWIP , 0 ) == IP_VERSION (13 , 0 , 12 ) &&
2765- smu_v13_0_6_cap_supported (smu , SMU_CAP (STATIC_METRICS ))) {
2766- num_bytes = smu_v13_0_12_get_gpu_metrics (smu , table , metrics_v0 );
2767- kfree (metrics_v0 );
2768- return num_bytes ;
2769- }
2754+ if (amdgpu_ip_version (smu -> adev , MP1_HWIP , 0 ) ==
2755+ IP_VERSION (13 , 0 , 12 ) &&
2756+ smu_v13_0_6_cap_supported (smu , SMU_CAP (STATIC_METRICS )))
2757+ return smu_v13_0_12_get_gpu_metrics (smu , table , metrics_v0 );
27702758
27712759 metrics_v1 = (MetricsTableV1_t * )metrics_v0 ;
27722760 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
29522940 gpu_metrics -> firmware_timestamp = GET_METRIC_FIELD (Timestamp , version );
29532941
29542942 * table = (void * )gpu_metrics ;
2955- kfree (metrics_v0 );
29562943
29572944 return sizeof (* gpu_metrics );
29582945}
0 commit comments