From 196f030712e556453deb0a30ed7465ea9ac8f4f4 Mon Sep 17 00:00:00 2001 From: renchenghan Date: Tue, 29 Jul 2025 19:45:01 +0800 Subject: [PATCH] ANDROID: GKI: add fair task core selection logic vendor hooks. The hook we added allows prioritization of task selection from our own queue, reducing the overhead of task selection while optimizing the logic for load balancing and selecting important tasks. Bug: 434879809 Signed-off-by: renchenghan Change-Id: Iec0292d0c991c69d48771ee4568ca8393b96cca8 --- include/trace/hooks/sched.h | 9 +++++++++ kernel/sched/fair.c | 10 +++++++--- kernel/sched/vendor_hooks.c | 4 ++-- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index faf0d91160db..f0d0f15c535a 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -387,6 +387,15 @@ DECLARE_RESTRICTED_HOOK(android_rvh_remove_entity_load_avg, TP_PROTO(struct cfs_rq *cfs_rq, struct sched_entity *se), TP_ARGS(cfs_rq, se), 1); +DECLARE_RESTRICTED_HOOK(android_rvh_before_pick_task_fair, + TP_PROTO(struct rq *rq, struct task_struct **p, + struct task_struct *prev, struct rq_flags *rf), + TP_ARGS(rq, p, prev, rf), 1); + +DECLARE_RESTRICTED_HOOK(android_rvh_balance_fair, + TP_PROTO(struct rq *rq, struct task_struct *prev, struct rq_flags *rf), + TP_ARGS(rq, prev, rf), 1); + struct affinity_context; DECLARE_RESTRICTED_HOOK(android_rvh_set_cpus_allowed_ptr, TP_PROTO(struct task_struct *p, struct affinity_context *ctx, bool *skip_user_ptr), diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 1d091b3e200c..03f211423017 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -8961,6 +8961,7 @@ static void set_cpus_allowed_fair(struct task_struct *p, struct affinity_context static int balance_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) { + trace_android_rvh_balance_fair(rq, prev, rf); if (sched_fair_runnable(rq)) return 1; @@ -9120,12 +9121,15 @@ struct task_struct * pick_next_task_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) { struct sched_entity *se; - struct task_struct *p; + struct task_struct *p = NULL; int new_tasks; again: - p = pick_task_fair(rq); - trace_android_rvh_replace_next_task_fair(rq, &p, prev); + trace_android_rvh_before_pick_task_fair(rq, &p, prev, rf); + if (!p) { + p = pick_task_fair(rq); + trace_android_rvh_replace_next_task_fair(rq, &p, prev); + } if (!p) goto idle; diff --git a/kernel/sched/vendor_hooks.c b/kernel/sched/vendor_hooks.c index 7a14bff67655..cb1d6f57cf85 100644 --- a/kernel/sched/vendor_hooks.c +++ b/kernel/sched/vendor_hooks.c @@ -134,5 +134,5 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_set_sugov_sched_attr); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_iowait); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_uclamp_validate); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_util_fits_cpu); - - +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_before_pick_task_fair); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_balance_fair);