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.pandruv...@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 + 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