Skip to content

Commit ef56e04

Browse files
Piotr Maziarzrostedt
authored andcommitted
tracing: Use seq_buf_hex_dump() to dump buffers
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/[email protected] Signed-off-by: Piotr Maziarz <[email protected]> Signed-off-by: Cezary Rojewski <[email protected]> Signed-off-by: Steven Rostedt (VMware) <[email protected]>
1 parent 353cade commit ef56e04

File tree

5 files changed

+60
-0
lines changed

5 files changed

+60
-0
lines changed

include/linux/trace_events.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ const char *trace_print_array_seq(struct trace_seq *p,
4545
const void *buf, int count,
4646
size_t el_size);
4747

48+
const char *
49+
trace_print_hex_dump_seq(struct trace_seq *p, const char *prefix_str,
50+
int prefix_type, int rowsize, int groupsize,
51+
const void *buf, size_t len, bool ascii);
52+
4853
struct trace_iterator;
4954
struct trace_event;
5055

include/linux/trace_seq.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ extern int trace_seq_path(struct trace_seq *s, const struct path *path);
9292
extern void trace_seq_bitmask(struct trace_seq *s, const unsigned long *maskp,
9393
int nmaskbits);
9494

95+
extern int trace_seq_hex_dump(struct trace_seq *s, const char *prefix_str,
96+
int prefix_type, int rowsize, int groupsize,
97+
const void *buf, size_t len, bool ascii);
98+
9599
#else /* CONFIG_TRACING */
96100
static inline void trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
97101
{

include/trace/trace_events.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,12 @@ TRACE_MAKE_SYSTEM_STR();
340340
trace_print_array_seq(p, array, count, el_size); \
341341
})
342342

343+
#undef __print_hex_dump
344+
#define __print_hex_dump(prefix_str, prefix_type, \
345+
rowsize, groupsize, buf, len, ascii) \
346+
trace_print_hex_dump_seq(p, prefix_str, prefix_type, \
347+
rowsize, groupsize, buf, len, ascii)
348+
343349
#undef DECLARE_EVENT_CLASS
344350
#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
345351
static notrace enum print_line_t \

kernel/trace/trace_output.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,21 @@ trace_print_array_seq(struct trace_seq *p, const void *buf, int count,
274274
}
275275
EXPORT_SYMBOL(trace_print_array_seq);
276276

277+
const char *
278+
trace_print_hex_dump_seq(struct trace_seq *p, const char *prefix_str,
279+
int prefix_type, int rowsize, int groupsize,
280+
const void *buf, size_t len, bool ascii)
281+
{
282+
const char *ret = trace_seq_buffer_ptr(p);
283+
284+
trace_seq_putc(p, '\n');
285+
trace_seq_hex_dump(p, prefix_str, prefix_type,
286+
rowsize, groupsize, buf, len, ascii);
287+
trace_seq_putc(p, 0);
288+
return ret;
289+
}
290+
EXPORT_SYMBOL(trace_print_hex_dump_seq);
291+
277292
int trace_raw_output_prep(struct trace_iterator *iter,
278293
struct trace_event *trace_event)
279294
{

kernel/trace/trace_seq.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,3 +376,33 @@ int trace_seq_to_user(struct trace_seq *s, char __user *ubuf, int cnt)
376376
return seq_buf_to_user(&s->seq, ubuf, cnt);
377377
}
378378
EXPORT_SYMBOL_GPL(trace_seq_to_user);
379+
380+
int trace_seq_hex_dump(struct trace_seq *s, const char *prefix_str,
381+
int prefix_type, int rowsize, int groupsize,
382+
const void *buf, size_t len, bool ascii)
383+
{
384+
unsigned int save_len = s->seq.len;
385+
386+
if (s->full)
387+
return 0;
388+
389+
__trace_seq_init(s);
390+
391+
if (TRACE_SEQ_BUF_LEFT(s) < 1) {
392+
s->full = 1;
393+
return 0;
394+
}
395+
396+
seq_buf_hex_dump(&(s->seq), prefix_str,
397+
prefix_type, rowsize, groupsize,
398+
buf, len, ascii);
399+
400+
if (unlikely(seq_buf_has_overflowed(&s->seq))) {
401+
s->seq.len = save_len;
402+
s->full = 1;
403+
return 0;
404+
}
405+
406+
return 1;
407+
}
408+
EXPORT_SYMBOL(trace_seq_hex_dump);

0 commit comments

Comments
 (0)