diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index a52cc9b90920a..a1839ddcf05ba 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -62,3 +62,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_printk_store); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_show_regs); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_wq_lockup_pool); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sysrq_crash); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_find_busiest_group); \ No newline at end of file diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index 6ac7dd6f97b78..4e2be4d70658c 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -65,6 +65,11 @@ DECLARE_RESTRICTED_HOOK(android_rvh_set_user_nice, DECLARE_RESTRICTED_HOOK(android_rvh_setscheduler, TP_PROTO(struct task_struct *p), TP_ARGS(p), 1); + +struct sched_group; +DECLARE_RESTRICTED_HOOK(android_rvh_find_busiest_group, + TP_PROTO(struct sched_group *busiest, struct rq *dst_rq, int *out_balance), + TP_ARGS(busiest, dst_rq, out_balance), 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) @@ -79,6 +84,7 @@ DECLARE_RESTRICTED_HOOK(android_rvh_setscheduler, #define trace_android_rvh_rtmutex_prepare_setprio(p, pi_task) #define trace_android_rvh_set_user_nice(p, nice) #define trace_android_rvh_setscheduler(p) +#define trace_android_rvh_find_busiest_group(busiest, dst_rq, out_balance) #endif #endif /* _TRACE_HOOK_SCHED_H */ /* This part must be outside protection */ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 63f48ba96d88b..7bd7edf1b14d6 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -8736,8 +8736,12 @@ static struct sched_group *find_busiest_group(struct lb_env *env) if (sched_energy_enabled()) { struct root_domain *rd = env->dst_rq->rd; + int out_balance = 1; - if (rcu_dereference(rd->pd) && !READ_ONCE(rd->overutilized)) + trace_android_rvh_find_busiest_group(sds.busiest, env->dst_rq, + &out_balance); + if (rcu_dereference(rd->pd) && !READ_ONCE(rd->overutilized) + && out_balance) goto out_balanced; }