From 09de85d415c6ff6198411793e893e08340132fcc Mon Sep 17 00:00:00 2001 From: Lingutla Chandrasekhar Date: Fri, 1 Mar 2019 17:17:09 +0530 Subject: [PATCH 1/3] trace: Add trace points for tasklet entry/exit Tasklets are supposed to finish their work quickly and should not block the current running process, but it is not guaranteed that. Currently softirq_entry/exit can be used to know total tasklets execution time, but not helpful to track individual tasklet's execution time. With that we can't find any culprit tasklet function, which is taking more time. Add tasklet_entry/exit trace point support to track individual tasklet execution. Change-Id: I3496d15f64d020916774e673ccb4a8116ea2f2c9 Signed-off-by: Lingutla Chandrasekhar [satyap@codeaurora.org: remove hi trace points and update commit text] Signed-off-by: Satya Durga Srinivasu Prabhala --- include/trace/events/irq.h | 31 +++++++++++++++++++++++++++++++ kernel/softirq.c | 2 ++ 2 files changed, 33 insertions(+) diff --git a/include/trace/events/irq.h b/include/trace/events/irq.h index eeceafaaea4c..c12f40463f4c 100644 --- a/include/trace/events/irq.h +++ b/include/trace/events/irq.h @@ -160,6 +160,37 @@ DEFINE_EVENT(softirq, softirq_raise, TP_ARGS(vec_nr) ); +DECLARE_EVENT_CLASS(tasklet, + + TP_PROTO(void *func), + + TP_ARGS(func), + + TP_STRUCT__entry( + __field( void *, func) + ), + + TP_fast_assign( + __entry->func = func; + ), + + TP_printk("function=%ps", __entry->func) +); + +DEFINE_EVENT(tasklet, tasklet_entry, + + TP_PROTO(void *func), + + TP_ARGS(func) +); + +DEFINE_EVENT(tasklet, tasklet_exit, + + TP_PROTO(void *func), + + TP_ARGS(func) +); + #endif /* _TRACE_IRQ_H */ /* This part must be outside protection */ diff --git a/kernel/softirq.c b/kernel/softirq.c index 13edfcbb71c8..0ee55ec4f7a0 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -523,7 +523,9 @@ static void tasklet_action_common(struct softirq_action *a, if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) BUG(); + trace_tasklet_entry(t->func); t->func(t->data); + trace_tasklet_exit(t->func); tasklet_unlock(t); continue; } From 0a016eaf4fb9fdff1b30710d2d40667bc2a114d5 Mon Sep 17 00:00:00 2001 From: Santosh Mardi Date: Thu, 20 Feb 2020 16:37:32 +0530 Subject: [PATCH 2/3] sched: use rq_clock if WALT is not enabled Use rq_clock to send timestamp to util update handler if WALT is not enabled in the system. Change-Id: I1e367c506a2fc286a4dfbac9d1f6cdd897d31f2d Signed-off-by: Santosh Mardi --- kernel/sched/sched.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 714e874b975e..9b7fe83074b9 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -2169,7 +2169,7 @@ cpu_util_freq_walt(int cpu, struct sched_walt_cpu_load *walt_load); #define sched_ravg_window TICK_NSEC static inline u64 sched_ktime_clock(void) { - return 0; + return sched_clock(); } #endif @@ -2646,16 +2646,20 @@ DECLARE_PER_CPU(struct update_util_data __rcu *, cpufreq_update_util_data); static inline void cpufreq_update_util(struct rq *rq, unsigned int flags) { struct update_util_data *data; + u64 clock; #ifdef CONFIG_SCHED_WALT if (!(flags & SCHED_CPUFREQ_WALT)) return; + clock = sched_ktime_clock(); +#else + clock = rq_clock(rq); #endif data = rcu_dereference_sched(*per_cpu_ptr(&cpufreq_update_util_data, cpu_of(rq))); if (data) - data->func(data, sched_ktime_clock(), flags); + data->func(data, clock, flags); } #else static inline void cpufreq_update_util(struct rq *rq, unsigned int flags) {} From 538d90229e4667c89beeaf2b9e6f22f3941c6bfb Mon Sep 17 00:00:00 2001 From: Pavankumar Kondeti Date: Thu, 20 Feb 2020 09:00:19 +0530 Subject: [PATCH 3/3] sched: walt: move walt_stats member in cfs_rq under CFS_BANDWIDTH The walt_stats member (walt_sched_stats structure) defined in cfs_rq is only needed when CFS_BANDWIDTH feature is enabled. So add this member under CFS_BANDWIDTH feature in cfs_rq structure. Change-Id: I9ddfb00da3377a66a18522eaecdb8b0f76517e8e Signed-off-by: Pavankumar Kondeti --- kernel/sched/sched.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 9b7fe83074b9..6bd0fcbcab99 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -650,11 +650,10 @@ struct cfs_rq { struct list_head leaf_cfs_rq_list; struct task_group *tg; /* group that "owns" this runqueue */ +#ifdef CONFIG_CFS_BANDWIDTH #ifdef CONFIG_SCHED_WALT struct walt_sched_stats walt_stats; #endif - -#ifdef CONFIG_CFS_BANDWIDTH int runtime_enabled; s64 runtime_remaining;