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>
This commit is contained in:
Lukasz Luba 2024-04-03 16:49:05 +01:00 committed by Rafael J. Wysocki
parent e3ac0f367d
commit d61c2695bd

View File

@ -674,23 +674,15 @@ void em_dev_unregister_perf_domain(struct device *dev)
} }
EXPORT_SYMBOL_GPL(em_dev_unregister_perf_domain); EXPORT_SYMBOL_GPL(em_dev_unregister_perf_domain);
/* static struct em_perf_table __rcu *em_table_dup(struct em_perf_domain *pd)
* Adjustment of CPU performance values after boot, when all CPUs capacites
* are correctly calculated.
*/
static void em_adjust_new_capacity(struct device *dev,
struct em_perf_domain *pd,
u64 max_cap)
{ {
struct em_perf_table __rcu *em_table; struct em_perf_table __rcu *em_table;
struct em_perf_state *ps, *new_ps; struct em_perf_state *ps, *new_ps;
int ret, ps_size; int ps_size;
em_table = em_table_alloc(pd); em_table = em_table_alloc(pd);
if (!em_table) { if (!em_table)
dev_warn(dev, "EM: allocation failed\n"); return NULL;
return;
}
new_ps = em_table->state; new_ps = em_table->state;
@ -702,24 +694,52 @@ static void em_adjust_new_capacity(struct device *dev,
rcu_read_unlock(); rcu_read_unlock();
em_init_performance(dev, pd, new_ps, pd->nr_perf_states); return em_table;
ret = em_compute_costs(dev, new_ps, NULL, pd->nr_perf_states, }
static int em_recalc_and_update(struct device *dev, struct em_perf_domain *pd,
struct em_perf_table __rcu *em_table)
{
int ret;
ret = em_compute_costs(dev, em_table->state, NULL, pd->nr_perf_states,
pd->flags); pd->flags);
if (ret) { if (ret)
dev_warn(dev, "EM: compute costs failed\n"); goto free_em_table;
return;
}
ret = em_dev_update_perf_domain(dev, em_table); ret = em_dev_update_perf_domain(dev, em_table);
if (ret) if (ret)
dev_warn(dev, "EM: update failed %d\n", ret); goto free_em_table;
/* /*
* This is one-time-update, so give up the ownership in this updater. * This is one-time-update, so give up the ownership in this updater.
* The EM framework has incremented the usage counter and from now * The EM framework has incremented the usage counter and from now
* will keep the reference (then free the memory when needed). * will keep the reference (then free the memory when needed).
*/ */
free_em_table:
em_table_free(em_table); em_table_free(em_table);
return ret;
}
/*
* Adjustment of CPU performance values after boot, when all CPUs capacites
* are correctly calculated.
*/
static void em_adjust_new_capacity(struct device *dev,
struct em_perf_domain *pd,
u64 max_cap)
{
struct em_perf_table __rcu *em_table;
em_table = em_table_dup(pd);
if (!em_table) {
dev_warn(dev, "EM: allocation failed\n");
return;
}
em_init_performance(dev, pd, em_table->state, pd->nr_perf_states);
em_recalc_and_update(dev, pd, em_table);
} }
static void em_check_capacity_update(void) static void em_check_capacity_update(void)