On 08-12-23, 10:18, David Dai wrote: > Hi Viresh, > > Apologies for the late reply, > > On Wed, Nov 15, 2023 at 3:29 PM Viresh Kumar <viresh.kumar@xxxxxxxxxx> wrote: > > > > On 10-11-23, 17:49, David Dai wrote: > > > diff --git a/drivers/cpufreq/virtual-cpufreq.c b/drivers/cpufreq/virtual-cpufreq.c > > > +static unsigned int virt_cpufreq_set_perf(struct cpufreq_policy *policy) > > > +{ > > > + writel_relaxed(policy->cached_target_freq, > > > > Drivers shouldn't be using the cached_target_freq directly. Use the target freq > > or index passed from cpufreq core. > > We were trying to avoid rounding to frequency table entries to provide > more accurate frequency requests. However, we didn't find any > significant power or performance regressions using the frequencies > from the table, so I'll send another patch series using your > suggestion. > > > > > > +static int virt_cpufreq_cpu_exit(struct cpufreq_policy *policy) > > > +{ > > > + topology_clear_scale_freq_source(SCALE_FREQ_SOURCE_VIRT, policy->related_cpus); > > > + kfree(policy->freq_table); This becomes a dangling pointer for a very short amount of time. There may or may not be a actual race here and so I said the ordering must be just the opposite anyway. > > > + policy->freq_table = NULL; And I thought this isn't required too since the core is going the free the policy structure right after returning from here. But maybe it is not a guarantee that the core provides (the code can change in future) and so be better to unset it anyway. > > No need of doing this. Also the order of above two calls is wrong anyway. > > Can you clarify this point a bit more? Are you suggesting to just > remove setting policy->freq_table to NULL and swap the ordering > freeing the freq_table vs clearing the topology source? I can > alternatively use dev_pm_opp_free_cpufreq_table to mirror the init. That would be better actually, to let a single piece of code manage this :) -- viresh