-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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>
- Loading branch information
Steven Rostedt
authored and
Steven Rostedt
committed
Apr 14, 2009
1 parent
a8d154b
commit 9504504
Showing
3 changed files
with
92 additions
and
28 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
#ifndef _LINUX_TRACE_SEQ_H | ||
#define _LINUX_TRACE_SEQ_H | ||
|
||
/* | ||
* Trace sequences are used to allow a function to call several other functions | ||
* to create a string of data to use (up to a max of PAGE_SIZE. | ||
*/ | ||
|
||
struct trace_seq { | ||
unsigned char buffer[PAGE_SIZE]; | ||
unsigned int len; | ||
unsigned int readpos; | ||
}; | ||
|
||
static inline void | ||
trace_seq_init(struct trace_seq *s) | ||
{ | ||
s->len = 0; | ||
s->readpos = 0; | ||
} | ||
|
||
/* | ||
* Currently only defined when tracing is enabled. | ||
*/ | ||
#ifdef CONFIG_TRACING | ||
extern int trace_seq_printf(struct trace_seq *s, const char *fmt, ...) | ||
__attribute__ ((format (printf, 2, 3))); | ||
extern int | ||
trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary); | ||
extern void trace_print_seq(struct seq_file *m, struct trace_seq *s); | ||
extern ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf, | ||
size_t cnt); | ||
extern int trace_seq_puts(struct trace_seq *s, const char *str); | ||
extern int trace_seq_putc(struct trace_seq *s, unsigned char c); | ||
extern int trace_seq_putmem(struct trace_seq *s, const void *mem, size_t len); | ||
extern int trace_seq_putmem_hex(struct trace_seq *s, const void *mem, | ||
size_t len); | ||
extern void *trace_seq_reserve(struct trace_seq *s, size_t len); | ||
extern int trace_seq_path(struct trace_seq *s, struct path *path); | ||
|
||
#else /* CONFIG_TRACING */ | ||
static inline int trace_seq_printf(struct trace_seq *s, const char *fmt, ...) | ||
__attribute__ ((format (printf, 2, 3))) | ||
{ | ||
return 0; | ||
} | ||
static inline int | ||
trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary) | ||
{ | ||
return 0; | ||
} | ||
|
||
static inline void trace_print_seq(struct seq_file *m, struct trace_seq *s) | ||
{ | ||
} | ||
static inline ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf, | ||
size_t cnt) | ||
{ | ||
return 0; | ||
} | ||
static inline int trace_seq_puts(struct trace_seq *s, const char *str) | ||
{ | ||
return 0; | ||
} | ||
static inline int trace_seq_putc(struct trace_seq *s, unsigned char c); | ||
{ | ||
return 0; | ||
} | ||
static inline int | ||
trace_seq_putmem(struct trace_seq *s, const void *mem, size_t len) | ||
{ | ||
return 0; | ||
} | ||
static inline int trace_seq_putmem_hex(struct trace_seq *s, const void *mem, | ||
size_t len) | ||
{ | ||
return 0; | ||
} | ||
static inline void *trace_seq_reserve(struct trace_seq *s, size_t len) | ||
{ | ||
return NULL; | ||
} | ||
static inline int trace_seq_path(struct trace_seq *s, struct path *path) | ||
{ | ||
return 0; | ||
} | ||
#endif /* CONFIG_TRACING */ | ||
|
||
#endif /* _LINUX_TRACE_SEQ_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters