@@ -674,23 +674,15 @@ void em_dev_unregister_perf_domain(struct device *dev)
674
674
}
675
675
EXPORT_SYMBOL_GPL (em_dev_unregister_perf_domain );
676
676
677
- /*
678
- * Adjustment of CPU performance values after boot, when all CPUs capacites
679
- * are correctly calculated.
680
- */
681
- static void em_adjust_new_capacity (struct device * dev ,
682
- struct em_perf_domain * pd ,
683
- u64 max_cap )
677
+ static struct em_perf_table __rcu * em_table_dup (struct em_perf_domain * pd )
684
678
{
685
679
struct em_perf_table __rcu * em_table ;
686
680
struct em_perf_state * ps , * new_ps ;
687
- int ret , ps_size ;
681
+ int ps_size ;
688
682
689
683
em_table = em_table_alloc (pd );
690
- if (!em_table ) {
691
- dev_warn (dev , "EM: allocation failed\n" );
692
- return ;
693
- }
684
+ if (!em_table )
685
+ return NULL ;
694
686
695
687
new_ps = em_table -> state ;
696
688
@@ -702,24 +694,52 @@ static void em_adjust_new_capacity(struct device *dev,
702
694
703
695
rcu_read_unlock ();
704
696
705
- em_init_performance (dev , pd , new_ps , pd -> nr_perf_states );
706
- ret = em_compute_costs (dev , new_ps , NULL , pd -> nr_perf_states ,
697
+ return em_table ;
698
+ }
699
+
700
+ static int em_recalc_and_update (struct device * dev , struct em_perf_domain * pd ,
701
+ struct em_perf_table __rcu * em_table )
702
+ {
703
+ int ret ;
704
+
705
+ ret = em_compute_costs (dev , em_table -> state , NULL , pd -> nr_perf_states ,
707
706
pd -> flags );
708
- if (ret ) {
709
- dev_warn (dev , "EM: compute costs failed\n" );
710
- return ;
711
- }
707
+ if (ret )
708
+ goto free_em_table ;
712
709
713
710
ret = em_dev_update_perf_domain (dev , em_table );
714
711
if (ret )
715
- dev_warn ( dev , "EM: update failed %d\n" , ret ) ;
712
+ goto free_em_table ;
716
713
717
714
/*
718
715
* This is one-time-update, so give up the ownership in this updater.
719
716
* The EM framework has incremented the usage counter and from now
720
717
* will keep the reference (then free the memory when needed).
721
718
*/
719
+ free_em_table :
722
720
em_table_free (em_table );
721
+ return ret ;
722
+ }
723
+
724
+ /*
725
+ * Adjustment of CPU performance values after boot, when all CPUs capacites
726
+ * are correctly calculated.
727
+ */
728
+ static void em_adjust_new_capacity (struct device * dev ,
729
+ struct em_perf_domain * pd ,
730
+ u64 max_cap )
731
+ {
732
+ struct em_perf_table __rcu * em_table ;
733
+
734
+ em_table = em_table_dup (pd );
735
+ if (!em_table ) {
736
+ dev_warn (dev , "EM: allocation failed\n" );
737
+ return ;
738
+ }
739
+
740
+ em_init_performance (dev , pd , em_table -> state , pd -> nr_perf_states );
741
+
742
+ em_recalc_and_update (dev , pd , em_table );
723
743
}
724
744
725
745
static void em_check_capacity_update (void )
0 commit comments