Skip to content

Commit

Permalink
cpufreq: stats: free table and remove sysfs entry in a single routine
Browse files Browse the repository at this point in the history
We don't have code paths now where we need to do these two things
separately, so it is better do them in a single routine. Just as
they are allocated in a single routine.

Acked-by: Nicolas Pitre <nico@linaro.org>
Tested-by: Nicolas Pitre <nico@linaro.org>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
  • Loading branch information
Viresh Kumar authored and Rafael J. Wysocki committed Jan 17, 2014
1 parent 027cc2e commit 2d13594
Showing 1 changed file with 19 additions and 31 deletions.
50 changes: 19 additions & 31 deletions drivers/cpufreq/cpufreq_stats.c
Original file line number Diff line number Diff line change
Expand Up @@ -151,40 +151,32 @@ static int freq_table_get_index(struct cpufreq_stats *stat, unsigned int freq)
return -1;
}

/* should be called late in the CPU removal sequence so that the stats
* memory is still available in case someone tries to use it.
*/
static void cpufreq_stats_free_table(unsigned int cpu)
static void __cpufreq_stats_free_table(struct cpufreq_policy *policy)
{
struct cpufreq_stats *stat = per_cpu(cpufreq_stats_table, cpu);
struct cpufreq_stats *stat = per_cpu(cpufreq_stats_table, policy->cpu);

if (stat) {
pr_debug("%s: Free stat table\n", __func__);
kfree(stat->time_in_state);
kfree(stat);
per_cpu(cpufreq_stats_table, cpu) = NULL;
}
if (!stat)
return;

pr_debug("%s: Free stat table\n", __func__);

sysfs_remove_group(&policy->kobj, &stats_attr_group);
kfree(stat->time_in_state);
kfree(stat);
per_cpu(cpufreq_stats_table, policy->cpu) = NULL;
}

/* must be called early in the CPU removal sequence (before
* cpufreq_remove_dev) so that policy is still valid.
*/
static void cpufreq_stats_free_sysfs(unsigned int cpu)
static void cpufreq_stats_free_table(unsigned int cpu)
{
struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
struct cpufreq_policy *policy;

policy = cpufreq_cpu_get(cpu);
if (!policy)
return;

if (!cpufreq_frequency_get_table(cpu))
goto put_ref;

if (!policy_is_shared(policy)) {
pr_debug("%s: Free sysfs stat\n", __func__);
sysfs_remove_group(&policy->kobj, &stats_attr_group);
}
if (cpufreq_frequency_get_table(policy->cpu))
__cpufreq_stats_free_table(policy);

put_ref:
cpufreq_cpu_put(policy);
}

Expand Down Expand Up @@ -293,10 +285,8 @@ static int cpufreq_stat_notifier_policy(struct notifier_block *nb,

if (val == CPUFREQ_CREATE_POLICY)
ret = cpufreq_stats_create_table(policy, table);
else if (val == CPUFREQ_REMOVE_POLICY) {
cpufreq_stats_free_sysfs(cpu);
cpufreq_stats_free_table(cpu);
}
else if (val == CPUFREQ_REMOVE_POLICY)
__cpufreq_stats_free_table(policy);

return ret;
}
Expand Down Expand Up @@ -376,10 +366,8 @@ static void __exit cpufreq_stats_exit(void)
CPUFREQ_POLICY_NOTIFIER);
cpufreq_unregister_notifier(&notifier_trans_block,
CPUFREQ_TRANSITION_NOTIFIER);
for_each_online_cpu(cpu) {
for_each_online_cpu(cpu)
cpufreq_stats_free_table(cpu);
cpufreq_stats_free_sysfs(cpu);
}
}

MODULE_AUTHOR("Zou Nan hai <nanhai.zou@intel.com>");
Expand Down

0 comments on commit 2d13594

Please sign in to comment.