diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index 5e4f05c20be0..a4dc195df7a0 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -370,6 +370,12 @@ DECLARE_HOOK(android_vh_dup_task_struct, DECLARE_RESTRICTED_HOOK(android_rvh_post_init_entity_util_avg, TP_PROTO(struct sched_entity *se), TP_ARGS(se), 1); + +DECLARE_RESTRICTED_HOOK(android_rvh_effective_cpu_util, + TP_PROTO(int cpu, unsigned long util_cfs, unsigned long max, int type, + struct task_struct *p, unsigned long *new_util), + TP_ARGS(cpu, util_cfs, max, type, p, new_util), 1); + /* macro versions of hooks are no longer required */ #endif /* _TRACE_HOOK_SCHED_H */ diff --git a/kernel/sched/core.c b/kernel/sched/core.c index a7a72ee24066..52e3a26643af 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -7374,9 +7374,14 @@ unsigned long effective_cpu_util(int cpu, unsigned long util_cfs, { unsigned long dl_util, util, irq, max; struct rq *rq = cpu_rq(cpu); + unsigned long new_util = ULONG_MAX; max = arch_scale_cpu_capacity(cpu); + trace_android_rvh_effective_cpu_util(cpu, util_cfs, max, type, p, &new_util); + if (new_util != ULONG_MAX) + return new_util; + if (!uclamp_is_used() && type == FREQUENCY_UTIL && rt_rq_is_runnable(&rq->rt)) { return max; diff --git a/kernel/sched/vendor_hooks.c b/kernel/sched/vendor_hooks.c index 8c511d7eaa04..f4a2e52641bc 100644 --- a/kernel/sched/vendor_hooks.c +++ b/kernel/sched/vendor_hooks.c @@ -95,3 +95,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_account_task_time); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_dup_task_struct); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_irqtime_account_process_tick); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_post_init_entity_util_avg); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_effective_cpu_util);