]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
tracing: Use seq_buf_hex_dump() to dump buffers
authorPiotr Maziarz <piotrx.maziarz@linux.intel.com>
Thu, 7 Nov 2019 12:45:38 +0000 (13:45 +0100)
committerSteven Rostedt (VMware) <rostedt@goodmis.org>
Thu, 14 Nov 2019 18:15:12 +0000 (13:15 -0500)
Without this, buffers can be printed with __print_array macro that has
no formatting options and can be hard to read. The other way is to
mimic formatting capability with multiple calls of trace event with one
call per row which gives performance impact and different timestamp in
each row.

Link: http://lkml.kernel.org/r/1573130738-29390-2-git-send-email-piotrx.maziarz@linux.intel.com
Signed-off-by: Piotr Maziarz <piotrx.maziarz@linux.intel.com>
Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
include/linux/trace_events.h
include/linux/trace_seq.h
include/trace/trace_events.h
kernel/trace/trace_output.c
kernel/trace/trace_seq.c

index 30a8cdcfd4a4f2c72e89eefcbf71e2bb6764dcd2..60a41b7069dd3673406bc190169cb507fe850d31 100644 (file)
@@ -45,6 +45,11 @@ const char *trace_print_array_seq(struct trace_seq *p,
                                   const void *buf, int count,
                                   size_t el_size);
 
+const char *
+trace_print_hex_dump_seq(struct trace_seq *p, const char *prefix_str,
+                        int prefix_type, int rowsize, int groupsize,
+                        const void *buf, size_t len, bool ascii);
+
 struct trace_iterator;
 struct trace_event;
 
index 6609b39a723261cf9e0dc3afc154f28d66f98ce2..6c30508fca1989f6f882933388245ae649cfa58a 100644 (file)
@@ -92,6 +92,10 @@ extern int trace_seq_path(struct trace_seq *s, const struct path *path);
 extern void trace_seq_bitmask(struct trace_seq *s, const unsigned long *maskp,
                             int nmaskbits);
 
+extern int trace_seq_hex_dump(struct trace_seq *s, const char *prefix_str,
+                             int prefix_type, int rowsize, int groupsize,
+                             const void *buf, size_t len, bool ascii);
+
 #else /* CONFIG_TRACING */
 static inline void trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
 {
index 4ecdfe2e3580077630326a41b34702374c8ebe82..7089760d4c7a81d907c3287541f83a0bafdde4be 100644 (file)
@@ -340,6 +340,12 @@ TRACE_MAKE_SYSTEM_STR();
                trace_print_array_seq(p, array, count, el_size);        \
        })
 
+#undef __print_hex_dump
+#define __print_hex_dump(prefix_str, prefix_type,                      \
+                        rowsize, groupsize, buf, len, ascii)           \
+       trace_print_hex_dump_seq(p, prefix_str, prefix_type,            \
+                                rowsize, groupsize, buf, len, ascii)
+
 #undef DECLARE_EVENT_CLASS
 #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
 static notrace enum print_line_t                                       \
index d54ce252b05a848edb5d05ff3f32132975634b2c..d9b4b7c22db4af5b28ba92364671ef163dfc8c8b 100644 (file)
@@ -274,6 +274,21 @@ trace_print_array_seq(struct trace_seq *p, const void *buf, int count,
 }
 EXPORT_SYMBOL(trace_print_array_seq);
 
+const char *
+trace_print_hex_dump_seq(struct trace_seq *p, const char *prefix_str,
+                        int prefix_type, int rowsize, int groupsize,
+                        const void *buf, size_t len, bool ascii)
+{
+       const char *ret = trace_seq_buffer_ptr(p);
+
+       trace_seq_putc(p, '\n');
+       trace_seq_hex_dump(p, prefix_str, prefix_type,
+                          rowsize, groupsize, buf, len, ascii);
+       trace_seq_putc(p, 0);
+       return ret;
+}
+EXPORT_SYMBOL(trace_print_hex_dump_seq);
+
 int trace_raw_output_prep(struct trace_iterator *iter,
                          struct trace_event *trace_event)
 {
index 6b1c562ffdaf0f0be1549e5eb34b8a199c11b273..344e4c1aa09ccf6bc69a17da761a45290681407c 100644 (file)
@@ -376,3 +376,33 @@ int trace_seq_to_user(struct trace_seq *s, char __user *ubuf, int cnt)
        return seq_buf_to_user(&s->seq, ubuf, cnt);
 }
 EXPORT_SYMBOL_GPL(trace_seq_to_user);
+
+int trace_seq_hex_dump(struct trace_seq *s, const char *prefix_str,
+                      int prefix_type, int rowsize, int groupsize,
+                      const void *buf, size_t len, bool ascii)
+{
+               unsigned int save_len = s->seq.len;
+
+       if (s->full)
+               return 0;
+
+       __trace_seq_init(s);
+
+       if (TRACE_SEQ_BUF_LEFT(s) < 1) {
+               s->full = 1;
+               return 0;
+       }
+
+       seq_buf_hex_dump(&(s->seq), prefix_str,
+                  prefix_type, rowsize, groupsize,
+                  buf, len, ascii);
+
+       if (unlikely(seq_buf_has_overflowed(&s->seq))) {
+               s->seq.len = save_len;
+               s->full = 1;
+               return 0;
+       }
+
+       return 1;
+}
+EXPORT_SYMBOL(trace_seq_hex_dump);