Skip to content

Commit

Permalink
tracing: Create class struct for events
Browse files Browse the repository at this point in the history
This patch creates a ftrace_event_class struct that event structs point to.
This class struct will be made to hold information to modify the
events. Currently the class struct only holds the events system name.

This patch slightly increases the size, but this change lays the ground work
of other changes to make the footprint of tracepoints smaller.

With 82 standard tracepoints, and 618 system call tracepoints
(two tracepoints per syscall: enter and exit):

   text	   data	    bss	    dec	    hex	filename
4913961	1088356	 861512	6863829	 68bbd5	vmlinux.orig
4914025	1088868	 861512	6864405	 68be15	vmlinux.class

This patch also cleans up some stale comments in ftrace.h.

v2: Fixed missing semi-colon in macro.

Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
Acked-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Acked-by: Masami Hiramatsu <mhiramat@redhat.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
  • Loading branch information
Steven Rostedt authored and Steven Rostedt committed May 14, 2010
1 parent 23e117f commit 8f08201
Show file tree
Hide file tree
Showing 8 changed files with 56 additions and 48 deletions.
6 changes: 5 additions & 1 deletion include/linux/ftrace_event.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,10 +113,14 @@ void tracing_record_cmdline(struct task_struct *tsk);

struct event_filter;

struct ftrace_event_class {
char *system;
};

struct ftrace_event_call {
struct list_head list;
struct ftrace_event_class *class;
char *name;
char *system;
struct dentry *dir;
struct trace_event *event;
int enabled;
Expand Down
6 changes: 4 additions & 2 deletions include/linux/syscalls.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,8 @@ struct perf_event_attr;
#define __SC_STR_TDECL5(t, a, ...) #t, __SC_STR_TDECL4(__VA_ARGS__)
#define __SC_STR_TDECL6(t, a, ...) #t, __SC_STR_TDECL5(__VA_ARGS__)

extern struct ftrace_event_class event_class_syscalls;

#define SYSCALL_TRACE_ENTER_EVENT(sname) \
static const struct syscall_metadata __syscall_meta_##sname; \
static struct ftrace_event_call \
Expand All @@ -146,7 +148,7 @@ struct perf_event_attr;
__attribute__((section("_ftrace_events"))) \
event_enter_##sname = { \
.name = "sys_enter"#sname, \
.system = "syscalls", \
.class = &event_class_syscalls, \
.event = &enter_syscall_print_##sname, \
.raw_init = init_syscall_trace, \
.define_fields = syscall_enter_define_fields, \
Expand All @@ -168,7 +170,7 @@ struct perf_event_attr;
__attribute__((section("_ftrace_events"))) \
event_exit_##sname = { \
.name = "sys_exit"#sname, \
.system = "syscalls", \
.class = &event_class_syscalls, \
.event = &exit_syscall_print_##sname, \
.raw_init = init_syscall_trace, \
.define_fields = syscall_exit_define_fields, \
Expand Down
44 changes: 19 additions & 25 deletions include/trace/ftrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,10 @@
struct trace_entry ent; \
tstruct \
char __data[0]; \
};
}; \
\
static struct ftrace_event_class event_class_##name;

#undef DEFINE_EVENT
#define DEFINE_EVENT(template, name, proto, args) \
static struct ftrace_event_call \
Expand Down Expand Up @@ -430,22 +433,6 @@ perf_trace_disable_##name(struct ftrace_event_call *unused) \
*
* Override the macros in <trace/trace_events.h> to include the following:
*
* static void ftrace_event_<call>(proto)
* {
* event_trace_printk(_RET_IP_, "<call>: " <fmt>);
* }
*
* static int ftrace_reg_event_<call>(struct ftrace_event_call *unused)
* {
* return register_trace_<call>(ftrace_event_<call>);
* }
*
* static void ftrace_unreg_event_<call>(struct ftrace_event_call *unused)
* {
* unregister_trace_<call>(ftrace_event_<call>);
* }
*
*
* For those macros defined with TRACE_EVENT:
*
* static struct ftrace_event_call event_<call>;
Expand Down Expand Up @@ -497,17 +484,21 @@ perf_trace_disable_##name(struct ftrace_event_call *unused) \
*
* static const char print_fmt_<call>[] = <TP_printk>;
*
* static struct ftrace_event_class __used event_class_<template> = {
* .system = "<system>",
* };
*
* static struct ftrace_event_call __used
* __attribute__((__aligned__(4)))
* __attribute__((section("_ftrace_events"))) event_<call> = {
* .name = "<call>",
* .system = "<system>",
* .class = event_class_<template>,
* .raw_init = trace_event_raw_init,
* .regfunc = ftrace_reg_event_<call>,
* .unregfunc = ftrace_unreg_event_<call>,
* .regfunc = ftrace_raw_reg_event_<call>,
* .unregfunc = ftrace_raw_unreg_event_<call>,
* .print_fmt = print_fmt_<call>,
* .define_fields = ftrace_define_fields_<call>,
* }
* };
*
*/

