Hi Pan, On Tue, Jul 07, 2015 at 08:43:26PM +0800, Pan Xinhui wrote: > @@ -364,19 +363,24 @@ static u32 get_cur_val(const struct cpumask *mask) > > static unsigned int get_cur_freq_on_cpu(unsigned int cpu) > { > - struct acpi_cpufreq_data *data = per_cpu(acfreq_data, cpu); > + struct acpi_cpufreq_data *data; > + struct cpufreq_policy *policy; > unsigned int freq; > unsigned int cached_freq; > > pr_debug("get_cur_freq_on_cpu (%d)\n", cpu); > > - if (unlikely(data == NULL || > - data->acpi_data == NULL || data->freq_table == NULL)) { > + policy = cpufreq_cpu_get(cpu); > + if (unlikely(!policy)) > + return 0; > + > + data = policy->driver_data; > + cpufreq_cpu_put(policy);
If we put policy here can we guarantee that memory pointed to by data stays valid? Shoudln't we issue cpufreq_cpu_put(policy) after we done assessing the pointer? > + if (unlikely(!data || !data->acpi_data || !data->freq_table)) > return 0; > - } > > cached_freq = data->freq_table[data->acpi_data->state].frequency; > - freq = extract_freq(get_cur_val(cpumask_of(cpu)), data); > + freq = extract_freq(get_cur_val(cpumask_of(cpu), data), data); > if (freq != cached_freq) { > /* > * The dreaded BIOS frequency change behind our back. Thanks. -- Dmitry -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/