tracing: Move print functions into event class
authorSteven Rostedt <srostedt@redhat.com>
Fri, 23 Apr 2010 14:00:22 +0000 (10:00 -0400)
committerSteven Rostedt <rostedt@goodmis.org>
Fri, 14 May 2010 18:20:34 +0000 (14:20 -0400)
Currently, every event has its own trace_event structure. This is
fine since the structure is needed anyway. But the print function
structure (trace_event_functions) is now separate. Since the output
of the trace event is done by the class (with the exception of events
defined by DEFINE_EVENT_PRINT), it makes sense to have the class
define the print functions that all events in the class can use.

This makes a bigger deal with the syscall events since all syscall events
use the same class. The savings here is another 30K.

   text    data     bss     dec     hex filename
4913961 1088356  861512 6863829  68bbd5 vmlinux.orig
4900382 1048964  861512 6810858  67ecea vmlinux.init
4900446 1049028  861512 6810986  67ed6a vmlinux.preprint
4895024 1023812  861512 6780348  6775bc vmlinux.print

To accomplish this, and to let the class know what event is being
printed, the event structure is embedded in the ftrace_event_call
structure. This should not be an issues since the event structure
was created for each event anyway.

Acked-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Acked-by: Masami Hiramatsu <mhiramat@redhat.com>
Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
include/linux/ftrace_event.h
include/linux/syscalls.h
include/trace/ftrace.h
kernel/trace/trace_events.c
kernel/trace/trace_kprobe.c
kernel/trace/trace_syscalls.c

index 4f77932b09832a80c96e9b7664c5f6bf87c62ffc..b1a007d6e8fd7c6ae97ab1474fabffae57ecc491 100644 (file)
@@ -148,7 +148,7 @@ struct ftrace_event_call {
        struct ftrace_event_class *class;
        char                    *name;
        struct dentry           *dir;
-       struct trace_event      *event;
+       struct trace_event      event;
        int                     enabled;
        int                     id;
        const char              *print_fmt;
index f7256770a20f4e00c7194d8ed17808d27fb5e2f7..a1a86a53bc735c13cdda531309aa6c8158231909 100644 (file)
@@ -120,24 +120,20 @@ struct perf_event_attr;
 
 extern struct ftrace_event_class event_class_syscall_enter;
 extern struct ftrace_event_class event_class_syscall_exit;
+extern struct trace_event_functions enter_syscall_print_funcs;
+extern struct trace_event_functions exit_syscall_print_funcs;
 
 #define SYSCALL_TRACE_ENTER_EVENT(sname)                               \
        static struct syscall_metadata __syscall_meta_##sname;          \
        static struct ftrace_event_call                                 \
        __attribute__((__aligned__(4))) event_enter_##sname;            \
-       static struct trace_event_functions enter_syscall_print_funcs_##sname = { \
-               .trace                  = print_syscall_enter,          \
-       };                                                              \
-       static struct trace_event enter_syscall_print_##sname = {       \
-               .funcs                  = &enter_syscall_print_funcs_##sname, \
-       };                                                              \
        static struct ftrace_event_call __used                          \
          __attribute__((__aligned__(4)))                               \
          __attribute__((section("_ftrace_events")))                    \
          event_enter_##sname = {                                       \
                .name                   = "sys_enter"#sname,            \
                .class                  = &event_class_syscall_enter,   \
-               .event                  = &enter_syscall_print_##sname, \
+               .event.funcs            = &enter_syscall_print_funcs,   \
                .data                   = (void *)&__syscall_meta_##sname,\
        }
 
@@ -145,19 +141,13 @@ extern struct ftrace_event_class event_class_syscall_exit;
        static struct syscall_metadata __syscall_meta_##sname;          \
        static struct ftrace_event_call                                 \
        __attribute__((__aligned__(4))) event_exit_##sname;             \
-       static struct trace_event_functions exit_syscall_print_funcs_##sname = { \
-               .trace                  = print_syscall_exit,           \
-       };                                                              \
-       static struct trace_event exit_syscall_print_##sname = {        \
-               .funcs                  = &exit_syscall_print_funcs_##sname, \
-       };                                                              \
        static struct ftrace_event_call __used                          \
          __attribute__((__aligned__(4)))                               \
          __attribute__((section("_ftrace_events")))                    \
          event_exit_##sname = {                                        \
                .name                   = "sys_exit"#sname,             \
                .class                  = &event_class_syscall_exit,    \
-               .event                  = &exit_syscall_print_##sname,  \
+               .event.funcs            = &exit_syscall_print_funcs,    \
                .data                   = (void *)&__syscall_meta_##sname,\
        }
 