Expand Down Expand Up @@ -627,7 +618,10 @@ static struct trace_event ftrace_event_type_##call = { \

#undef DECLARE_EVENT_CLASS
#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
static const char print_fmt_##call[] = print;
static const char print_fmt_##call[] = print; \
static struct ftrace_event_class __used event_class_##call = { \
.system = __stringify(TRACE_SYSTEM) \
};

#undef DEFINE_EVENT
#define DEFINE_EVENT(template, call, proto, args) \
Expand All @@ -636,15 +630,15 @@ static struct ftrace_event_call __used \
__attribute__((__aligned__(4))) \
__attribute__((section("_ftrace_events"))) event_##call = { \
.name = #call, \
.system = __stringify(TRACE_SYSTEM), \
.class = &event_class_##template, \
.event = &ftrace_event_type_##call, \
.raw_init = trace_event_raw_init, \
.regfunc = ftrace_raw_reg_event_##call, \
.unregfunc = ftrace_raw_unreg_event_##call, \
.print_fmt = print_fmt_##template, \
.define_fields = ftrace_define_fields_##template, \
_TRACE_PERF_INIT(call) \
}
};

#undef DEFINE_EVENT_PRINT
#define DEFINE_EVENT_PRINT(template, call, proto, args, print) \
Expand All @@ -655,7 +649,7 @@ static struct ftrace_event_call __used \
__attribute__((__aligned__(4))) \
__attribute__((section("_ftrace_events"))) event_##call = { \
.name = #call, \
.system = __stringify(TRACE_SYSTEM), \
.class = &event_class_##template, \
.event = &ftrace_event_type_##call, \
.raw_init = trace_event_raw_init, \
.regfunc = ftrace_raw_reg_event_##call, \
Expand Down
20 changes: 10 additions & 10 deletions kernel/trace/trace_events.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,10 +176,10 @@ static int __ftrace_set_clr_event(const char *match, const char *sub,

if (match &&
strcmp(match, call->name) != 0 &&
strcmp(match, call->system) != 0)
strcmp(match, call->class->system) != 0)
continue;

if (sub && strcmp(sub, call->system) != 0)
if (sub && strcmp(sub, call->class->system) != 0)
continue;

