From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161474AbbKFMDx (ORCPT ); Fri, 6 Nov 2015 07:03:53 -0500 Received: from mailout2.w1.samsung.com ([210.118.77.12]:40703 "EHLO mailout2.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1161423AbbKFMDr (ORCPT ); Fri, 6 Nov 2015 07:03:47 -0500 X-AuditID: cbfec7f4-f79c56d0000012ee-10-563c97210d92 From: Arseniy Krasnov To: linux@arm.linux.org.uk, mingo@redhat.com, peterz@infradead.org Cc: a.krasnov@samsung.com, v.tyrtov@samsung.com, s.rogachev@samsung.com, linux-kernel@vger.kernel.org, Tarek Dakhran , Sergey Dyasly , Dmitriy Safonov , Ilya Maximets Subject: [PATCH 13/13] hperf_hmp: cpufreq routines. Date: Fri, 06 Nov 2015 15:02:47 +0300 Message-id: <1446811367-23783-14-git-send-email-a.krasnov@samsung.com> X-Mailer: git-send-email 1.9.1 In-reply-to: <1446811367-23783-1-git-send-email-a.krasnov@samsung.com> References: <1446811367-23783-1-git-send-email-a.krasnov@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrBLMWRmVeSWpSXmKPExsVy+t/xK7qK023CDL5sNLKY91nQ4tPKp2wW V9p/sltc3jWHzeL2ZV6LSwcWMFkc7z3AZDF5tpTFu63XWC3WPz/FaDF1xg92B26PluYeNo/N K7Q8Dr7bw+Txft9VNo++LasYPT5vkgtgi+KySUnNySxLLdK3S+DKuPliNnPBc6mK5Revsjcw rhfrYuTkkBAwkTi/ZAI7hC0mceHeejYQW0hgKaPE2eXeXYxcQHY7k8SCpiksIAk2AV2Jnxu3 gBWJCDhJ9Dw7ywhiMwtMZpLY8DUNxBYWMJbYNWMH2FAWAVWJzfvOsILYvAJuEhubjrNBLJOT OHlsMlicEyje0XWbHWKxq0TH2XcsExh5FzAyrGIUTS1NLihOSs811CtOzC0uzUvXS87P3cQI Cb8vOxgXH7M6xCjAwajEw3tjiXWYEGtiWXFl7iFGCQ5mJRFeOWabMCHelMTKqtSi/Pii0pzU 4kOM0hwsSuK8c3e9DxESSE8sSc1OTS1ILYLJMnFwSjUwCh2ZvDw68eYnvoAlXlFsdxWzWCx+ Hp+jUda+Q2hLUPuZjTPSk7fUnVHc7jXF8nbeud31Ut4/Fr/Rdpz+YL3rx6xTVxJmrcz513F7 9r9rjG26mZPcQh5Hh8t7Xb3VaFvw82XxuUddYTITNlYFHoqunKuv+4GN9YzwZqPXRsbyhwRn bbN3Mjm6SImlOCPRUIu5qDgRAKrNpuQ7AgAA Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Adds CPU frequency change notifier in fair scheduling class. Every time when governor changes frequency, it calls callback from this patch. Frequency of each CPU is used for imbalance calculation. Signed-off-by: Tarek Dakhran Signed-off-by: Sergey Dyasly Signed-off-by: Dmitriy Safonov Signed-off-by: Arseniy Krasnov Signed-off-by: Ilya Maximets --- kernel/sched/fair.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 06f6518..87dc0db 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -33,6 +33,10 @@ #include +#ifdef CONFIG_HPERF_HMP +#include +#endif + #include "sched.h" /* @@ -101,6 +105,11 @@ const_debug unsigned int sysctl_sched_migration_cost = 500000UL; unsigned int __read_mostly sysctl_sched_shares_window = 10000000UL; #ifdef CONFIG_HPERF_HMP +/* + * Log level of hperf_hmp messages. Bigger means more messages. + * Maximum level is 3. + */ +unsigned int sysctl_sched_hperf_hmp_log_level; extern void hmp_set_cpu_masks(struct cpumask *, struct cpumask *); static atomic_t a15_nr_hmp_busy = ATOMIC_INIT(0); static atomic_t a7_nr_hmp_busy = ATOMIC_INIT(0); @@ -7229,6 +7238,73 @@ static int should_we_balance(struct lb_env *env) return balance_cpu == env->dst_cpu; } #ifdef CONFIG_HPERF_HMP +static void hperf_hmp_vprint(unsigned int log_level, const char *format, + va_list ap) +{ + if (sysctl_sched_hperf_hmp_log_level < log_level) + return; + vprintk(format, ap); +} + +static void hperf_hmp_print(unsigned int log_level, const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + hperf_hmp_vprint(log_level, format, ap); + va_end(ap); +} + +/* Called when frequency is changed */ +static int hmp_cpufreq_callback(struct notifier_block *nb, + unsigned long event, void *data) +{ + struct cpufreq_freqs *new_freq = data; + + /* recount power only after change of frequency */ + if (event != CPUFREQ_POSTCHANGE) + return NOTIFY_DONE; + + if (!new_freq) + return NOTIFY_DONE; + + freq_scale_cpu_power[new_freq->cpu] = (new_freq->new >> 10); + + /* Apply slowdown coefficient of 1.9 for A7 CPUs */ + if (!cpu_is_fastest(new_freq->cpu)) { + freq_scale_cpu_power[new_freq->cpu] *= 10; + freq_scale_cpu_power[new_freq->cpu] /= 19; + } + + hperf_hmp_print(2, KERN_INFO "hperf_hmp: CPU#%i new frequency is: %u MHz\n", + new_freq->cpu, new_freq->new / 1000); + + return NOTIFY_OK; +} + +static struct notifier_block cpufreq_notifier = { + .notifier_call = hmp_cpufreq_callback +}; + +static int __init register_sched_cpufreq_notifier(void) +{ + int err = 0; + int cpu; + + for_each_online_cpu(cpu) + freq_scale_cpu_power[cpu] = capacity_of(cpu); + + err = cpufreq_register_notifier(&cpufreq_notifier, + CPUFREQ_TRANSITION_NOTIFIER); + if (!err) + pr_info("hperf_hmp: registered cpufreq transition notifier\n"); + else + pr_info("hperf_hmp: failed to register cpufreq notifier!\n"); + + return err; +} +core_initcall(register_sched_cpufreq_notifier); + /** * is_hmp_imbalance(): Calculates imbalance between HMP domains. * @sd: Current sched domain. -- 1.9.1