Commit d61c2695 authored by Lukasz Luba's avatar Lukasz Luba Committed by Rafael J. Wysocki
Browse files

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: default avatarDietmar Eggemann <dietmar.eggemann@arm.com>
Signed-off-by: default avatarLukasz Luba <lukasz.luba@arm.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent e3ac0f36
Loading
Loading
Loading
Loading
+39 −19
Original line number Diff line number Diff line
@@ -674,23 +674,15 @@ void em_dev_unregister_perf_domain(struct device *dev)
}
EXPORT_SYMBOL_GPL(em_dev_unregister_perf_domain);

/*
 * 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)
static struct em_perf_table __rcu *em_table_dup(struct em_perf_domain *pd)
{
	struct em_perf_table __rcu *em_table;
	struct em_perf_state *ps, *new_ps;
	int ret, ps_size;
	int ps_size;

	em_table = em_table_alloc(pd);
	if (!em_table) {
		dev_warn(dev, "EM: allocation failed\n");
		return;
	}
	if (!em_table)
		return NULL;

	new_ps = em_table->state;

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

	rcu_read_unlock();

	em_init_performance(dev, pd, new_ps, pd->nr_perf_states);
	ret = em_compute_costs(dev, new_ps, NULL, pd->nr_perf_states,
			       pd->flags);
	if (ret) {
		dev_warn(dev, "EM: compute costs failed\n");
		return;
	return em_table;
}

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);
	if (ret)
		goto free_em_table;

	ret = em_dev_update_perf_domain(dev, em_table);
	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.
	 * The EM framework has incremented the usage counter and from now
	 * will keep the reference (then free the memory when needed).
	 */
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)