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:
parent
e3ac0f367d
commit
d61c2695bd
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user