mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-20 13:41:30 +00:00
tracing: add __print_flags for events
Developers have been asking for the ability in the ftrace event tracer to display names of bits in a flags variable. Instead of printing out c2, it would be easier to read FOO|BAR|GOO, assuming that FOO is bit 1, BAR is bit 6 and GOO is bit 7. Some examples where this would be useful are the state flags in a context switch, kmalloc flags, and even permision flags in accessing files. [ v2 changes include: Frederic Weisbecker's idea of using a mask instead of bits, thus we can output GFP_KERNEL instead of GPF_WAIT|GFP_IO|GFP_FS. Li Zefan's idea of allowing the caller of __print_flags to add their own delimiter (or no delimiter) where we can get for file permissions rwx instead of r|w|x. ] [ v3 changes: Christoph Hellwig's idea of using an array instead of va_args. ] [ Impact: better displaying of flags in trace output ] Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
This commit is contained in:
parent
0e907c9939
commit
be74b73a57
3 changed files with 65 additions and 1 deletions
|
@ -15,6 +15,9 @@
|
|||
#define EVENT_HASHSIZE 128
|
||||
|
||||
static DECLARE_RWSEM(trace_event_mutex);
|
||||
|
||||
DEFINE_PER_CPU(struct trace_seq, ftrace_event_seq);
|
||||
|
||||
static struct hlist_head event_hash[EVENT_HASHSIZE] __read_mostly;
|
||||
|
||||
static int next_event_type = __TRACE_LAST_TYPE + 1;
|
||||
|
@ -212,6 +215,42 @@ int trace_seq_path(struct trace_seq *s, struct path *path)
|
|||
return 0;
|
||||
}
|
||||
|
||||
const char *
|
||||
ftrace_print_flags_seq(struct trace_seq *p, const char *delim,
|
||||
unsigned long flags,
|
||||
const struct trace_print_flags *flag_array)
|
||||
{
|
||||
unsigned long mask;
|
||||
const char *str;
|
||||
int i;
|
||||
|
||||
trace_seq_init(p);
|
||||
|
||||
for (i = 0; flag_array[i].name && flags; i++) {
|
||||
|
||||
mask = flag_array[i].mask;
|
||||
if ((flags & mask) != mask)
|
||||
continue;
|
||||
|
||||
str = flag_array[i].name;
|
||||
flags &= ~mask;
|
||||
if (p->len && delim)
|
||||
trace_seq_puts(p, delim);
|
||||
trace_seq_puts(p, str);
|
||||
}
|
||||
|
||||
/* check for left over flags */
|
||||
if (flags) {
|
||||
if (p->len && delim)
|
||||
trace_seq_puts(p, delim);
|
||||
trace_seq_printf(p, "0x%lx", flags);
|
||||
}
|
||||
|
||||
trace_seq_putc(p, 0);
|
||||
|
||||
return p->buffer;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KRETPROBES
|
||||
static inline const char *kretprobed(const char *name)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue