lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 05 Feb 2010 09:08:20 -0500 From: Steven Rostedt <rostedt@...dmis.org> To: Frederic Weisbecker <fweisbec@...il.com> Cc: Ingo Molnar <mingo@...e.hu>, LKML <linux-kernel@...r.kernel.org>, Peter Zijlstra <peterz@...radead.org>, Arnaldo Carvalho de Melo <acme@...hat.com>, Paul Mackerras <paulus@...ba.org>, Hitoshi Mitake <mitake@....info.waseda.ac.jp>, Li Zefan <lizf@...fujitsu.com>, Lai Jiangshan <laijs@...fujitsu.com>, Masami Hiramatsu <mhiramat@...hat.com>, Jens Axboe <jens.axboe@...cle.com>, Johannes Berg <johannes@...solutions.net> Subject: Re: [PATCH 02/11] tracing: Introduce TRACE_EVENT_INJECT On Wed, 2010-02-03 at 10:14 +0100, Frederic Weisbecker wrote: > TRACE_EVENT_INJECT macro is the same as TRACE_EVENT but takes one > more parameter that defines an "inject" callback to be called when > the event is enabled. I was just talking with Johannes about this. > This is useful when we need to catch up with events that have > already occured but that are required for the user. > > Signed-off-by: Frederic Weisbecker <fweisbec@...il.com> > Cc: Peter Zijlstra <peterz@...radead.org> > Cc: Arnaldo Carvalho de Melo <acme@...hat.com> > Cc: Steven Rostedt <rostedt@...dmis.org> > Cc: Paul Mackerras <paulus@...ba.org> > Cc: Hitoshi Mitake <mitake@....info.waseda.ac.jp> > Cc: Li Zefan <lizf@...fujitsu.com> > Cc: Lai Jiangshan <laijs@...fujitsu.com> > Cc: Masami Hiramatsu <mhiramat@...hat.com> > Cc: Jens Axboe <jens.axboe@...cle.com> > --- > include/linux/ftrace_event.h | 1 + > include/linux/tracepoint.h | 3 +++ > include/trace/define_trace.h | 6 ++++++ > include/trace/ftrace.h | 31 ++++++++++++++++++++++++++++++- > kernel/trace/trace_events.c | 3 +++ > 5 files changed, 43 insertions(+), 1 deletions(-) > > diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h > index cd95919..026d39b 100644 > --- a/include/linux/ftrace_event.h > +++ b/include/linux/ftrace_event.h > @@ -126,6 +126,7 @@ struct ftrace_event_call { > int (*show_format)(struct ftrace_event_call *, > struct trace_seq *); > int (*define_fields)(struct ftrace_event_call *); > + void (*inject)(void); > struct list_head fields; > int filter_active; > struct event_filter *filter; > diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h > index f59604e..f114aec 100644 > --- a/include/linux/tracepoint.h > +++ b/include/linux/tracepoint.h > @@ -291,5 +291,8 @@ static inline void tracepoint_synchronize_unregister(void) > #define TRACE_EVENT_FN(name, proto, args, struct, \ > assign, print, reg, unreg) \ > DECLARE_TRACE(name, PARAMS(proto), PARAMS(args)) > +#define TRACE_EVENT_INJECT(name, proto, args, struct, \ > + assign, print, inject) \ I would much rather not add this macro and instead make a register_event_callback() that a process could register. Actually, I was thinking of something even a bit more functional: Creating a command file in the event directory along with format,filter and id. It would default with: trace, or ftrace if you want it to be specific to ftrace. Then we could add: echo perf > command which would make the call back call the perf command instead of the ftrace one. Or use >> to call both commands. So instead of making an unique MACRO that is very stale, I would rather change the structure to be much more generic. This way you could do something like: register_event_command(event, "perf_inject", perf_inject, data); And when the event is enabled, it would call the perf_inject function. How does this sound to you? Note, this may also clean up some of ftrace.h too. -- Steve > + DECLARE_TRACE(name, PARAMS(proto), PARAMS(args)) > > #endif /* ifdef TRACE_EVENT (see note above) */ > diff --git a/include/trace/define_trace.h b/include/trace/define_trace.h > index 5acfb1e..41f7ce3 100644 > --- a/include/trace/define_trace.h > +++ b/include/trace/define_trace.h > @@ -31,6 +31,11 @@ > assign, print, reg, unreg) \ > DEFINE_TRACE_FN(name, reg, unreg) > > +#undef TRACE_EVENT_INJECT > +#define TRACE_EVENT_INJECT(name, proto, args, tstruct, \ > + assign, print, inject) \ > + DEFINE_TRACE(name) > + > #undef DEFINE_EVENT > #define DEFINE_EVENT(template, name, proto, args) \ > DEFINE_TRACE(name) > @@ -71,6 +76,7 @@ > > #undef TRACE_EVENT > #undef TRACE_EVENT_FN > +#undef TRACE_EVENT_INJECT > #undef DECLARE_EVENT_CLASS > #undef DEFINE_EVENT > #undef DEFINE_EVENT_PRINT > diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h > index f2c09e4..869da37 100644 > --- a/include/trace/ftrace.h > +++ b/include/trace/ftrace.h > @@ -37,6 +37,26 @@ > PARAMS(print)); \ > DEFINE_EVENT(name, name, PARAMS(proto), PARAMS(args)); > > +/* > + * TRACE_EVENT_INJECT creates an event that has an injector callback > + * to call when the trace event is enabled, usually to trigger > + * automatically some necessary initial traces. > + */ > +#undef TRACE_EVENT_INJECT > +#define TRACE_EVENT_INJECT(name, proto, args, tstruct, \ > + assign, print, inject) \ > + DECLARE_EVENT_CLASS(name, \ > + PARAMS(proto), \ > + PARAMS(args), \ > + PARAMS(tstruct), \ > + PARAMS(assign), \ > + PARAMS(print)); \ > + DEFINE_EVENT_INJECT(name, name, PARAMS(proto), PARAMS(args), inject); > + > +#undef DEFINE_EVENT_INJECT > +#define DEFINE_EVENT_INJECT(template, name, proto, args, inject) \ > + DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)); > + > > #undef __field > #define __field(type, item) type item; > @@ -726,7 +746,11 @@ static struct trace_event ftrace_event_type_##call = { \ > #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) > > #undef DEFINE_EVENT > -#define DEFINE_EVENT(template, call, proto, args) \ > +#define DEFINE_EVENT(template, call, proto, args) \ > + DEFINE_EVENT_INJECT(template, call, PARAMS(proto), PARAMS(proto), NULL) > + > +#undef DEFINE_EVENT_INJECT > +#define DEFINE_EVENT_INJECT(template, call, proto, args, injector) \ > \ > static struct ftrace_event_call __used \ > __attribute__((__aligned__(4))) \ > @@ -739,6 +763,7 @@ __attribute__((section("_ftrace_events"))) event_##call = { \ > .unregfunc = ftrace_raw_unreg_event_##call, \ > .show_format = ftrace_format_##template, \ > .define_fields = ftrace_define_fields_##template, \ > + .inject = injector, \ > _TRACE_PROFILE_INIT(call) \ > } > > @@ -877,6 +902,10 @@ ftrace_profile_templ_##call(struct ftrace_event_call *event_call, \ > __count, irq_flags); \ > } > > +#undef DEFINE_EVENT_INJECT > +#define DEFINE_EVENT_INJECT(template, call, proto, args, inject) \ > + DEFINE_EVENT(template, call, PARAMS(proto), PARAMS(args)) > + > #undef DEFINE_EVENT > #define DEFINE_EVENT(template, call, proto, args) \ > static void ftrace_profile_##call(proto) \ > diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c > index 189b09b..5c75cc7 100644 > --- a/kernel/trace/trace_events.c > +++ b/kernel/trace/trace_events.c > @@ -142,6 +142,9 @@ static int ftrace_event_enable_disable(struct ftrace_event_call *call, > break; > } > call->enabled = 1; > + > + if (call->inject) > + call->inject(); > } > break; > } -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists