static int cpufreq_stat_notifier_policy(struct notifier_block *nb, unsigned long val, void *data) { int ret; struct cpufreq_policy *policy = data; struct cpufreq_frequency_table *table; unsigned int cpu = policy->cpu; if (val == CPUFREQ_UPDATE_POLICY_CPU) { cpufreq_stats_update_policy_cpu(policy); return 0; } if (val != CPUFREQ_NOTIFY) return 0; table = cpufreq_frequency_get_table(cpu); if (!table) return 0; if (!per_cpu(all_cpufreq_stats, cpu)) cpufreq_allstats_create(cpu); ret = cpufreq_stats_create_table(policy, table); if (ret) return ret; return 0; }
static int __init cpufreq_stats_init(void) { int ret; unsigned int cpu; spin_lock_init(&cpufreq_stats_lock); ret = cpufreq_register_notifier(¬ifier_policy_block, CPUFREQ_POLICY_NOTIFIER); if (ret) return ret; for_each_online_cpu(cpu) cpufreq_stats_create_table(cpu); ret = cpufreq_register_notifier(¬ifier_trans_block, CPUFREQ_TRANSITION_NOTIFIER); if (ret) { cpufreq_unregister_notifier(¬ifier_policy_block, CPUFREQ_POLICY_NOTIFIER); for_each_online_cpu(cpu) cpufreq_stats_free_table(cpu); return ret; } return 0; }
static int __init cpufreq_stats_init(void) { int ret; unsigned int cpu; spin_lock_init(&cpufreq_stats_lock); ret = cpufreq_register_notifier(¬ifier_policy_block, CPUFREQ_POLICY_NOTIFIER); if (ret) return ret; for_each_online_cpu(cpu) cpufreq_stats_create_table(cpu); ret = cpufreq_register_notifier(¬ifier_trans_block, CPUFREQ_TRANSITION_NOTIFIER); if (ret) { cpufreq_unregister_notifier(¬ifier_policy_block, CPUFREQ_POLICY_NOTIFIER); for_each_online_cpu(cpu) cpufreq_stats_free_table(cpu); return ret; } create_all_freq_table(); ret = cpufreq_sysfs_create_file(&_attr_all_time_in_state.attr); if (ret) pr_warn("Cannot create sysfs file for cpufreq stats\n"); ret = cpufreq_sysfs_create_file(&_attr_current_in_state.attr); if (ret) pr_warn("Cannot create sysfs file for cpufreq current stats\n"); return 0; }
static int cpufreq_stats_create_table_cpu(unsigned int cpu) { struct cpufreq_policy *policy; struct cpufreq_frequency_table *table; int ret = -ENODEV, i, count = 0; policy = cpufreq_cpu_get(cpu); if (!policy) return -ENODEV; table = cpufreq_frequency_get_table(cpu); if (!table) goto out; for (i = 0; table[i].frequency != CPUFREQ_TABLE_END; i++) { unsigned int freq = table[i].frequency; if (freq == CPUFREQ_ENTRY_INVALID) continue; count++; } if (!per_cpu(all_cpufreq_stats, cpu)) cpufreq_allstats_create(cpu, table, count); if (!per_cpu(cpufreq_power_stats, cpu)) cpufreq_powerstats_create(cpu, table, count); ret = cpufreq_stats_create_table(policy, table, count); out: cpufreq_cpu_put(policy); return ret; }
static int cpufreq_stat_notifier_policy(struct notifier_block *nb, unsigned long val, void *data) { int ret, count = 0, i; struct cpufreq_policy *policy = data; struct cpufreq_frequency_table *table; unsigned int cpu = policy->cpu; if (val != CPUFREQ_NOTIFY) return 0; table = cpufreq_frequency_get_table(cpu); if (!table) return 0; for (i = 0; table[i].frequency != CPUFREQ_TABLE_END; i++) { unsigned int freq = table[i].frequency; if (freq == CPUFREQ_ENTRY_INVALID) continue; count++; } if (!per_cpu(all_cpufreq_stats, cpu)) cpufreq_allstats_create(cpu, table, count); if (!per_cpu(cpufreq_power_stats, cpu)) cpufreq_powerstats_create(cpu, table, count); ret = cpufreq_stats_create_table(policy, table, count); if (ret) return ret; return 0; }
static int cpufreq_stat_notifier_policy(struct notifier_block *nb, unsigned long val, void *data) { int ret; struct cpufreq_policy *policy = data; struct cpufreq_frequency_table *table; unsigned int cpu = policy->cpu; if (val != CPUFREQ_NOTIFY) return 0; table = cpufreq_frequency_get_table(cpu); if (!table) return 0; ret = cpufreq_stats_create_table(policy, table); return (ret == -EBUSY)? 0 : ret; }
static int cpufreq_stats_create_table_cpu(unsigned int cpu) { struct cpufreq_policy *policy; struct cpufreq_frequency_table *table; int ret = -ENODEV; policy = cpufreq_cpu_get(cpu); if (!policy) return -ENODEV; table = cpufreq_frequency_get_table(cpu); if (!table) goto out; ret = cpufreq_stats_create_table(policy, table); out: cpufreq_cpu_put(policy); return ret; }