FROMLIST: 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. This patch has been carried in the Android tree for awhile so I wanted to submit it for review upstream. Feedback would be appreciated! Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: "Paul E. McKenney" <paulmck@kernel.org> Cc: Connor O'Brien <connoro@google.com> Cc: kernel-team@android.com Signed-off-by: Lingutla Chandrasekhar <clingutla@codeaurora.org> [elavila: Port to android-mainline] Signed-off-by: J. Avila <elavila@google.com> [jstultz: Rebased to upstream, cut unused trace points, added comments for the tracepoints, reworded commit] Signed-off-by: John Stultz <jstultz@google.com> Link: https://lore.kernel.org/lkml/20221213185310.1315794-1-jstultz@google.com/ Bug: 168521633 Change-Id: I3944fcedffae54a5f761d0b18ff1c41d2c3e4aeb
This commit is contained in:
parent
f302663810
commit
b20490aa50
@ -160,6 +160,49 @@ 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)
|
||||
);
|
||||
|
||||
/**
|
||||
* tasklet_entry - called immediately before the tasklet is run
|
||||
* @func: tasklet callback or function being run
|
||||
*
|
||||
* Used to find individual tasklet execution time
|
||||
*/
|
||||
DEFINE_EVENT(tasklet, tasklet_entry,
|
||||
|
||||
TP_PROTO(void *func),
|
||||
|
||||
TP_ARGS(func)
|
||||
);
|
||||
|
||||
/**
|
||||
* tasklet_exit - called immediately after the tasklet is run
|
||||
* @func: tasklet callback or function being run
|
||||
*
|
||||
* Used to find individual tasklet execution time
|
||||
*/
|
||||
DEFINE_EVENT(tasklet, tasklet_exit,
|
||||
|
||||
TP_PROTO(void *func),
|
||||
|
||||
TP_ARGS(func)
|
||||
);
|
||||
|
||||
#endif /* _TRACE_IRQ_H */
|
||||
|
||||
/* This part must be outside protection */
|
||||
|
@ -838,10 +838,15 @@ static void tasklet_action_common(struct softirq_action *a,
|
||||
if (tasklet_trylock(t)) {
|
||||
if (!atomic_read(&t->count)) {
|
||||
if (tasklet_clear_sched(t)) {
|
||||
if (t->use_callback)
|
||||
if (t->use_callback) {
|
||||
trace_tasklet_entry(t->callback);
|
||||
t->callback(t);
|
||||
else
|
||||
trace_tasklet_exit(t->callback);
|
||||
} else {
|
||||
trace_tasklet_entry(t->func);
|
||||
t->func(t->data);
|
||||
trace_tasklet_exit(t->func);
|
||||
}
|
||||
}
|
||||
tasklet_unlock(t);
|
||||
continue;
|
||||
|
Loading…
Reference in New Issue
Block a user