lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Tue, 25 Aug 2020 11:57:09 +0530 From: Viresh Kumar <viresh.kumar@...aro.org> To: Ionela Voinescu <ionela.voinescu@....com> Cc: rjw@...ysocki.net, dietmar.eggemann@....com, catalin.marinas@....com, sudeep.holla@....com, will@...nel.org, valentin.schneider@....com, linux-pm@...r.kernel.org, linux-arm-kernel@...ts.infradead.org, linux-kernel@...r.kernel.org Subject: Re: [PATCH v3 3/5] cpufreq: report whether cpufreq supports Frequency Invariance (FI) On 24-08-20, 22:02, Ionela Voinescu wrote: > Now that the update of the FI scale factor is done in cpufreq core for > selected functions - target(), target_index() and fast_switch(), > we can provide feedback to the task scheduler and architecture code > on whether cpufreq supports FI. > > For this purpose provide an external function to expose whether the > cpufreq drivers support FI, by using a static key. > > The logic behind the enablement of cpufreq-based invariance is as > follows: > - cpufreq-based invariance is disabled by default > - cpufreq-based invariance is enabled if any of the callbacks > above is implemented while the unsupported setpolicy() is not > > The cpufreq_supports_freq_invariance() function only returns whether > cpufreq is instrumented with the arch_set_freq_scale() calls that > result in support for frequency invariance. Due to the lack of knowledge > on whether the implementation of arch_set_freq_scale() actually results > in the setting of a scale factor based on cpufreq information, it is up > to the architecture code to ensure the setting and provision of the > scale factor to the scheduler. > > Signed-off-by: Ionela Voinescu <ionela.voinescu@....com> > Cc: Rafael J. Wysocki <rjw@...ysocki.net> > Cc: Viresh Kumar <viresh.kumar@...aro.org> > --- > drivers/cpufreq/cpufreq.c | 20 ++++++++++++++++++++ > include/linux/cpufreq.h | 5 +++++ > 2 files changed, 25 insertions(+) > > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c > index 34533c6b3bd0..b3a7d1cc5e92 100644 > --- a/drivers/cpufreq/cpufreq.c > +++ b/drivers/cpufreq/cpufreq.c > @@ -61,6 +61,9 @@ static struct cpufreq_driver *cpufreq_driver; > static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data); > static DEFINE_RWLOCK(cpufreq_driver_lock); > > +/* Mark support for the scheduler's frequency invariance engine */ > +static DEFINE_STATIC_KEY_FALSE(cpufreq_freq_invariance); > + > /* Flag to suspend/resume CPUFreq governors */ > static bool cpufreq_suspended; > > @@ -69,6 +72,20 @@ static inline bool has_target(void) > return cpufreq_driver->target_index || cpufreq_driver->target; > } > > +static inline > +void enable_cpufreq_freq_invariance(struct cpufreq_driver *driver) > +{ > + if (!driver->setpolicy) { > + static_branch_enable_cpuslocked(&cpufreq_freq_invariance); > + pr_debug("supports frequency invariance"); > + } > +} > + I would rather open-code this int the cpufreq_register_driver() routine as that's what is done in cpufreq_unregister_driver() as well. > +bool cpufreq_supports_freq_invariance(void) > +{ > + return static_branch_likely(&cpufreq_freq_invariance); > +} > + And would keep the definition of the static key with this routine at a single place. > /* internal prototypes */ > static unsigned int __cpufreq_get(struct cpufreq_policy *policy); > static int cpufreq_init_governor(struct cpufreq_policy *policy); > @@ -2721,6 +2738,8 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) > cpufreq_driver = driver_data; > write_unlock_irqrestore(&cpufreq_driver_lock, flags); > > + enable_cpufreq_freq_invariance(cpufreq_driver); > + > if (driver_data->setpolicy) > driver_data->flags |= CPUFREQ_CONST_LOOPS; > > @@ -2790,6 +2809,7 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver) > cpus_read_lock(); > subsys_interface_unregister(&cpufreq_interface); > remove_boost_sysfs_file(); > + static_branch_disable_cpuslocked(&cpufreq_freq_invariance); > cpuhp_remove_state_nocalls_cpuslocked(hp_online); > > write_lock_irqsave(&cpufreq_driver_lock, flags); > diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h > index 8f141d4c859c..091df9968945 100644 > --- a/include/linux/cpufreq.h > +++ b/include/linux/cpufreq.h > @@ -217,6 +217,7 @@ void refresh_frequency_limits(struct cpufreq_policy *policy); > void cpufreq_update_policy(unsigned int cpu); > void cpufreq_update_limits(unsigned int cpu); > bool have_governor_per_policy(void); > +bool cpufreq_supports_freq_invariance(void); > struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy); > void cpufreq_enable_fast_switch(struct cpufreq_policy *policy); > void cpufreq_disable_fast_switch(struct cpufreq_policy *policy); > @@ -237,6 +238,10 @@ static inline unsigned int cpufreq_get_hw_max_freq(unsigned int cpu) > { > return 0; > } > +static inline bool cpufreq_supports_freq_invariance(void) > +{ > + return false; > +} > static inline void disable_cpufreq(void) { } > #endif > > -- > 2.17.1 -- viresh
Powered by blists - more mailing lists