2010-04-26 20:02:51

by Steven Rostedt

[permalink] [raw]
Subject: [PATCH 06/10][RFC] tracing: Move raw_init from events to class

From: Steven Rostedt <[email protected]>

The raw_init function pointer in the event is used to initialize
various kinds of events. The type of initialization needed is usually
classed to the kind of event it is.

Two events with the same class will always have the same initialization
function, so it makes sense to move this to the class structure.

Perhaps even making a special system structure would work since
the initialization is the same for all events within a system.
But since there's no system structure (yet), this will just move it
to the class.

text data bss dec hex filename
5788186 1337252 9351592 16477030 fb6b66 vmlinux.orig
5774567 1297492 9351592 16423651 fa9ae3 vmlinux.fields
5774510 1293204 9351592 16419306 fa89ea vmlinux.init

The text grew very slightly, but this is a constant growth that happened
with the changing of the C files that call the init code.
The bigger savings is the data which will be saved the more events share
a class.

Signed-off-by: Steven Rostedt <[email protected]>
---
include/linux/ftrace_event.h | 2 +-
include/linux/syscalls.h | 2 --
include/trace/ftrace.h | 8 ++++----
kernel/trace/trace_events.c | 12 ++++++------
kernel/trace/trace_export.c | 2 +-
kernel/trace/trace_kprobe.c | 6 +++---
kernel/trace/trace_syscalls.c | 2 ++
7 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h
index 1e2c8f5..655de69 100644
--- a/include/linux/ftrace_event.h
+++ b/include/linux/ftrace_event.h
@@ -131,6 +131,7 @@ struct ftrace_event_class {
int (*define_fields)(struct ftrace_event_call *);
struct list_head *(*get_fields)(struct ftrace_event_call *);
struct list_head fields;
+ int (*raw_init)(struct ftrace_event_call *);
};

struct ftrace_event_call {
@@ -142,7 +143,6 @@ struct ftrace_event_call {
int enabled;
int id;
const char *print_fmt;
- int (*raw_init)(struct ftrace_event_call *);
int filter_active;
struct event_filter *filter;
void *mod;
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index ef4f81c..a0db1e8 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -135,7 +135,6 @@ extern struct ftrace_event_class event_class_syscall_exit;
.name = "sys_enter"#sname, \
.class = &event_class_syscall_enter, \
.event = &enter_syscall_print_##sname, \
- .raw_init = init_syscall_trace, \
.data = (void *)&__syscall_meta_##sname,\
}

@@ -153,7 +152,6 @@ extern struct ftrace_event_class event_class_syscall_exit;
.name = "sys_exit"#sname, \
.class = &event_class_syscall_exit, \
.event = &exit_syscall_print_##sname, \
- .raw_init = init_syscall_trace, \
.data = (void *)&__syscall_meta_##sname,\
}

diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h
index e6ec392..de0d96c 100644
--- a/include/trace/ftrace.h
+++ b/include/trace/ftrace.h
@@ -430,8 +430,9 @@ static inline notrace int ftrace_get_offsets_##call( \
* static struct ftrace_event_class __used event_class_<template> = {
* .system = "<system>",
* .define_fields = ftrace_define_fields_<call>,
- .fields = LIST_HEAD_INIT(event_class_##call.fields),\
- .probe = ftrace_raw_event_##call, \
+ * .fields = LIST_HEAD_INIT(event_class_##call.fields),
+ * .raw_init = trace_event_raw_init,
+ * .probe = ftrace_raw_event_##call,
* }
*
* static struct ftrace_event_call __used
@@ -439,7 +440,6 @@ static inline notrace int ftrace_get_offsets_##call( \
* __attribute__((section("_ftrace_events"))) event_<call> = {
* .name = "<call>",
* .class = event_class_<template>,
- * .raw_init = trace_event_raw_init,
* .event = &ftrace_event_type_<call>,
* .print_fmt = print_fmt_<call>,
* }
@@ -555,6 +555,7 @@ static struct ftrace_event_class __used event_class_##call = { \
.system = __stringify(TRACE_SYSTEM), \
.define_fields = ftrace_define_fields_##call, \
.fields = LIST_HEAD_INIT(event_class_##call.fields),\
+ .raw_init = trace_event_raw_init, \
.probe = ftrace_raw_event_##call, \
_TRACE_PERF_INIT(call) \
}
@@ -568,7 +569,6 @@ __attribute__((section("_ftrace_events"))) event_##call = { \
.name = #call, \
.class = &event_class_##template, \
.event = &ftrace_event_type_##call, \
- .raw_init = trace_event_raw_init, \
.print_fmt = print_fmt_##template, \
}

diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index c31632e..c34a9bd 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -1012,8 +1012,8 @@ static int __trace_add_event_call(struct ftrace_event_call *call)
if (!call->name)
return -EINVAL;

- if (call->raw_init) {
- ret = call->raw_init(call);
+ if (call->class->raw_init) {
+ ret = call->class->raw_init(call);
if (ret < 0) {
if (ret != -ENOSYS)
pr_warning("Could not initialize trace "
@@ -1174,8 +1174,8 @@ 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(call);
+ if (call->class->raw_init) {
+ ret = call->class->raw_init(call);
if (ret < 0) {
if (ret != -ENOSYS)
pr_warning("Could not initialize trace "
@@ -1328,8 +1328,8 @@ static __init int event_trace_init(void)
/* The linker may leave blanks */
if (!call->name)
continue;
- if (call->raw_init) {
- ret = call->raw_init(call);
+ if (call->class->raw_init) {
+ ret = call->class->raw_init(call);
if (ret < 0) {
if (ret != -ENOSYS)
pr_warning("Could not initialize trace "
diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c
index e700a0c..e878d06 100644
--- a/kernel/trace/trace_export.c
+++ b/kernel/trace/trace_export.c
@@ -158,6 +158,7 @@ static int ftrace_raw_init_event(struct ftrace_event_call *call)
struct ftrace_event_class event_class_ftrace_##call = { \
.system = __stringify(TRACE_SYSTEM), \
.define_fields = ftrace_define_fields_##call, \
+ .raw_init = ftrace_raw_init_event, \
}; \
\
struct ftrace_event_call __used \
@@ -166,7 +167,6 @@ __attribute__((section("_ftrace_events"))) event_##call = { \
.name = #call, \
.id = type, \
.class = &event_class_ftrace_##call, \
- .raw_init = ftrace_raw_init_event, \
.print_fmt = print, \
}; \

diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
index b14bf74..428f4a5 100644
--- a/kernel/trace/trace_kprobe.c
+++ b/kernel/trace/trace_kprobe.c
@@ -1359,13 +1359,13 @@ static int register_probe_event(struct trace_probe *tp)
/* Initialize ftrace_event_call */
if (probe_is_return(tp)) {
tp->event.trace = print_kretprobe_event;
- call->raw_init = probe_event_raw_init;
INIT_LIST_HEAD(&call->class->fields);
+ call->class->raw_init = probe_event_raw_init;
call->class->define_fields = kretprobe_event_define_fields;
} else {
- tp->event.trace = print_kprobe_event;
- call->raw_init = probe_event_raw_init;
INIT_LIST_HEAD(&call->class->fields);
+ tp->event.trace = print_kprobe_event;
+ call->class->raw_init = probe_event_raw_init;
call->class->define_fields = kprobe_event_define_fields;
}
if (set_print_fmt(tp) < 0)
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c
index eb535ba..7ee6086 100644
--- a/kernel/trace/trace_syscalls.c
+++ b/kernel/trace/trace_syscalls.c
@@ -35,6 +35,7 @@ struct ftrace_event_class event_class_syscall_enter = {
.reg = syscall_enter_register,
.define_fields = syscall_enter_define_fields,
.get_fields = syscall_get_fields,
+ .raw_init = init_syscall_trace,
};

struct ftrace_event_class event_class_syscall_exit = {
@@ -42,6 +43,7 @@ struct ftrace_event_class event_class_syscall_exit = {
.reg = syscall_exit_register,
.define_fields = syscall_exit_define_fields,
.get_fields = syscall_get_fields,
+ .raw_init = init_syscall_trace,
};

extern unsigned long __start_syscalls_metadata[];
--
1.7.0


2010-04-28 21:00:12

by Mathieu Desnoyers

[permalink] [raw]
Subject: Re: [PATCH 06/10][RFC] tracing: Move raw_init from events to class

* Steven Rostedt ([email protected]) wrote:
> From: Steven Rostedt <[email protected]>
>
> The raw_init function pointer in the event is used to initialize
> various kinds of events. The type of initialization needed is usually
> classed to the kind of event it is.
>
> Two events with the same class will always have the same initialization
> function, so it makes sense to move this to the class structure.
>
> Perhaps even making a special system structure would work since
> the initialization is the same for all events within a system.
> But since there's no system structure (yet), this will just move it
> to the class.
>
> text data bss dec hex filename
> 5788186 1337252 9351592 16477030 fb6b66 vmlinux.orig
> 5774567 1297492 9351592 16423651 fa9ae3 vmlinux.fields
> 5774510 1293204 9351592 16419306 fa89ea vmlinux.init
>
> The text grew very slightly, but this is a constant growth that happened
> with the changing of the C files that call the init code.
> The bigger savings is the data which will be saved the more events share
> a class.
>
> Signed-off-by: Steven Rostedt <[email protected]>

Acked-by: Mathieu Desnoyers <[email protected]>

> ---
> include/linux/ftrace_event.h | 2 +-
> include/linux/syscalls.h | 2 --
> include/trace/ftrace.h | 8 ++++----
> kernel/trace/trace_events.c | 12 ++++++------
> kernel/trace/trace_export.c | 2 +-
> kernel/trace/trace_kprobe.c | 6 +++---
> kernel/trace/trace_syscalls.c | 2 ++
> 7 files changed, 17 insertions(+), 17 deletions(-)
>
> diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h
> index 1e2c8f5..655de69 100644
> --- a/include/linux/ftrace_event.h
> +++ b/include/linux/ftrace_event.h
> @@ -131,6 +131,7 @@ struct ftrace_event_class {
> int (*define_fields)(struct ftrace_event_call *);
> struct list_head *(*get_fields)(struct ftrace_event_call *);
> struct list_head fields;
> + int (*raw_init)(struct ftrace_event_call *);
> };
>
> struct ftrace_event_call {
> @@ -142,7 +143,6 @@ struct ftrace_event_call {
> int enabled;
> int id;
> const char *print_fmt;
> - int (*raw_init)(struct ftrace_event_call *);
> int filter_active;
> struct event_filter *filter;
> void *mod;
> diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
> index ef4f81c..a0db1e8 100644
> --- a/include/linux/syscalls.h
> +++ b/include/linux/syscalls.h
> @@ -135,7 +135,6 @@ extern struct ftrace_event_class event_class_syscall_exit;
> .name = "sys_enter"#sname, \
> .class = &event_class_syscall_enter, \
> .event = &enter_syscall_print_##sname, \
> - .raw_init = init_syscall_trace, \
> .data = (void *)&__syscall_meta_##sname,\
> }
>
> @@ -153,7 +152,6 @@ extern struct ftrace_event_class event_class_syscall_exit;
> .name = "sys_exit"#sname, \
> .class = &event_class_syscall_exit, \
> .event = &exit_syscall_print_##sname, \
> - .raw_init = init_syscall_trace, \
> .data = (void *)&__syscall_meta_##sname,\
> }
>
> diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h
> index e6ec392..de0d96c 100644
> --- a/include/trace/ftrace.h
> +++ b/include/trace/ftrace.h
> @@ -430,8 +430,9 @@ static inline notrace int ftrace_get_offsets_##call( \
> * static struct ftrace_event_class __used event_class_<template> = {
> * .system = "<system>",
> * .define_fields = ftrace_define_fields_<call>,
> - .fields = LIST_HEAD_INIT(event_class_##call.fields),\
> - .probe = ftrace_raw_event_##call, \
> + * .fields = LIST_HEAD_INIT(event_class_##call.fields),
> + * .raw_init = trace_event_raw_init,
> + * .probe = ftrace_raw_event_##call,
> * }
> *
> * static struct ftrace_event_call __used
> @@ -439,7 +440,6 @@ static inline notrace int ftrace_get_offsets_##call( \
> * __attribute__((section("_ftrace_events"))) event_<call> = {
> * .name = "<call>",
> * .class = event_class_<template>,
> - * .raw_init = trace_event_raw_init,
> * .event = &ftrace_event_type_<call>,
> * .print_fmt = print_fmt_<call>,
> * }
> @@ -555,6 +555,7 @@ static struct ftrace_event_class __used event_class_##call = { \
> .system = __stringify(TRACE_SYSTEM), \
> .define_fields = ftrace_define_fields_##call, \
> .fields = LIST_HEAD_INIT(event_class_##call.fields),\
> + .raw_init = trace_event_raw_init, \
> .probe = ftrace_raw_event_##call, \
> _TRACE_PERF_INIT(call) \
> }
> @@ -568,7 +569,6 @@ __attribute__((section("_ftrace_events"))) event_##call = { \
> .name = #call, \
> .class = &event_class_##template, \
> .event = &ftrace_event_type_##call, \
> - .raw_init = trace_event_raw_init, \
> .print_fmt = print_fmt_##template, \
> }
>
> diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
> index c31632e..c34a9bd 100644
> --- a/kernel/trace/trace_events.c
> +++ b/kernel/trace/trace_events.c
> @@ -1012,8 +1012,8 @@ static int __trace_add_event_call(struct ftrace_event_call *call)
> if (!call->name)
> return -EINVAL;
>
> - if (call->raw_init) {
> - ret = call->raw_init(call);
> + if (call->class->raw_init) {
> + ret = call->class->raw_init(call);
> if (ret < 0) {
> if (ret != -ENOSYS)
> pr_warning("Could not initialize trace "
> @@ -1174,8 +1174,8 @@ 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(call);
> + if (call->class->raw_init) {
> + ret = call->class->raw_init(call);
> if (ret < 0) {
> if (ret != -ENOSYS)
> pr_warning("Could not initialize trace "
> @@ -1328,8 +1328,8 @@ static __init int event_trace_init(void)
> /* The linker may leave blanks */
> if (!call->name)
> continue;
> - if (call->raw_init) {
> - ret = call->raw_init(call);
> + if (call->class->raw_init) {
> + ret = call->class->raw_init(call);
> if (ret < 0) {
> if (ret != -ENOSYS)
> pr_warning("Could not initialize trace "
> diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c
> index e700a0c..e878d06 100644
> --- a/kernel/trace/trace_export.c
> +++ b/kernel/trace/trace_export.c
> @@ -158,6 +158,7 @@ static int ftrace_raw_init_event(struct ftrace_event_call *call)
> struct ftrace_event_class event_class_ftrace_##call = { \
> .system = __stringify(TRACE_SYSTEM), \
> .define_fields = ftrace_define_fields_##call, \
> + .raw_init = ftrace_raw_init_event, \
> }; \
> \
> struct ftrace_event_call __used \
> @@ -166,7 +167,6 @@ __attribute__((section("_ftrace_events"))) event_##call = { \
> .name = #call, \
> .id = type, \
> .class = &event_class_ftrace_##call, \
> - .raw_init = ftrace_raw_init_event, \
> .print_fmt = print, \
> }; \
>
> diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
> index b14bf74..428f4a5 100644
> --- a/kernel/trace/trace_kprobe.c
> +++ b/kernel/trace/trace_kprobe.c
> @@ -1359,13 +1359,13 @@ static int register_probe_event(struct trace_probe *tp)
> /* Initialize ftrace_event_call */
> if (probe_is_return(tp)) {
> tp->event.trace = print_kretprobe_event;
> - call->raw_init = probe_event_raw_init;
> INIT_LIST_HEAD(&call->class->fields);
> + call->class->raw_init = probe_event_raw_init;
> call->class->define_fields = kretprobe_event_define_fields;
> } else {
> - tp->event.trace = print_kprobe_event;
> - call->raw_init = probe_event_raw_init;
> INIT_LIST_HEAD(&call->class->fields);
> + tp->event.trace = print_kprobe_event;
> + call->class->raw_init = probe_event_raw_init;
> call->class->define_fields = kprobe_event_define_fields;
> }
> if (set_print_fmt(tp) < 0)
> diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c
> index eb535ba..7ee6086 100644
> --- a/kernel/trace/trace_syscalls.c
> +++ b/kernel/trace/trace_syscalls.c
> @@ -35,6 +35,7 @@ struct ftrace_event_class event_class_syscall_enter = {
> .reg = syscall_enter_register,
> .define_fields = syscall_enter_define_fields,
> .get_fields = syscall_get_fields,
> + .raw_init = init_syscall_trace,
> };
>
> struct ftrace_event_class event_class_syscall_exit = {
> @@ -42,6 +43,7 @@ struct ftrace_event_class event_class_syscall_exit = {
> .reg = syscall_exit_register,
> .define_fields = syscall_exit_define_fields,
> .get_fields = syscall_get_fields,
> + .raw_init = init_syscall_trace,
> };
>
> extern unsigned long __start_syscalls_metadata[];
> --
> 1.7.0
>
>

--
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com