Re: [PATCH 6/7] add syscall tracepoints

From: Jason Baron
Date: Fri Jun 19 2009 - 17:51:27 EST


On Fri, Jun 19, 2009 at 04:28:26AM +0200, Frederic Weisbecker wrote:
> On Fri, Jun 12, 2009 at 05:25:04PM -0400, Jason Baron wrote:
> > Allow the return value of raw_init() to bail us out of creating a trace event
> > file.
> >
> > Signed-off-by: Jason Baron <jbaron@xxxxxxxxxx>
> >
> > ---
> > kernel/trace/trace_events.c | 29 +++++++++++++++++++----------
> > 1 files changed, 19 insertions(+), 10 deletions(-)
> >
> > diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
> > index 9e91c4a..c0da5e2 100644
> > --- a/kernel/trace/trace_events.c
> > +++ b/kernel/trace/trace_events.c
> > @@ -907,15 +907,6 @@ event_create_dir(struct ftrace_event_call *call, struct dentry *d_events,
> > if (strcmp(call->system, TRACE_SYSTEM) != 0)
> > d_events = event_subsystem_dir(call->system, d_events);
> >
> > - if (call->raw_init) {
> > - ret = call->raw_init();
> > - if (ret < 0) {
> > - pr_warning("Could not initialize trace point"
> > - " events/%s\n", call->name);
> > - return ret;
> > - }
> > - }
> > -
> > call->dir = debugfs_create_dir(call->name, d_events);
> > if (!call->dir) {
> > pr_warning("Could not create debugfs "
> > @@ -1014,6 +1005,7 @@ static void trace_module_add_events(struct module *mod)
> > struct ftrace_module_file_ops *file_ops = NULL;
> > struct ftrace_event_call *call, *start, *end;
> > struct dentry *d_events;
> > + int ret;
> >
> > start = mod->trace_events;
> > end = mod->trace_events + mod->num_trace_events;
> > @@ -1029,7 +1021,15 @@ static void trace_module_add_events(struct module *mod)
> > /* The linker may leave blanks */
> > if (!call->name)
> > continue;
> > -
> > + if (call->raw_init) {
> > + ret = call->raw_init();
> > + if (ret < 0) {
> > + if (ret != -ENOSYS)
>
>
>
> I see you've set it up in case syscall_to_nr doesn't find the
> matching metadata.
>
> How is it possible? The traced syscalls, ie those which are defined through
> DEFINE_SYSCALLx(), should be all in the arch syscall table. Or may be I'm
> missing something?
>

yes, I've been wondering about the same thing...I think the answer is
that DEFINE_SYSCALLx() is used to define some of the 'compat' layer ia32
syscalls. Thus, they show up as events to register but they are not in
the syscall table. I'm not sure if its easy to handle these at compile
time, but in any case that is where this case is coming from...

I've also notice that I forgot to define the meta data for
SYSCALL_DEFINE0 case...

thanks,

-Jason
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/