static int __cpuinit cpufreq_stat_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) { unsigned int cpu = (unsigned long)hcpu; switch (action) { case CPU_ONLINE: case CPU_ONLINE_FROZEN: cpufreq_update_policy(cpu); break; case CPU_DOWN_PREPARE: case CPU_DOWN_PREPARE_FROZEN: cpufreq_stats_free_sysfs(cpu); break; case CPU_DEAD: case CPU_DEAD_FROZEN: cpufreq_stats_free_table(cpu); break; case CPU_DOWN_FAILED: case CPU_DOWN_FAILED_FROZEN: cpufreq_stats_create_table_cpu(cpu); break; } return NOTIFY_OK; }
static int cpufreq_stat_notifier_trans(struct notifier_block *nb, unsigned long val, void *data) { struct cpufreq_freqs *freq = data; struct cpufreq_stats *stat; int old_index, new_index; if (val != CPUFREQ_POSTCHANGE) return 0; stat = per_cpu(cpufreq_stats_table, freq->cpu); if (!stat) return 0; new_index = freq_table_get_index(stat, freq->new); if(new_index == -1) { //quick and dirty fix. cpufreq_stats_free_sysfs(freq->cpu); cpufreq_stats_free_table(freq->cpu); cpufreq_stats_create_table_cpu(freq->cpu); stat = per_cpu(cpufreq_stats_table, freq->cpu); if (!stat) return 0; new_index = freq_table_get_index(stat, freq->new); }