From 846bf8e8cb39243bd02545ebc3a13a692f31a3c1 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Thu, 29 Oct 2020 22:49:45 -0700 Subject: [PATCH] ANDROID: sched: Add vendor hooks for skipping sugov update This is to add capability for vendor to decide whether a cpufreq update is needed, e.g. up/down rate limit. Using restricted hook since it can be called from scheduler wakeup path. Bug: 170511085 Signed-off-by: Wei Wang Change-Id: If9adea3a3e31efbf3858fbd009665a07dc70c638 (cherry picked from commit f9f3464532a045257f8138338b1beda86ef0a3be) Signed-off-by: Will McVicker --- drivers/android/vendor_hooks.c | 3 ++- include/trace/hooks/sched.h | 5 +++++ kernel/sched/cpufreq_schedutil.c | 5 +++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index b37c4904b1a6..d36f5f189264 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -82,4 +82,5 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_find_busiest_queue); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_migrate_queued_task); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_find_energy_efficient_cpu); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_set_sugov_sched_attr); -EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_iowait); \ No newline at end of file +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_iowait); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_sugov_update); \ No newline at end of file diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index 232ad3a6f87b..d91c4d10a84e 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -112,6 +112,10 @@ DECLARE_HOOK(android_vh_set_sugov_sched_attr, DECLARE_RESTRICTED_HOOK(android_rvh_set_iowait, TP_PROTO(struct task_struct *p, int *should_iowait_boost), TP_ARGS(p, should_iowait_boost), 1); +struct sugov_policy; +DECLARE_RESTRICTED_HOOK(android_rvh_set_sugov_update, + TP_PROTO(struct sugov_policy *sg_policy, unsigned int next_freq, bool *should_update), + TP_ARGS(sg_policy, next_freq, should_update), 1); #else #define trace_android_rvh_select_task_rq_fair(p, prev_cpu, sd_flag, wake_flags, new_cpu) #define trace_android_rvh_select_task_rq_rt(p, prev_cpu, sd_flag, wake_flags, new_cpu) @@ -136,6 +140,7 @@ DECLARE_RESTRICTED_HOOK(android_rvh_set_iowait, #define trace_android_rvh_find_energy_efficient_cpu(p, prev_cpu, sync, new_cpu) #define trace_android_vh_set_sugov_sched_attr(attr) #define trace_android_rvh_set_iowait(p, should_iowait_boost) +#define trace_android_rvh_set_sugov_update(sg_policy, next_freq, should_update) #endif #endif /* _TRACE_HOOK_SCHED_H */ /* This part must be outside protection */ diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c index f360a3bf124d..d55bc151ee7f 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -103,6 +103,7 @@ static bool sugov_should_update_freq(struct sugov_policy *sg_policy, u64 time) static bool sugov_update_next_freq(struct sugov_policy *sg_policy, u64 time, unsigned int next_freq) { + bool should_update = true; if (!sg_policy->need_freq_update) { if (sg_policy->next_freq == next_freq) return false; @@ -110,6 +111,10 @@ static bool sugov_update_next_freq(struct sugov_policy *sg_policy, u64 time, sg_policy->need_freq_update = cpufreq_driver_test_flags(CPUFREQ_NEED_UPDATE_LIMITS); } + trace_android_rvh_set_sugov_update(sg_policy, next_freq, &should_update); + if (!should_update) + return false; + sg_policy->next_freq = next_freq; sg_policy->last_freq_update_time = time;