From 06881e01b564a89c001add7a865b212355837a2a Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Thu, 29 Oct 2020 00:13:26 -0700 Subject: [PATCH] ANDROID: sched: Add vendor hooks for override sugov behavior Upstream moved the sugov to DEADLINE class which has higher prio than RT so it can potentially block many RT use case in Android. Also currently iowait doesn't distinguish background/foreground tasks and we have seen cases where device run to high frequency unnecessarily when running some background I/O. Bug: 171598214 Signed-off-by: Wei Wang Change-Id: I21e9bfe9ef75a4178279574389e417c3f38e65ac (cherry picked from commit 03177ef82bd942a3f163e826063491bae6ff0ac9) Signed-off-by: Will McVicker --- drivers/android/vendor_hooks.c | 2 ++ include/trace/hooks/sched.h | 9 +++++++++ kernel/sched/cpufreq_schedutil.c | 2 ++ kernel/sched/fair.c | 5 ++++- 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index fe86a814b1b7..b37c4904b1a6 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -81,3 +81,5 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_sched_nohz_balancer_kick); 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 diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index b914f53f216f..232ad3a6f87b 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -105,6 +105,13 @@ DECLARE_RESTRICTED_HOOK(android_rvh_migrate_queued_task, DECLARE_RESTRICTED_HOOK(android_rvh_find_energy_efficient_cpu, TP_PROTO(struct task_struct *p, int prev_cpu, int sync, int *new_cpu), TP_ARGS(p, prev_cpu, sync, new_cpu), 1); +struct sched_attr; +DECLARE_HOOK(android_vh_set_sugov_sched_attr, + TP_PROTO(struct sched_attr *attr), + TP_ARGS(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); #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) @@ -127,6 +134,8 @@ DECLARE_RESTRICTED_HOOK(android_rvh_find_energy_efficient_cpu, #define trace_android_rvh_find_busiest_queue(dst_cpu, group, env_cpus, busiest, done) #define trace_android_rvh_migrate_queued_task(rq, rf, p, new_cpu, detached) #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) #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 1724dedfd795..f360a3bf124d 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -12,6 +12,7 @@ #include #include +#include #define IOWAIT_BOOST_MIN (SCHED_CAPACITY_SCALE / 8) @@ -661,6 +662,7 @@ static int sugov_kthread_create(struct sugov_policy *sg_policy) if (policy->fast_switch_enabled) return 0; + trace_android_vh_set_sugov_sched_attr(&attr); kthread_init_work(&sg_policy->work, sugov_work); kthread_init_worker(&sg_policy->worker); thread = kthread_create(kthread_worker_fn, &sg_policy->worker, diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 78a2892bc4fc..0b739c622b2d 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -5481,6 +5481,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) struct sched_entity *se = &p->se; int idle_h_nr_running = task_has_idle_policy(p); int task_new = !(flags & ENQUEUE_WAKEUP); + int should_iowait_boost; /* * The code below (indirectly) updates schedutil which looks at @@ -5495,7 +5496,9 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) * utilization updates, so do it here explicitly with the IOWAIT flag * passed. */ - if (p->in_iowait) + should_iowait_boost = p->in_iowait; + trace_android_rvh_set_iowait(p, &should_iowait_boost); + if (should_iowait_boost) cpufreq_update_util(rq, SCHED_CPUFREQ_IOWAIT); for_each_sched_entity(se) {