|
@@ -100,6 +100,38 @@ trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(trace_seq_printf);
|
|
|
|
|
|
+/**
|
|
|
+ * trace_seq_vprintf - sequence printing of trace information
|
|
|
+ * @s: trace sequence descriptor
|
|
|
+ * @fmt: printf format string
|
|
|
+ *
|
|
|
+ * The tracer may use either sequence operations or its own
|
|
|
+ * copy to user routines. To simplify formating of a trace
|
|
|
+ * trace_seq_printf is used to store strings into a special
|
|
|
+ * buffer (@s). Then the output may be either used by
|
|
|
+ * the sequencer or pulled into another buffer.
|
|
|
+ */
|
|
|
+int
|
|
|
+trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args)
|
|
|
+{
|
|
|
+ int len = (PAGE_SIZE - 1) - s->len;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ if (!len)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ ret = vsnprintf(s->buffer + s->len, len, fmt, args);
|
|
|
+
|
|
|
+ /* If we can't write it all, don't bother writing anything */
|
|
|
+ if (ret >= len)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ s->len += ret;
|
|
|
+
|
|
|
+ return len;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(trace_seq_vprintf);
|
|
|
+
|
|
|
int trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary)
|
|
|
{
|
|
|
int len = (PAGE_SIZE - 1) - s->len;
|