From 480541041d692eb452b5b58892e7402de5a826c5 Mon Sep 17 00:00:00 2001 From: zhouxuewen Date: Tue, 9 Apr 2024 10:51:17 +0800 Subject: [PATCH] ANDROID: vendor_hooks: add hook tick_nohz_idle_stop_tick This hook will allow to stop extra timers that is created during scheduler_tick. The background is described as follows: 1) In some cases, we find the 4ms tick is not enough for task scheduling so we will start a new timer in scheduler_tick to do extra task scheduling. The hook in scheduler_tick already exists but when cpus enter idle, the timer needs to be stopped for saving power (same logic as nohz idle). 2) We can get about 7% power saving without hurting the performance in certain use case after enabled this feature. 3) Actually we are considering to upstream it to mainline kernel but it can takes time to get really merged. An initial submit is preferred to get the community noticed the potential optimized point. Bug: 333160399 Change-Id: Ie97599ef562def39e13716adfc7cddef14b72075 Signed-off-by: zhouxuewen --- include/trace/hooks/sched.h | 3 +++ kernel/sched/vendor_hooks.c | 1 + kernel/time/tick-sched.c | 2 ++ 3 files changed, 6 insertions(+) diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index a18561eb2b00..ae7beb250686 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -473,6 +473,9 @@ DECLARE_RESTRICTED_HOOK(android_rvh_dequeue_entity_delayed, TP_PROTO(struct cfs_rq *cfs_rq, struct sched_entity *se, bool *delay), TP_ARGS(cfs_rq, se, delay), 1); +DECLARE_HOOK(android_vh_tick_nohz_idle_stop_tick, + TP_PROTO(void *unused), + TP_ARGS(unused)); /* macro versions of hooks are no longer required */ #endif /* _TRACE_HOOK_SCHED_H */ diff --git a/kernel/sched/vendor_hooks.c b/kernel/sched/vendor_hooks.c index d75c93cba41c..8b338e9c740b 100644 --- a/kernel/sched/vendor_hooks.c +++ b/kernel/sched/vendor_hooks.c @@ -116,6 +116,7 @@ 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); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_tick_nohz_idle_stop_tick); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_map_util_freq); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_reweight_entity); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sched_move_task); diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index a93b3fe37c05..ed59a40bbf60 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -1216,6 +1216,8 @@ void tick_nohz_idle_stop_tick(void) int cpu = smp_processor_id(); ktime_t expires; + trace_android_vh_tick_nohz_idle_stop_tick(NULL); + /* * If tick_nohz_get_sleep_length() ran tick_nohz_next_event(), the * tick timer expiration time is known already.