diff options
-rw-r--r-- | include/linux/trace_seq.h | 2 | ||||
-rw-r--r-- | kernel/trace/trace_output.c | 32 |
2 files changed, 34 insertions, 0 deletions
diff --git a/include/linux/trace_seq.h b/include/linux/trace_seq.h index ba9627f00d3f..c68bccba2074 100644 --- a/include/linux/trace_seq.h +++ b/include/linux/trace_seq.h | |||
@@ -27,6 +27,8 @@ trace_seq_init(struct trace_seq *s) | |||
27 | #ifdef CONFIG_TRACING | 27 | #ifdef CONFIG_TRACING |
28 | extern int trace_seq_printf(struct trace_seq *s, const char *fmt, ...) | 28 | extern int trace_seq_printf(struct trace_seq *s, const char *fmt, ...) |
29 | __attribute__ ((format (printf, 2, 3))); | 29 | __attribute__ ((format (printf, 2, 3))); |
30 | extern int trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args) | ||
31 | __attribute__ ((format (printf, 2, 0))); | ||
30 | extern int | 32 | extern int |
31 | trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary); | 33 | trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary); |
32 | extern void trace_print_seq(struct seq_file *m, struct trace_seq *s); | 34 | extern void trace_print_seq(struct seq_file *m, struct trace_seq *s); |
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index 425725c1622d..c05aff465dc9 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c | |||
@@ -100,6 +100,38 @@ trace_seq_printf(struct trace_seq *s, const char *fmt, ...) | |||
100 | } | 100 | } |
101 | EXPORT_SYMBOL_GPL(trace_seq_printf); | 101 | EXPORT_SYMBOL_GPL(trace_seq_printf); |
102 | 102 | ||
103 | /** | ||
104 | * trace_seq_vprintf - sequence printing of trace information | ||
105 | * @s: trace sequence descriptor | ||
106 | * @fmt: printf format string | ||
107 | * | ||
108 | * The tracer may use either sequence operations or its own | ||
109 | * copy to user routines. To simplify formating of a trace | ||
110 | * trace_seq_printf is used to store strings into a special | ||
111 | * buffer (@s). Then the output may be either used by | ||
112 | * the sequencer or pulled into another buffer. | ||
113 | */ | ||
114 | int | ||
115 | trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args) | ||
116 | { | ||
117 | int len = (PAGE_SIZE - 1) - s->len; | ||
118 | int ret; | ||
119 | |||
120 | if (!len) | ||
121 | return 0; | ||
122 | |||
123 | ret = vsnprintf(s->buffer + s->len, len, fmt, args); | ||
124 | |||
125 | /* If we can't write it all, don't bother writing anything */ | ||
126 | if (ret >= len) | ||
127 | return 0; | ||
128 | |||
129 | s->len += ret; | ||
130 | |||
131 | return len; | ||
132 | } | ||
133 | EXPORT_SYMBOL_GPL(trace_seq_vprintf); | ||
134 | |||
103 | int trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary) | 135 | int trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary) |
104 | { | 136 | { |
105 | int len = (PAGE_SIZE - 1) - s->len; | 137 | int len = (PAGE_SIZE - 1) - s->len; |