From aec40de3d7a3c95b021ef1f85df85df080dea022 Mon Sep 17 00:00:00 2001 From: Shaleen Agrawal Date: Tue, 3 May 2022 15:56:24 -0700 Subject: [PATCH] ANDROID: cputime: seprate irq entry and exit tracehooks Currently the code has single hook for tracking irqs. However modules need to deduce start and end of the irq. Create separate hooks for irq start and end since the cputime has already figured it out. Bug: 231341763 Change-Id: Ie0dd503b283d83f69d01171ebd1cd6127c3bafd0 Signed-off-by: Shaleen Agrawal Signed-off-by: Ashay Jaiswal --- drivers/android/vendor_hooks.c | 2 ++ include/trace/hooks/sched.h | 8 ++++++++ kernel/sched/cputime.c | 13 +++++++++++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 790fda8cd93d..8ffa2fbe7c3d 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -153,6 +153,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_schedule); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_sched_cpu_starting); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_sched_cpu_dying); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_account_irq); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_account_irq_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_account_irq_end); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_place_entity); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_build_perf_domains); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_update_cpu_capacity); diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index 3a66ac2cadb3..78320e7848f6 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -203,6 +203,14 @@ DECLARE_RESTRICTED_HOOK(android_rvh_account_irq, TP_PROTO(struct task_struct *curr, int cpu, s64 delta), TP_ARGS(curr, cpu, delta), 1); +DECLARE_RESTRICTED_HOOK(android_rvh_account_irq_start, + TP_PROTO(struct task_struct *curr, int cpu, s64 delta), + TP_ARGS(curr, cpu, delta), 1); + +DECLARE_RESTRICTED_HOOK(android_rvh_account_irq_end, + TP_PROTO(struct task_struct *curr, int cpu, s64 delta), + TP_ARGS(curr, cpu, delta), 1); + struct sched_entity; DECLARE_RESTRICTED_HOOK(android_rvh_place_entity, TP_PROTO(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial, u64 *vruntime), diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c index a7e465d6e6ad..9a21091feb96 100644 --- a/kernel/sched/cputime.c +++ b/kernel/sched/cputime.c @@ -56,6 +56,7 @@ void irqtime_account_irq(struct task_struct *curr, unsigned int offset) unsigned int pc; s64 delta; int cpu; + bool irq_start = true; if (!sched_clock_irqtime) return; @@ -71,12 +72,20 @@ void irqtime_account_irq(struct task_struct *curr, unsigned int offset) * in that case, so as not to confuse scheduler with a special task * that do not consume any time, but still wants to run. */ - if (pc & HARDIRQ_MASK) + if (pc & HARDIRQ_MASK) { irqtime_account_delta(irqtime, delta, CPUTIME_IRQ); - else if ((pc & SOFTIRQ_OFFSET) && curr != this_cpu_ksoftirqd()) + irq_start = false; + } else if ((pc & SOFTIRQ_OFFSET) && curr != this_cpu_ksoftirqd()) { irqtime_account_delta(irqtime, delta, CPUTIME_SOFTIRQ); + irq_start = false; + } trace_android_rvh_account_irq(curr, cpu, delta); + + if (irq_start) + trace_android_rvh_account_irq_start(curr, cpu, delta); + else + trace_android_rvh_account_irq_end(curr, cpu, delta); } static u64 irqtime_tick_accounted(u64 maxtime)