Commit 4a6b1cf0 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

PM: EM: Introduce em_adjust_cpu_capacity()



Add a function for updating the Energy Model for a CPU after its
capacity has changed, which subsequently will be used by the
intel_pstate driver.

An EM_PERF_DOMAIN_ARTIFICIAL check is added to em_recalc_and_update()
to prevent it from calling em_compute_costs() for an "artificial" perf
domain with a NULL cb parameter which would cause it to crash.

Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: default avatarLukasz Luba <lukasz.luba@arm.com>
Tested-by: default avatarChristian Loehle <christian.loehle@arm.com>
Reviewed-by: default avatarDietmar Eggemann <dietmar.eggemann@arm.com>
Link: https://patch.msgid.link/3637203.iIbC2pHGDl@rjwysocki.net
parent 3e3ba654
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -179,6 +179,7 @@ int em_dev_compute_costs(struct device *dev, struct em_perf_state *table,
int em_dev_update_chip_binning(struct device *dev);
int em_update_performance_limits(struct em_perf_domain *pd,
		unsigned long freq_min_khz, unsigned long freq_max_khz);
void em_adjust_cpu_capacity(unsigned int cpu);
void em_rebuild_sched_domains(void);

/**
@@ -403,6 +404,7 @@ int em_update_performance_limits(struct em_perf_domain *pd,
{
	return -EINVAL;
}
static inline void em_adjust_cpu_capacity(unsigned int cpu) {}
static inline void em_rebuild_sched_domains(void) {}
#endif

+24 −4
Original line number Diff line number Diff line
@@ -702,10 +702,12 @@ static int em_recalc_and_update(struct device *dev, struct em_perf_domain *pd,
{
	int ret;

	ret = em_compute_costs(dev, em_table->state, NULL, pd->nr_perf_states,
			       pd->flags);
	if (!em_is_artificial(pd)) {
		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)
@@ -755,6 +757,24 @@ static void em_adjust_new_capacity(unsigned int cpu, struct device *dev,
	em_recalc_and_update(dev, pd, em_table);
}

/**
 * em_adjust_cpu_capacity() - Adjust the EM for a CPU after a capacity update.
 * @cpu: Target CPU.
 *
 * Adjust the existing EM for @cpu after a capacity update under the assumption
 * that the capacity has been updated in the same way for all of the CPUs in
 * the same perf domain.
 */
void em_adjust_cpu_capacity(unsigned int cpu)
{
	struct device *dev = get_cpu_device(cpu);
	struct em_perf_domain *pd;

	pd = em_pd_get(dev);
	if (pd)
		em_adjust_new_capacity(cpu, dev, pd);
}

static void em_check_capacity_update(void)
{
	cpumask_var_t cpu_done_mask;