From 0ad60853620e2bd7a2f165162fde4729cba0b46d Mon Sep 17 00:00:00 2001 From: Peter-TY Tsai Date: Mon, 22 Jul 2024 18:20:30 +0800 Subject: [PATCH] ANDROID: sched: Add vendor hook for PELT to track customized signal Current tracking cannot reflect the characteristics of different tasks. It is necessary to adjust the degree and speed of changes in different task loadings, so we add vendor hooks to enable it. Bug: 378410131 Change-Id: I1c12ab56614cb4cf663d78730ad320e5d6837e2b Signed-off-by: Peter-TY Tsai [jstultz: Reworked for minor lint issues] Signed-off-by: John Stultz --- include/trace/hooks/sched.h | 20 ++++++++++++++++++++ kernel/sched/pelt.c | 24 ++++++++++++++++++++++++ kernel/sched/pelt.h | 7 +++++++ kernel/sched/vendor_hooks.c | 5 +++++ 4 files changed, 56 insertions(+) diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index 4d624bd3ca4a..9b22b8d6a966 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -380,6 +380,26 @@ 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); + +DECLARE_RESTRICTED_HOOK(android_rvh_update_rq_clock_pelt, + TP_PROTO(struct rq *rq, s64 delta, int *ret), + TP_ARGS(rq, delta, ret), 1); + +DECLARE_RESTRICTED_HOOK(android_rvh_update_load_avg_blocked_se, + TP_PROTO(u64 now, struct sched_entity *se, int *ret), + TP_ARGS(now, se, ret), 1); + +DECLARE_RESTRICTED_HOOK(android_rvh_update_load_avg_se, + TP_PROTO(u64 now, struct cfs_rq *cfs_rq, struct sched_entity *se, int *ret), + TP_ARGS(now, cfs_rq, se, ret), 1); + +DECLARE_RESTRICTED_HOOK(android_rvh_update_load_avg_cfs_rq, + TP_PROTO(u64 now, struct cfs_rq *cfs_rq, int *ret), + TP_ARGS(now, cfs_rq, ret), 1); + +DECLARE_RESTRICTED_HOOK(android_rvh_update_rt_rq_load_avg_internal, + TP_PROTO(u64 now, struct rq *rq, int running, int *ret), + TP_ARGS(now, rq, running, ret), 1); /* macro versions of hooks are no longer required */ #endif /* _TRACE_HOOK_SCHED_H */ diff --git a/kernel/sched/pelt.c b/kernel/sched/pelt.c index 81ef2a3c6bd3..9afaa32a467f 100644 --- a/kernel/sched/pelt.c +++ b/kernel/sched/pelt.c @@ -294,6 +294,12 @@ ___update_load_avg(struct sched_avg *sa, unsigned long load) int __update_load_avg_blocked_se(u64 now, struct sched_entity *se) { + int ret = -1; + + trace_android_rvh_update_load_avg_blocked_se(now, se, &ret); + if (ret != -1) + return ret; + if (___update_load_sum(now, &se->avg, 0, 0, 0)) { ___update_load_avg(&se->avg, se_weight(se)); trace_pelt_se_tp(se); @@ -306,6 +312,12 @@ EXPORT_SYMBOL_GPL(__update_load_avg_blocked_se); int __update_load_avg_se(u64 now, struct cfs_rq *cfs_rq, struct sched_entity *se) { + int ret = -1; + + trace_android_rvh_update_load_avg_se(now, cfs_rq, se, &ret); + if (ret != -1) + return ret; + if (___update_load_sum(now, &se->avg, !!se->on_rq, se_runnable(se), cfs_rq->curr == se)) { @@ -320,6 +332,12 @@ int __update_load_avg_se(u64 now, struct cfs_rq *cfs_rq, struct sched_entity *se int __update_load_avg_cfs_rq(u64 now, struct cfs_rq *cfs_rq) { + int ret = -1; + + trace_android_rvh_update_load_avg_cfs_rq(now, cfs_rq, &ret); + if (ret != -1) + return ret; + if (___update_load_sum(now, &cfs_rq->avg, scale_load_down(cfs_rq->load.weight), cfs_rq->h_nr_running, @@ -346,6 +364,12 @@ int __update_load_avg_cfs_rq(u64 now, struct cfs_rq *cfs_rq) int update_rt_rq_load_avg(u64 now, struct rq *rq, int running) { + int ret = -1; + + trace_android_rvh_update_rt_rq_load_avg_internal(now, rq, running, &ret); + if (ret != -1) + return ret; + if (___update_load_sum(now, &rq->avg_rt, running, running, diff --git a/kernel/sched/pelt.h b/kernel/sched/pelt.h index cbd8b8463eff..aa852a8635d0 100644 --- a/kernel/sched/pelt.h +++ b/kernel/sched/pelt.h @@ -1,4 +1,5 @@ #ifdef CONFIG_SMP +#include #include "sched-pelt.h" int __update_load_avg_blocked_se(u64 now, struct sched_entity *se); @@ -103,6 +104,12 @@ static inline void _update_idle_rq_clock_pelt(struct rq *rq) */ static inline void update_rq_clock_pelt(struct rq *rq, s64 delta) { + int ret = 0; + + trace_android_rvh_update_rq_clock_pelt(rq, delta, &ret); + if (ret) + return; + if (unlikely(is_idle_task(rq->curr))) { _update_idle_rq_clock_pelt(rq); return; diff --git a/kernel/sched/vendor_hooks.c b/kernel/sched/vendor_hooks.c index 9458814eb037..7498b944e609 100644 --- a/kernel/sched/vendor_hooks.c +++ b/kernel/sched/vendor_hooks.c @@ -99,3 +99,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_cpus_allowed_ptr); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_update_blocked_fair); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_task_comm); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_sugov_update); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_update_rq_clock_pelt); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_update_load_avg_blocked_se); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_update_load_avg_se); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_update_load_avg_cfs_rq); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_update_rt_rq_load_avg_internal);