diff options
Diffstat (limited to 'kernel/trace/trace_output.c')
| -rw-r--r-- | kernel/trace/trace_output.c | 32 |
1 files changed, 32 insertions, 0 deletions
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; |
