2008-12-24 11:24:12 +07:00
|
|
|
#ifndef __TRACE_EVENTS_H
|
|
|
|
#define __TRACE_EVENTS_H
|
|
|
|
|
tracing: make trace_seq operations available for core kernel
In the process to make TRACE_EVENT macro work for modules, the trace_seq
operations must be available for core kernel code.
These operations are quite useful and can be used for other implementations.
The main idea is that we create a trace_seq handle that acts very much
like the seq_file handle.
struct trace_seq *s = kmalloc(sizeof(*s, GFP_KERNEL);
trace_seq_init(s);
trace_seq_printf(s, "some data %d\n", variable);
printk("%s", s->buffer);
The main use is to allow a top level function call several other functions
that may store printf like data into the buffer. Then at the end, the top
level function can process all the data with any method it would like to.
It could be passed to userspace, output via printk or even use seq_file:
trace_seq_to_user(s, ubuf, cnt);
seq_puts(m, s->buffer);
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
2009-04-11 23:59:57 +07:00
|
|
|
#include <linux/trace_seq.h>
|
2008-12-24 11:24:12 +07:00
|
|
|
#include "trace.h"
|
|
|
|
|
2013-03-09 09:02:34 +07:00
|
|
|
extern enum print_line_t
|
|
|
|
trace_print_bputs_msg_only(struct trace_iterator *iter);
|
2009-03-19 23:20:38 +07:00
|
|
|
extern enum print_line_t
|
|
|
|
trace_print_bprintk_msg_only(struct trace_iterator *iter);
|
|
|
|
extern enum print_line_t
|
|
|
|
trace_print_printk_msg_only(struct trace_iterator *iter);
|
|
|
|
|
2009-03-06 23:21:49 +07:00
|
|
|
extern int
|
2008-12-24 11:24:12 +07:00
|
|
|
seq_print_ip_sym(struct trace_seq *s, unsigned long ip,
|
|
|
|
unsigned long sym_flags);
|
2009-03-23 20:12:23 +07:00
|
|
|
extern int seq_print_userip_objs(const struct userstack_entry *entry,
|
|
|
|
struct trace_seq *s, unsigned long sym_flags);
|
|
|
|
extern int seq_print_user_ip(struct trace_seq *s, struct mm_struct *mm,
|
|
|
|
unsigned long ip, unsigned long sym_flags);
|
2008-12-24 11:24:12 +07:00
|
|
|
|
2009-03-23 20:12:23 +07:00
|
|
|
extern int trace_print_context(struct trace_iterator *iter);
|
|
|
|
extern int trace_print_lat_context(struct trace_iterator *iter);
|
2009-02-03 05:29:21 +07:00
|
|
|
|
2009-05-18 18:35:34 +07:00
|
|
|
extern void trace_event_read_lock(void);
|
|
|
|
extern void trace_event_read_unlock(void);
|
2009-03-23 20:12:23 +07:00
|
|
|
extern struct trace_event *ftrace_find_event(int type);
|
2008-12-24 11:24:12 +07:00
|
|
|
|
2009-03-23 20:12:23 +07:00
|
|
|
extern enum print_line_t trace_nop_print(struct trace_iterator *iter,
|
2010-04-23 05:46:14 +07:00
|
|
|
int flags, struct trace_event *event);
|
2009-09-12 01:24:13 +07:00
|
|
|
extern int
|
|
|
|
trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry);
|
2008-12-24 11:24:13 +07:00
|
|
|
|
2009-06-10 04:29:07 +07:00
|
|
|
/* used by module unregistering */
|
|
|
|
extern int __unregister_ftrace_event(struct trace_event *event);
|
2013-03-11 14:14:03 +07:00
|
|
|
extern struct rw_semaphore trace_event_sem;
|
2009-06-10 04:29:07 +07:00
|
|
|
|
2008-12-24 11:24:12 +07:00
|
|
|
#define MAX_MEMHEX_BYTES 8
|
|
|
|
#define HEX_CHARS (MAX_MEMHEX_BYTES*2 + 1)
|
|
|
|
|
2008-12-24 11:24:13 +07:00
|
|
|
#define SEQ_PUT_FIELD_RET(s, x) \
|
|
|
|
do { \
|
|
|
|
if (!trace_seq_putmem(s, &(x), sizeof(x))) \
|
2009-01-15 17:05:40 +07:00
|
|
|
return TRACE_TYPE_PARTIAL_LINE; \
|
2008-12-24 11:24:13 +07:00
|
|
|
} while (0)
|
|
|
|
|
|
|
|
#define SEQ_PUT_HEX_FIELD_RET(s, x) \
|
|
|
|
do { \
|
|
|
|
BUILD_BUG_ON(sizeof(x) > MAX_MEMHEX_BYTES); \
|
|
|
|
if (!trace_seq_putmem_hex(s, &(x), sizeof(x))) \
|
2009-01-15 17:05:40 +07:00
|
|
|
return TRACE_TYPE_PARTIAL_LINE; \
|
2008-12-24 11:24:13 +07:00
|
|
|
} while (0)
|
|
|
|
|
2008-12-24 11:24:12 +07:00
|
|
|
#endif
|
|
|
|
|