Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5d4eda83 authored by Viresh Kumar's avatar Viresh Kumar Committed by Junjie Wu
Browse files

cpufreq: stats: create sysfs entries when cpufreq_stats is a module



When cpufreq_stats is compiled in as a module, cpufreq driver would
have already been registered. And so the CPUFREQ_CREATE_POLICY
notifiers wouldn't be called for it. Hence no sysfs entries for stats. :(

This patch calls cpufreq_stats_create_table() for each online CPU from
cpufreq_stats_init() and so if policy is already created for CPUx then
we will register sysfs stats for it.

When its not compiled as module, we will return early as policy wouldn't
be found for any of the CPUs.

Change-Id: Ie8841c8a9c06b61231afd3f5377b73be24473527
Acked-by: default avatarNicolas Pitre <nico@linaro.org>
Tested-by: default avatarNicolas Pitre <nico@linaro.org>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Git-commit: b3f9ff88db6e149086dc111e5652106005fd5923
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git


Signed-off-by: default avatarJunjie Wu <junjiew@codeaurora.org>
parent 4fa43899
Loading
Loading
Loading
Loading
+25 −2
Original line number Original line Diff line number Diff line
@@ -180,7 +180,7 @@ static void cpufreq_stats_free_table(unsigned int cpu)
	cpufreq_cpu_put(policy);
	cpufreq_cpu_put(policy);
}
}


static int cpufreq_stats_create_table(struct cpufreq_policy *policy,
static int __cpufreq_stats_create_table(struct cpufreq_policy *policy,
		struct cpufreq_frequency_table *table)
		struct cpufreq_frequency_table *table)
{
{
	unsigned int i, j, count = 0, ret = 0;
	unsigned int i, j, count = 0, ret = 0;
@@ -253,6 +253,26 @@ error_get_fail:
	return ret;
	return ret;
}
}


static void cpufreq_stats_create_table(unsigned int cpu)
{
	struct cpufreq_policy *policy;
	struct cpufreq_frequency_table *table;

	/*
	 * "likely(!policy)" because normally cpufreq_stats will be registered
	 * before cpufreq driver
	 */
	policy = cpufreq_cpu_get(cpu);
	if (likely(!policy))
		return;

	table = cpufreq_frequency_get_table(policy->cpu);
	if (likely(table))
		__cpufreq_stats_create_table(policy, table);

	cpufreq_cpu_put(policy);
}

static void cpufreq_stats_update_policy_cpu(struct cpufreq_policy *policy)
static void cpufreq_stats_update_policy_cpu(struct cpufreq_policy *policy)
{
{
	struct cpufreq_stats *stat = per_cpu(cpufreq_stats_table,
	struct cpufreq_stats *stat = per_cpu(cpufreq_stats_table,
@@ -284,7 +304,7 @@ static int cpufreq_stat_notifier_policy(struct notifier_block *nb,
		return 0;
		return 0;


	if (val == CPUFREQ_CREATE_POLICY)
	if (val == CPUFREQ_CREATE_POLICY)
		ret = cpufreq_stats_create_table(policy, table);
		ret = __cpufreq_stats_create_table(policy, table);
	else if (val == CPUFREQ_REMOVE_POLICY)
	else if (val == CPUFREQ_REMOVE_POLICY)
		__cpufreq_stats_free_table(policy);
		__cpufreq_stats_free_table(policy);


@@ -346,6 +366,9 @@ static int __init cpufreq_stats_init(void)
	if (ret)
	if (ret)
		return ret;
		return ret;


	for_each_online_cpu(cpu)
		cpufreq_stats_create_table(cpu);

	ret = cpufreq_register_notifier(&notifier_trans_block,
	ret = cpufreq_register_notifier(&notifier_trans_block,
				CPUFREQ_TRANSITION_NOTIFIER);
				CPUFREQ_TRANSITION_NOTIFIER);
	if (ret) {
	if (ret) {