Skip to content

Commit d61c269

Browse files
lukaszluba-armrafaeljw
authored andcommitted
PM: EM: Refactor em_adjust_new_capacity()
Extract em_table_dup() and em_recalc_and_update() from em_adjust_new_capacity(). Both functions will be later reused by the 'update EM due to chip binning' functionality. Reviewed-by: Dietmar Eggemann <dietmar.eggemann@arm.com> Signed-off-by: Lukasz Luba <lukasz.luba@arm.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
1 parent e3ac0f3 commit d61c269

File tree

1 file changed

+39
-19
lines changed

1 file changed

+39
-19
lines changed

kernel/power/energy_model.c

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -674,23 +674,15 @@ void em_dev_unregister_perf_domain(struct device *dev)
674674
}
675675
EXPORT_SYMBOL_GPL(em_dev_unregister_perf_domain);
676676

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)
684678
{
685679
struct em_perf_table __rcu *em_table;
686680
struct em_perf_state *ps, *new_ps;
687-
int ret, ps_size;
681+
int ps_size;
688682

689683
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;
694686

695687
new_ps = em_table->state;
696688

@@ -702,24 +694,52 @@ static void em_adjust_new_capacity(struct device *dev,
702694

703695
rcu_read_unlock();
704696

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,
707706
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;
712709

713710
ret = em_dev_update_perf_domain(dev, em_table);
714711
if (ret)
715-
dev_warn(dev, "EM: update failed %d\n", ret);
712+
goto free_em_table;
716713

717714
/*
718715
* This is one-time-update, so give up the ownership in this updater.
719716
* The EM framework has incremented the usage counter and from now
720717
* will keep the reference (then free the memory when needed).
721718
*/
719+
free_em_table:
722720
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);
723743
}
724744

725745
static void em_check_capacity_update(void)

0 commit comments

Comments
 (0)