tracing: add __print_symbolic to trace events
This patch adds __print_symbolic which is similar to __print_flags but works for an enumeration type instead. That is, there is only a one to one mapping between the values and the symbols. When a match is made, then it is printed, otherwise the hex value is outputed. [ Impact: add interface for showing symbol names in events ] Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
This commit is contained in:
committed by
Frederic Weisbecker
parent
62ba180e80
commit
0f4fc29dd6
@@ -20,6 +20,9 @@ const char *ftrace_print_flags_seq(struct trace_seq *p, const char *delim,
|
|||||||
unsigned long flags,
|
unsigned long flags,
|
||||||
const struct trace_print_flags *flag_array);
|
const struct trace_print_flags *flag_array);
|
||||||
|
|
||||||
|
const char *ftrace_print_symbols_seq(struct trace_seq *p, unsigned long val,
|
||||||
|
const struct trace_print_flags *symbol_array);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The trace entry - the most basic unit of tracing. This is what
|
* The trace entry - the most basic unit of tracing. This is what
|
||||||
* is printed in the end as a single line in the trace output, such as:
|
* is printed in the end as a single line in the trace output, such as:
|
||||||
|
@@ -130,6 +130,14 @@
|
|||||||
ftrace_print_flags_seq(p, delim, flag, flags); \
|
ftrace_print_flags_seq(p, delim, flag, flags); \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
#undef __print_symbolic
|
||||||
|
#define __print_symbolic(value, symbol_array...) \
|
||||||
|
({ \
|
||||||
|
static const struct trace_print_flags symbols[] = \
|
||||||
|
{ symbol_array, { -1, NULL }}; \
|
||||||
|
ftrace_print_symbols_seq(p, value, symbols); \
|
||||||
|
})
|
||||||
|
|
||||||
#undef TRACE_EVENT
|
#undef TRACE_EVENT
|
||||||
#define TRACE_EVENT(call, proto, args, tstruct, assign, print) \
|
#define TRACE_EVENT(call, proto, args, tstruct, assign, print) \
|
||||||
enum print_line_t \
|
enum print_line_t \
|
||||||
|
@@ -251,6 +251,31 @@ ftrace_print_flags_seq(struct trace_seq *p, const char *delim,
|
|||||||
return p->buffer;
|
return p->buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
ftrace_print_symbols_seq(struct trace_seq *p, unsigned long val,
|
||||||
|
const struct trace_print_flags *symbol_array)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
trace_seq_init(p);
|
||||||
|
|
||||||
|
for (i = 0; symbol_array[i].name; i++) {
|
||||||
|
|
||||||
|
if (val != symbol_array[i].mask)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
trace_seq_puts(p, symbol_array[i].name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!p->len)
|
||||||
|
trace_seq_printf(p, "0x%lx", val);
|
||||||
|
|
||||||
|
trace_seq_putc(p, 0);
|
||||||
|
|
||||||
|
return p->buffer;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_KRETPROBES
|
#ifdef CONFIG_KRETPROBES
|
||||||
static inline const char *kretprobed(const char *name)
|
static inline const char *kretprobed(const char *name)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user