index 51ed7f3568a55dd1a4ae94519d2986dfa832af53..824141d5cf04b4469f50fe07b1b4ee83f984706e 100644 (file)
 #undef DECLARE_EVENT_CLASS
 #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
 static notrace enum print_line_t                                       \
-ftrace_raw_output_id_##call(int event_id, const char *name,            \
-                           struct trace_iterator *iter, int flags)     \
+ftrace_raw_output_##call(struct trace_iterator *iter, int flags,       \
+                        struct trace_event *trace_event)               \
 {                                                                      \
+       struct ftrace_event_call *event;                                \
        struct trace_seq *s = &iter->seq;                               \
        struct ftrace_raw_##call *field;                                \
        struct trace_entry *entry;                                      \
        struct trace_seq *p;                                            \
        int ret;                                                        \
                                                                        \
+       event = container_of(trace_event, struct ftrace_event_call,     \
+                            event);                                    \
+                                                                       \
        entry = iter->ent;                                              \
                                                                        \
-       if (entry->type != event_id) {                                  \
+       if (entry->type != event->id) {                                 \
                WARN_ON_ONCE(1);                                        \
                return TRACE_TYPE_UNHANDLED;                            \
        }                                                               \
@@ -226,7 +230,7 @@ ftrace_raw_output_id_##call(int event_id, const char *name,         \
                                                                        \
        p = &get_cpu_var(ftrace_event_seq);                             \
        trace_seq_init(p);                                              \
-       ret = trace_seq_printf(s, "%s: ", name);                        \
+       ret = trace_seq_printf(s, "%s: ", event->name);                 \
        if (ret)                                                        \
                ret = trace_seq_printf(s, print);                       \
        put_cpu();                                                      \
@@ -234,17 +238,10 @@ ftrace_raw_output_id_##call(int event_id, const char *name,               \
                return TRACE_TYPE_PARTIAL_LINE;                         \
                                                                        \
        return TRACE_TYPE_HANDLED;                                      \
-}
-
-#undef DEFINE_EVENT
-#define DEFINE_EVENT(template, name, proto, args)                      \
-static notrace enum print_line_t                                       \
-ftrace_raw_output_##name(struct trace_iterator *iter, int flags,       \
-                        struct trace_event *event)                     \
-{                                                                      \
-       return ftrace_raw_output_id_##template(event_##name.id,         \
-                                              #name, iter, flags);     \
-}
+}                                                                      \
+static struct trace_event_functions ftrace_event_type_funcs_##call = { \
+       .trace                  = ftrace_raw_output_##call,             \
+};
 
 #undef DEFINE_EVENT_PRINT
 #define DEFINE_EVENT_PRINT(template, call, proto, args, print)         \
@@ -277,7 +274,10 @@ ftrace_raw_output_##call(struct trace_iterator *iter, int flags,   \
                return TRACE_TYPE_PARTIAL_LINE;                         \
                                                                        \
        return TRACE_TYPE_HANDLED;                                      \
-}
+}                                                                      \
+static struct trace_event_functions ftrace_event_type_funcs_##call = { \
+       .trace                  = ftrace_raw_output_##call,             \
+};
 
 #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
 
@@ -533,20 +533,13 @@ ftrace_raw_event_##call(void *__data, proto)                              \
 
 #undef DEFINE_EVENT
 #define DEFINE_EVENT(template, call, proto, args)                      \
-static struct trace_event_functions ftrace_event_type_funcs_##call = { \
-       .trace                  = ftrace_raw_output_##call,             \
-};                                                                     \
-static struct trace_event ftrace_event_type_##call = {                 \
-       .funcs                  = &ftrace_event_type_funcs_##call,      \
-};                                                                     \
 static inline void ftrace_test_probe_##call(void)                      \
 {                                                                      \
        check_trace_callback_type_##call(ftrace_raw_event_##template);  \
 }
 
 #undef DEFINE_EVENT_PRINT
-#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
-       DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
+#define DEFINE_EVENT_PRINT(template, name, proto, args, print)
 
 #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
 
@@ -582,7 +575,7 @@ __attribute__((__aligned__(4)))                                             \
 __attribute__((section("_ftrace_events"))) event_##call = {            \
        .name                   = #call,                                \
        .class                  = &event_class_##template,              \
-       .event                  = &ftrace_event_type_##call,            \
+       .event.funcs            = &ftrace_event_type_funcs_##template,  \
        .print_fmt              = print_fmt_##template,                 \
 };
 