if (event && strcmp(event, call->name) != 0)
Expand Down Expand Up @@ -355,8 +355,8 @@ static int t_show(struct seq_file *m, void *v)
{
struct ftrace_event_call *call = v;

if (strcmp(call->system, TRACE_SYSTEM) != 0)
seq_printf(m, "%s:", call->system);
if (strcmp(call->class->system, TRACE_SYSTEM) != 0)
seq_printf(m, "%s:", call->class->system);
seq_printf(m, "%s\n", call->name);

return 0;
Expand Down Expand Up @@ -453,7 +453,7 @@ system_enable_read(struct file *filp, char __user *ubuf, size_t cnt,
if (!call->name || !call->regfunc)
continue;

if (system && strcmp(call->system, system) != 0)
if (system && strcmp(call->class->system, system) != 0)
continue;

/*
Expand Down Expand Up @@ -925,8 +925,8 @@ event_create_dir(struct ftrace_event_call *call, struct dentry *d_events,
* If the trace point header did not define TRACE_SYSTEM
* then the system would be called "TRACE_SYSTEM".
*/
if (strcmp(call->system, TRACE_SYSTEM) != 0)
d_events = event_subsystem_dir(call->system, d_events);
if (strcmp(call->class->system, TRACE_SYSTEM) != 0)
d_events = event_subsystem_dir(call->class->system, d_events);

call->dir = debugfs_create_dir(call->name, d_events);
if (!call->dir) {
Expand Down Expand Up @@ -1041,7 +1041,7 @@ static void __trace_remove_event_call(struct ftrace_event_call *call)
list_del(&call->list);
trace_destroy_fields(call);
destroy_preds(call);
remove_subsystem_dir(call->system);
remove_subsystem_dir(call->class->system);
}

/* Remove an event_call */
Expand Down Expand Up @@ -1399,8 +1399,8 @@ static __init void event_trace_self_tests(void)
* syscalls as we test.
*/
#ifndef CONFIG_EVENT_TRACE_TEST_SYSCALLS
if (call->system &&
strcmp(call->system, "syscalls") == 0)
if (call->class->system &&
strcmp(call->class->system, "syscalls") == 0)
continue;
#endif

Expand Down
6 changes: 3 additions & 3 deletions kernel/trace/trace_events_filter.c
Original file line number Diff line number Diff line change
Expand Up @@ -628,7 +628,7 @@ static int init_subsystem_preds(struct event_subsystem *system)
if (!call->define_fields)
continue;

if (strcmp(call->system, system->name) != 0)
if (strcmp(call->class->system, system->name) != 0)
continue;

err = init_preds(call);
Expand All @@ -647,7 +647,7 @@ static void filter_free_subsystem_preds(struct event_subsystem *system)
if (!call->define_fields)
continue;

if (strcmp(call->system, system->name) != 0)
if (strcmp(call->class->system, system->name) != 0)
continue;

filter_disable_preds(call);
Expand Down Expand Up @@ -1252,7 +1252,7 @@ static int replace_system_preds(struct event_subsystem *system,
if (!call->define_fields)
continue;

if (strcmp(call->system, system->name) != 0)
if (strcmp(call->class->system, system->name) != 0)
continue;

/* try to see if the filter can be applied */
Expand Down
6 changes: 5 additions & 1 deletion kernel/trace/trace_export.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@
#undef TRACE_SYSTEM
#define TRACE_SYSTEM ftrace

struct ftrace_event_class event_class_ftrace = {
.system = __stringify(TRACE_SYSTEM),
};

/* not needed for this file */
#undef __field_struct
#define __field_struct(type, item)
Expand Down Expand Up @@ -160,7 +164,7 @@ __attribute__((__aligned__(4))) \
__attribute__((section("_ftrace_events"))) event_##call = { \
.name = #call, \
.id = type, \
.system = __stringify(TRACE_SYSTEM), \
.class = &event_class_ftrace, \
.raw_init = ftrace_raw_init_event, \
.print_fmt = print, \
.define_fields = ftrace_define_fields_##call, \
Expand Down
12 changes: 6 additions & 6 deletions kernel/trace/trace_kprobe.c
Original file line number Diff line number Diff line change
Expand Up @@ -332,8 +332,8 @@ static struct trace_probe *alloc_trace_probe(const char *group,
goto error;
}

tp->call.system = kstrdup(group, GFP_KERNEL);
if (!tp->call.system)
tp->call.class->system = kstrdup(group, GFP_KERNEL);
if (!tp->call.class->system)
goto error;

INIT_LIST_HEAD(&tp->list);
Expand Down Expand Up @@ -361,7 +361,7 @@ static void free_trace_probe(struct trace_probe *tp)
for (i = 0; i < tp->nr_args; i++)
free_probe_arg(&tp->args[i]);

kfree(tp->call.system);
kfree(tp->call.class->system);
kfree(tp->call.name);
kfree(tp->symbol);
kfree(tp);
Expand All @@ -374,7 +374,7 @@ static struct trace_probe *find_probe_event(const char *event,

list_for_each_entry(tp, &probe_list, list)
if (strcmp(tp->call.name, event) == 0 &&
strcmp(tp->call.system, group) == 0)
strcmp(tp->call.class->system, group) == 0)
return tp;
return NULL;
}
Expand All @@ -399,7 +399,7 @@ static int register_trace_probe(struct trace_probe *tp)
mutex_lock(&probe_lock);

/* register as an event */
old_tp = find_probe_event(tp->call.name, tp->call.system);
old_tp = find_probe_event(tp->call.name, tp->call.class->system);
if (old_tp) {
/* delete old event */
unregister_trace_probe(old_tp);
Expand Down Expand Up @@ -798,7 +798,7 @@ static int probes_seq_show(struct seq_file *m, void *v)
char buf[MAX_ARGSTR_LEN + 1];

seq_printf(m, "%c", probe_is_return(tp) ? 'r' : 'p');
seq_printf(m, ":%s/%s", tp->call.system, tp->call.name);
seq_printf(m, ":%s/%s", tp->call.class->system, tp->call.name);

if (!tp->symbol)
seq_printf(m, " 0x%p", tp->rp.kp.addr);
Expand Down
4 changes: 4 additions & 0 deletions kernel/trace/trace_syscalls.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ static int sys_refcount_exit;
static DECLARE_BITMAP(enabled_enter_syscalls, NR_syscalls);
static DECLARE_BITMAP(enabled_exit_syscalls, NR_syscalls);

struct ftrace_event_class event_class_syscalls = {
.system = "syscalls"
};

extern unsigned long __start_syscalls_metadata[];
extern unsigned long __stop_syscalls_metadata[];

Expand Down

0 comments on commit 8f08201

Please sign in to comment.