Skip to content

Commit

Permalink
tracing: Allow for modules to convert their enums to values
Browse files Browse the repository at this point in the history
Update the infrastructure such that modules that declare TRACE_DEFINE_ENUM()
will have those enums converted into their values in the tracepoint
print fmt strings.

Link: http://lkml.kernel.org/r/[email protected]

Acked-by: Rusty Russell <[email protected]>
Reviewed-by: Masami Hiramatsu <[email protected]>
Tested-by: Masami Hiramatsu <[email protected]>
Signed-off-by: Steven Rostedt <[email protected]>
  • Loading branch information
rostedt committed Apr 8, 2015
1 parent 0c564a5 commit 3673b8e
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 5 deletions.
2 changes: 2 additions & 0 deletions include/linux/module.h
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,8 @@ struct module {
#ifdef CONFIG_EVENT_TRACING
struct ftrace_event_call **trace_events;
unsigned int num_trace_events;
struct trace_enum_map **trace_enums;
unsigned int num_trace_enums;
#endif
#ifdef CONFIG_FTRACE_MCOUNT_RECORD
unsigned int num_ftrace_callsites;
Expand Down
3 changes: 3 additions & 0 deletions kernel/module.c
Original file line number Diff line number Diff line change
Expand Up @@ -2753,6 +2753,9 @@ static int find_module_sections(struct module *mod, struct load_info *info)
mod->trace_events = section_objs(info, "_ftrace_events",
sizeof(*mod->trace_events),
&mod->num_trace_events);
mod->trace_enums = section_objs(info, "_ftrace_enum_map",
sizeof(*mod->trace_enums),
&mod->num_trace_enums);
#endif
#ifdef CONFIG_TRACING
mod->trace_bprintk_fmt_start = section_objs(info, "__trace_printk_fmt",
Expand Down
49 changes: 45 additions & 4 deletions kernel/trace/trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -3908,11 +3908,9 @@ static const struct file_operations tracing_saved_cmdlines_size_fops = {
.write = tracing_saved_cmdlines_size_write,
};

static void
trace_insert_enum_map(struct trace_enum_map **start, struct trace_enum_map **stop)
static void trace_insert_enum_map(struct trace_enum_map **start, int len)
{
struct trace_enum_map **map;
int len = stop - start;

if (len <= 0)
return;
Expand Down Expand Up @@ -6561,9 +6559,48 @@ extern struct trace_enum_map *__stop_ftrace_enum_maps[];

static void __init trace_enum_init(void)
{
trace_insert_enum_map(__start_ftrace_enum_maps, __stop_ftrace_enum_maps);
int len;

len = __stop_ftrace_enum_maps - __start_ftrace_enum_maps;
trace_insert_enum_map(__start_ftrace_enum_maps, len);
}

#ifdef CONFIG_MODULES
static void trace_module_add_enums(struct module *mod)
{
if (!mod->num_trace_enums)
return;

/*
* Modules with bad taint do not have events created, do
* not bother with enums either.
*/
if (trace_module_has_bad_taint(mod))
return;

trace_insert_enum_map(mod->trace_enums, mod->num_trace_enums);
}

static int trace_module_notify(struct notifier_block *self,
unsigned long val, void *data)
{
struct module *mod = data;

switch (val) {
case MODULE_STATE_COMING:
trace_module_add_enums(mod);
break;
}

return 0;
}

static struct notifier_block trace_module_nb = {
.notifier_call = trace_module_notify,
.priority = 0,
};
#endif

static __init int tracer_init_debugfs(void)
{
struct dentry *d_tracer;
Expand All @@ -6590,6 +6627,10 @@ static __init int tracer_init_debugfs(void)

trace_enum_init();

#ifdef CONFIG_MODULES
register_module_notifier(&trace_module_nb);
#endif

#ifdef CONFIG_DYNAMIC_FTRACE
trace_create_file("dyn_ftrace_total_info", 0444, d_tracer,
&ftrace_update_tot_cnt, &tracing_dyn_info_fops);
Expand Down
2 changes: 1 addition & 1 deletion kernel/trace/trace_events.c
Original file line number Diff line number Diff line change
Expand Up @@ -2034,7 +2034,7 @@ static int trace_module_notify(struct notifier_block *self,

static struct notifier_block trace_module_nb = {
.notifier_call = trace_module_notify,
.priority = 0,
.priority = 1, /* higher than trace.c module notify */
};
#endif /* CONFIG_MODULES */

Expand Down

0 comments on commit 3673b8e

Please sign in to comment.