Message ID | 20180516044911.28797-7-srinivas.pandruvada@linux.intel.com (mailing list archive) |
---|---|
State | RFC, archived |
Headers | show |
On 15-05-18, 21:49, Srinivas Pandruvada wrote: > Added cpufreq_get_sched_util() to get the CFS, DL and max utilization > values for a CPU. This is required for getting utilization values > for cpufreq drivers outside of kernel/sched folder. > > Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> > --- > include/linux/sched/cpufreq.h | 2 ++ > kernel/sched/cpufreq.c | 23 +++++++++++++++++++++++ > 2 files changed, 25 insertions(+) > > diff --git a/include/linux/sched/cpufreq.h b/include/linux/sched/cpufreq.h > index 5966744..a366600 100644 > --- a/include/linux/sched/cpufreq.h > +++ b/include/linux/sched/cpufreq.h > @@ -20,6 +20,8 @@ void cpufreq_add_update_util_hook(int cpu, struct update_util_data *data, > void (*func)(struct update_util_data *data, u64 time, > unsigned int flags)); > void cpufreq_remove_update_util_hook(int cpu); > +void cpufreq_get_sched_util(int cpu, unsigned long *util_cfs, > + unsigned long *util_dl, unsigned long *max); > #endif /* CONFIG_CPU_FREQ */ > > #endif /* _LINUX_SCHED_CPUFREQ_H */ > diff --git a/kernel/sched/cpufreq.c b/kernel/sched/cpufreq.c > index 5e54cbc..36e2839 100644 > --- a/kernel/sched/cpufreq.c > +++ b/kernel/sched/cpufreq.c > @@ -60,3 +60,26 @@ void cpufreq_remove_update_util_hook(int cpu) > rcu_assign_pointer(per_cpu(cpufreq_update_util_data, cpu), NULL); > } > EXPORT_SYMBOL_GPL(cpufreq_remove_update_util_hook); > + > +/** > + * cpufreq_get_sched_util - Get utilization values. > + * @cpu: The targeted CPU. > + * > + * Get the CFS, DL and max utilization. > + * This function allows cpufreq driver outside the kernel/sched to access > + * utilization value for a CPUs run queue. > + */ > +void cpufreq_get_sched_util(int cpu, unsigned long *util_cfs, > + unsigned long *util_dl, unsigned long *max) > +{ > +#ifdef CONFIG_CPU_FREQ_GOV_SCHEDUTIL What will happen when schedutil is compiled in the kernel but ondemand is the one getting used currently ? > + struct rq *rq = cpu_rq(cpu); > + > + *max = arch_scale_cpu_capacity(NULL, cpu); > + *util_cfs = cpu_util_cfs(rq); > + *util_dl = cpu_util_dl(rq); > +#else > + *util_cfs = *util_dl = 1; > +#endif > +} > +EXPORT_SYMBOL_GPL(cpufreq_get_sched_util); > -- > 2.9.5
On Tue, May 15, 2018 at 09:49:07PM -0700, Srinivas Pandruvada wrote: > --- a/kernel/sched/cpufreq.c > +++ b/kernel/sched/cpufreq.c > @@ -60,3 +60,26 @@ void cpufreq_remove_update_util_hook(int cpu) > rcu_assign_pointer(per_cpu(cpufreq_update_util_data, cpu), NULL); > } > EXPORT_SYMBOL_GPL(cpufreq_remove_update_util_hook); > + > +/** > + * cpufreq_get_sched_util - Get utilization values. > + * @cpu: The targeted CPU. > + * > + * Get the CFS, DL and max utilization. > + * This function allows cpufreq driver outside the kernel/sched to access > + * utilization value for a CPUs run queue. > + */ > +void cpufreq_get_sched_util(int cpu, unsigned long *util_cfs, > + unsigned long *util_dl, unsigned long *max) > +{ > +#ifdef CONFIG_CPU_FREQ_GOV_SCHEDUTIL > + struct rq *rq = cpu_rq(cpu); > + > + *max = arch_scale_cpu_capacity(NULL, cpu); > + *util_cfs = cpu_util_cfs(rq); > + *util_dl = cpu_util_dl(rq); > +#else > + *util_cfs = *util_dl = 1; > +#endif > +} > +EXPORT_SYMBOL_GPL(cpufreq_get_sched_util); So I _really_ hate this... I'd much rather you make schedutil work with the hwp passive stuff. Also, afaict intel_pstate is bool, not tristate, so no need for an EXPORT at all.
On Wed, 2018-05-16 at 12:10 +0530, Viresh Kumar wrote: > On 15-05-18, 21:49, Srinivas Pandruvada wrote: > > Added cpufreq_get_sched_util() to get the CFS, DL and max > > utilization > > values for a CPU. This is required for getting utilization values > > for cpufreq drivers outside of kernel/sched folder. > > > > Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel > > .com> > > --- > > include/linux/sched/cpufreq.h | 2 ++ > > kernel/sched/cpufreq.c | 23 +++++++++++++++++++++++ > > 2 files changed, 25 insertions(+) > > > > diff --git a/include/linux/sched/cpufreq.h > > b/include/linux/sched/cpufreq.h > > index 5966744..a366600 100644 > > --- a/include/linux/sched/cpufreq.h > > +++ b/include/linux/sched/cpufreq.h > > @@ -20,6 +20,8 @@ void cpufreq_add_update_util_hook(int cpu, struct > > update_util_data *data, > > void (*func)(struct update_util_data *data, > > u64 time, > > unsigned int flags)); > > void cpufreq_remove_update_util_hook(int cpu); > > +void cpufreq_get_sched_util(int cpu, unsigned long *util_cfs, > > + unsigned long *util_dl, unsigned long > > *max); > > #endif /* CONFIG_CPU_FREQ */ > > > > #endif /* _LINUX_SCHED_CPUFREQ_H */ > > diff --git a/kernel/sched/cpufreq.c b/kernel/sched/cpufreq.c > > index 5e54cbc..36e2839 100644 > > --- a/kernel/sched/cpufreq.c > > +++ b/kernel/sched/cpufreq.c > > @@ -60,3 +60,26 @@ void cpufreq_remove_update_util_hook(int cpu) > > rcu_assign_pointer(per_cpu(cpufreq_update_util_data, cpu), > > NULL); > > } > > EXPORT_SYMBOL_GPL(cpufreq_remove_update_util_hook); > > + > > +/** > > + * cpufreq_get_sched_util - Get utilization values. > > + * @cpu: The targeted CPU. > > + * > > + * Get the CFS, DL and max utilization. > > + * This function allows cpufreq driver outside the kernel/sched to > > access > > + * utilization value for a CPUs run queue. > > + */ > > +void cpufreq_get_sched_util(int cpu, unsigned long *util_cfs, > > + unsigned long *util_dl, unsigned long > > *max) > > +{ > > +#ifdef CONFIG_CPU_FREQ_GOV_SCHEDUTIL > > What will happen when schedutil is compiled in the kernel but > ondemand > is the one getting used currently ? It should still work. The only reason I have to use ifdef because of compile issues when CONFIG_CPU_FREQ_SCHEDUTIL is not defined. The reason for that is that cpu_util_cfs() and cpu_util_dl() is defined under #ifdef CONFIG_CPU_FREQ_GOV_SCHEDUTIL. The actual code inside the cpu_util_cfs() and cpu_util_dl() uses rq->cfs.avg.util_avg and rq->cfs.avg.util_avg, which are updated irrespective of cpufreq governor. May be better to remove ifdefs for cpu_util_dl() and cpu_util_cfs(). Thanks, Srinivas > > > + struct rq *rq = cpu_rq(cpu); > > + > > + *max = arch_scale_cpu_capacity(NULL, cpu); > > + *util_cfs = cpu_util_cfs(rq); > > + *util_dl = cpu_util_dl(rq); > > +#else > > + *util_cfs = *util_dl = 1; > > +#endif > > +} > > +EXPORT_SYMBOL_GPL(cpufreq_get_sched_util); > > -- > > 2.9.5 > >
On Wed, 2018-05-16 at 10:11 +0200, Peter Zijlstra wrote: > On Tue, May 15, 2018 at 09:49:07PM -0700, Srinivas Pandruvada wrote: > > --- a/kernel/sched/cpufreq.c > > +++ b/kernel/sched/cpufreq.c > > @@ -60,3 +60,26 @@ void cpufreq_remove_update_util_hook(int cpu) > > rcu_assign_pointer(per_cpu(cpufreq_update_util_data, cpu), > > NULL); > > } > > EXPORT_SYMBOL_GPL(cpufreq_remove_update_util_hook); > > + > > +/** > > + * cpufreq_get_sched_util - Get utilization values. > > + * @cpu: The targeted CPU. > > + * > > + * Get the CFS, DL and max utilization. > > + * This function allows cpufreq driver outside the kernel/sched to > > access > > + * utilization value for a CPUs run queue. > > + */ > > +void cpufreq_get_sched_util(int cpu, unsigned long *util_cfs, > > + unsigned long *util_dl, unsigned long > > *max) > > +{ > > +#ifdef CONFIG_CPU_FREQ_GOV_SCHEDUTIL > > + struct rq *rq = cpu_rq(cpu); > > + > > + *max = arch_scale_cpu_capacity(NULL, cpu); > > + *util_cfs = cpu_util_cfs(rq); > > + *util_dl = cpu_util_dl(rq); > > +#else > > + *util_cfs = *util_dl = 1; > > +#endif > > +} > > +EXPORT_SYMBOL_GPL(cpufreq_get_sched_util); > > So I _really_ hate this... I'd much rather you make schedutil work > with > the hwp passive stuff. Are you not happy with ifdefs are utility function itself? Can you explain more how this should be done? utilization values are not passed with scheduler update util callback. So need to have access to rq->cfs.avg.util* and rq->dl.running_bw access from intel_pstate. The ifdefs can be removed, if we remove ifdefs for cpu_util_dl() or cpu_util_cfs(), which are not doing anything special other than accessing rq->cfs.avg.util* and rq->dl.running_bw. I think it is better to remove from these functions. > > Also, afaict intel_pstate is bool, not tristate, so no need for an > EXPORT at all. Correct. I am just following other interface functions for sched util hooks in this file which are using EXPORT. But I will remove EXPORT in the next revision. Thanks, Srinivas
On Wed, May 16, 2018 at 03:40:39PM -0700, Srinivas Pandruvada wrote: > On Wed, 2018-05-16 at 10:11 +0200, Peter Zijlstra wrote: > > So I _really_ hate this... I'd much rather you make schedutil work > > with the hwp passive stuff. > Are you not happy with ifdefs are utility function itself? Can you > explain more how this should be done? The reason I hate it is because it exports data that should not be. We created the schedutil governor as part of the scheduler such that we could tightly couple it. So if you want to use all that, get schedutil to work for you.
diff --git a/include/linux/sched/cpufreq.h b/include/linux/sched/cpufreq.h index 5966744..a366600 100644 --- a/include/linux/sched/cpufreq.h +++ b/include/linux/sched/cpufreq.h @@ -20,6 +20,8 @@ void cpufreq_add_update_util_hook(int cpu, struct update_util_data *data, void (*func)(struct update_util_data *data, u64 time, unsigned int flags)); void cpufreq_remove_update_util_hook(int cpu); +void cpufreq_get_sched_util(int cpu, unsigned long *util_cfs, + unsigned long *util_dl, unsigned long *max); #endif /* CONFIG_CPU_FREQ */ #endif /* _LINUX_SCHED_CPUFREQ_H */ diff --git a/kernel/sched/cpufreq.c b/kernel/sched/cpufreq.c index 5e54cbc..36e2839 100644 --- a/kernel/sched/cpufreq.c +++ b/kernel/sched/cpufreq.c @@ -60,3 +60,26 @@ void cpufreq_remove_update_util_hook(int cpu) rcu_assign_pointer(per_cpu(cpufreq_update_util_data, cpu), NULL); } EXPORT_SYMBOL_GPL(cpufreq_remove_update_util_hook); + +/** + * cpufreq_get_sched_util - Get utilization values. + * @cpu: The targeted CPU. + * + * Get the CFS, DL and max utilization. + * This function allows cpufreq driver outside the kernel/sched to access + * utilization value for a CPUs run queue. + */ +void cpufreq_get_sched_util(int cpu, unsigned long *util_cfs, + unsigned long *util_dl, unsigned long *max) +{ +#ifdef CONFIG_CPU_FREQ_GOV_SCHEDUTIL + struct rq *rq = cpu_rq(cpu); + + *max = arch_scale_cpu_capacity(NULL, cpu); + *util_cfs = cpu_util_cfs(rq); + *util_dl = cpu_util_dl(rq); +#else + *util_cfs = *util_dl = 1; +#endif +} +EXPORT_SYMBOL_GPL(cpufreq_get_sched_util);
Added cpufreq_get_sched_util() to get the CFS, DL and max utilization values for a CPU. This is required for getting utilization values for cpufreq drivers outside of kernel/sched folder. Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> --- include/linux/sched/cpufreq.h | 2 ++ kernel/sched/cpufreq.c | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+)