@@ -596,7 +589,7 @@ __attribute__((__aligned__(4)))                                             \
 __attribute__((section("_ftrace_events"))) event_##call = {            \
        .name                   = #call,                                \
        .class                  = &event_class_##template,              \
-       .event                  = &ftrace_event_type_##call,            \
+       .event.funcs            = &ftrace_event_type_funcs_##call,      \
        .print_fmt              = print_fmt_##call,                     \
 }
 
index 8e94255a45e724b3ae9c3a0cad9ca4c4b721484f..aafe5bff8f5979ec264fe8c58d4038ed1bc822fc 100644 (file)
@@ -122,7 +122,7 @@ int trace_event_raw_init(struct ftrace_event_call *call)
 {
        int id;
 
-       id = register_ftrace_event(call->event);
+       id = register_ftrace_event(&call->event);
        if (!id)
                return -ENODEV;
        call->id = id;
@@ -1073,8 +1073,8 @@ static void remove_subsystem_dir(const char *name)
 static void __trace_remove_event_call(struct ftrace_event_call *call)
 {
        ftrace_event_enable_disable(call, 0);
-       if (call->event)
-               __unregister_ftrace_event(call->event);
+       if (call->event.funcs)
+               __unregister_ftrace_event(&call->event);
        debugfs_remove_recursive(call->dir);
        list_del(&call->list);
        trace_destroy_fields(call);
index b989ae229a200239760b15f48886833e52fc61d1..d8061c3e02c9427b8dfd961eba050f710fed6552 100644 (file)
@@ -204,7 +204,6 @@ struct trace_probe {
        const char              *symbol;        /* symbol name */
        struct ftrace_event_class       class;
        struct ftrace_event_call        call;
-       struct trace_event              event;
        unsigned int            nr_args;
        struct probe_arg        args[];
 };
@@ -1020,7 +1019,7 @@ print_kprobe_event(struct trace_iterator *iter, int flags,
        int i;
 
        field = (struct kprobe_trace_entry *)iter->ent;
-       tp = container_of(event, struct trace_probe, event);
+       tp = container_of(event, struct trace_probe, call.event);
 
        if (!trace_seq_printf(s, "%s: (", tp->call.name))
                goto partial;
@@ -1054,7 +1053,7 @@ print_kretprobe_event(struct trace_iterator *iter, int flags,
        int i;
 
        field = (struct kretprobe_trace_entry *)iter->ent;
-       tp = container_of(event, struct trace_probe, event);
+       tp = container_of(event, struct trace_probe, call.event);
 
        if (!trace_seq_printf(s, "%s: (", tp->call.name))
                goto partial;
@@ -1364,20 +1363,19 @@ static int register_probe_event(struct trace_probe *tp)
 
        /* Initialize ftrace_event_call */
        if (probe_is_return(tp)) {
-               tp->event.funcs = &kretprobe_funcs;
                INIT_LIST_HEAD(&call->class->fields);
+               call->event.funcs = &kretprobe_funcs;
                call->class->raw_init = probe_event_raw_init;
                call->class->define_fields = kretprobe_event_define_fields;
        } else {
                INIT_LIST_HEAD(&call->class->fields);
-               tp->event.funcs = &kprobe_funcs;
+               call->event.funcs = &kprobe_funcs;
                call->class->raw_init = probe_event_raw_init;
                call->class->define_fields = kprobe_event_define_fields;
        }
        if (set_print_fmt(tp) < 0)
                return -ENOMEM;
-       call->event = &tp->event;
-       call->id = register_ftrace_event(&tp->event);
+       call->id = register_ftrace_event(&call->event);
        if (!call->id) {
                kfree(call->print_fmt);
                return -ENODEV;
@@ -1389,7 +1387,7 @@ static int register_probe_event(struct trace_probe *tp)
        if (ret) {
                pr_info("Failed to register kprobe event: %s\n", call->name);
                kfree(call->print_fmt);
-               unregister_ftrace_event(&tp->event);
+               unregister_ftrace_event(&call->event);
        }
        return ret;
 }
index 3751c81998cbe026989c14e9257fc192918229c5..7c7cfe95a8538f0cbf049baf21e514264c61ff6e 100644 (file)
@@ -39,6 +39,14 @@ syscall_get_exit_fields(struct ftrace_event_call *call)
        return &entry->exit_fields;
 }
 
+struct trace_event_functions enter_syscall_print_funcs = {
+       .trace                  = print_syscall_enter,
+};
+
+struct trace_event_functions exit_syscall_print_funcs = {
+       .trace                  = print_syscall_exit,
+};
+
 struct ftrace_event_class event_class_syscall_enter = {
        .system                 = "syscalls",
        .reg                    = syscall_enter_register,