Messages in this thread Patch in this message | | | From | Muchun Song <> | Subject | [PATCH] tasklet: Introduce tasklet tracepoints | Date | Sat, 5 Sep 2020 14:04:12 +0800 |
| |
Introduce tracepoints for tasklets just like softirq does. In this case, we can calculate tasklet latency and know what tasklet run.
Signed-off-by: Muchun Song <songmuchun@bytedance.com> --- include/trace/events/irq.h | 44 ++++++++++++++++++++++++++++++++++++++ kernel/softirq.c | 2 ++ 2 files changed, 46 insertions(+)
diff --git a/include/trace/events/irq.h b/include/trace/events/irq.h index eeceafaaea4c..69a16f3a21c2 100644 --- a/include/trace/events/irq.h +++ b/include/trace/events/irq.h @@ -160,6 +160,50 @@ DEFINE_EVENT(softirq, softirq_raise, TP_ARGS(vec_nr) ); +DECLARE_EVENT_CLASS(tasklet, + + TP_PROTO(struct tasklet_struct *t), + + TP_ARGS(t), + + TP_STRUCT__entry( + __field( void *, callback ) + ), + + TP_fast_assign( + __entry->callback = t->callback; + ), + + TP_printk("callback=%ps", __entry->callback) +); + +/** + * tasklet_entry - called immediately before the tasklet handler + * @t: pointer to struct tasklet_struct + * + * When used in combination with the tasklet_exit tracepoint + * we can determine the tasklet handler routine. + */ +DEFINE_EVENT(tasklet, tasklet_entry, + + TP_PROTO(struct tasklet_struct *t), + + TP_ARGS(t) +); + +/** + * tasklet_exit - called immediately after the tasklet handler returns + * @t: pointer to struct tasklet_struct + * + * When used in combination with the tasklet_entry tracepoint + * we can determine the tasklet handler routine. + */ +DEFINE_EVENT(tasklet, tasklet_exit, + + TP_PROTO(struct tasklet_struct *t), + + TP_ARGS(t) +); #endif /* _TRACE_IRQ_H */ /* This part must be outside protection */ diff --git a/kernel/softirq.c b/kernel/softirq.c index bf88d7f62433..0f9f5b2cc3d3 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -553,10 +553,12 @@ static void tasklet_action_common(struct softirq_action *a, if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) BUG(); + trace_tasklet_entry(t); if (t->use_callback) t->callback(t); else t->func(t->data); + trace_tasklet_exit(t); tasklet_unlock(t); continue; } -- 2.20.1
| |