Messages in this thread Patch in this message | | | Date | Fri, 18 Sep 2020 12:46:00 -0400 | From | Steven Rostedt <> | Subject | Re: [PATCH] tasklet: Introduce tasklet tracepoints |
| |
On Sat, 5 Sep 2020 14:04:12 +0800 Muchun Song <songmuchun@bytedance.com> wrote:
> 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;
I think you need to replicate the logic in the code:
if (t->use_callback) __entry->callback = t->callback; else __entry->callback = t->func;
-- Steve
> + ), > + > + 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; > }
| |