Skip to content

Commit ddc1637

Browse files
Li ZefanIngo Molnar
authored andcommitted
kmemtrace: Print binary output only if 'bin' option is set
Currently by default the output of kmemtrace is binary format instead of human-readable output. This patch makes the following changes: - We'll see human-readable output by default - We'll see binary output if 'bin' option is set Note: you may probably need to explicitly disable context-info binary output: # echo 0 > options/context-info # echo 1 > options/bin # cat trace_pipe v2: - use %pF to print call_site Signed-off-by: Li Zefan <[email protected]> Acked-by: Pekka Enberg <[email protected]> Acked-by: Eduard - Gabriel Munteanu <[email protected]> Cc: Steven Rostedt <[email protected]> Cc: Frederic Weisbecker <[email protected]> LKML-Reference: <[email protected]> Signed-off-by: Ingo Molnar <[email protected]>
1 parent 020e5f8 commit ddc1637

File tree

1 file changed

+90
-30
lines changed

1 file changed

+90
-30
lines changed

kernel/trace/kmemtrace.c

Lines changed: 90 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -239,12 +239,52 @@ struct kmemtrace_user_event_alloc {
239239
};
240240

241241
static enum print_line_t
242-
kmemtrace_print_alloc_user(struct trace_iterator *iter,
243-
struct kmemtrace_alloc_entry *entry)
242+
kmemtrace_print_alloc_user(struct trace_iterator *iter, int flags)
243+
{
244+
struct trace_seq *s = &iter->seq;
245+
struct kmemtrace_alloc_entry *entry;
246+
int ret;
247+
248+
trace_assign_type(entry, iter->ent);
249+
250+
ret = trace_seq_printf(s, "type_id %d call_site %pF ptr %lu "
251+
"bytes_req %lu bytes_alloc %lu gfp_flags %lu node %d\n",
252+
entry->type_id, (void *)entry->call_site, (unsigned long)entry->ptr,
253+
(unsigned long)entry->bytes_req, (unsigned long)entry->bytes_alloc,
254+
(unsigned long)entry->gfp_flags, entry->node);
255+
256+
if (!ret)
257+
return TRACE_TYPE_PARTIAL_LINE;
258+
return TRACE_TYPE_HANDLED;
259+
}
260+
261+
static enum print_line_t
262+
kmemtrace_print_free_user(struct trace_iterator *iter, int flags)
244263
{
245-
struct kmemtrace_user_event_alloc *ev_alloc;
246264
struct trace_seq *s = &iter->seq;
265+
struct kmemtrace_free_entry *entry;
266+
int ret;
267+
268+
trace_assign_type(entry, iter->ent);
269+
270+
ret = trace_seq_printf(s, "type_id %d call_site %pF ptr %lu\n",
271+
entry->type_id, (void *)entry->call_site,
272+
(unsigned long)entry->ptr);
273+
274+
if (!ret)
275+
return TRACE_TYPE_PARTIAL_LINE;
276+
return TRACE_TYPE_HANDLED;
277+
}
278+
279+
static enum print_line_t
280+
kmemtrace_print_alloc_user_bin(struct trace_iterator *iter, int flags)
281+
{
282+
struct trace_seq *s = &iter->seq;
283+
struct kmemtrace_alloc_entry *entry;
247284
struct kmemtrace_user_event *ev;
285+
struct kmemtrace_user_event_alloc *ev_alloc;
286+
287+
trace_assign_type(entry, iter->ent);
248288

249289
ev = trace_seq_reserve(s, sizeof(*ev));
250290
if (!ev)
@@ -271,12 +311,14 @@ kmemtrace_print_alloc_user(struct trace_iterator *iter,
271311
}
272312

273313
static enum print_line_t
274-
kmemtrace_print_free_user(struct trace_iterator *iter,
275-
struct kmemtrace_free_entry *entry)
314+
kmemtrace_print_free_user_bin(struct trace_iterator *iter, int flags)
276315
{
277316
struct trace_seq *s = &iter->seq;
317+
struct kmemtrace_free_entry *entry;
278318
struct kmemtrace_user_event *ev;
279319

320+
trace_assign_type(entry, iter->ent);
321+
280322
ev = trace_seq_reserve(s, sizeof(*ev));
281323
if (!ev)
282324
return TRACE_TYPE_PARTIAL_LINE;
@@ -294,12 +336,14 @@ kmemtrace_print_free_user(struct trace_iterator *iter,
294336

295337
/* The two other following provide a more minimalistic output */
296338
static enum print_line_t
297-
kmemtrace_print_alloc_compress(struct trace_iterator *iter,
298-
struct kmemtrace_alloc_entry *entry)
339+
kmemtrace_print_alloc_compress(struct trace_iterator *iter)
299340
{
341+
struct kmemtrace_alloc_entry *entry;
300342
struct trace_seq *s = &iter->seq;
301343
int ret;
302344

345+
trace_assign_type(entry, iter->ent);
346+
303347
/* Alloc entry */
304348
ret = trace_seq_printf(s, " + ");
305349
if (!ret)
@@ -362,12 +406,14 @@ kmemtrace_print_alloc_compress(struct trace_iterator *iter,
362406
}
363407

364408
static enum print_line_t
365-
kmemtrace_print_free_compress(struct trace_iterator *iter,
366-
struct kmemtrace_free_entry *entry)
409+
kmemtrace_print_free_compress(struct trace_iterator *iter)
367410
{
411+
struct kmemtrace_free_entry *entry;
368412
struct trace_seq *s = &iter->seq;
369413
int ret;
370414

415+
trace_assign_type(entry, iter->ent);
416+
371417
/* Free entry */
372418
ret = trace_seq_printf(s, " - ");
373419
if (!ret)
@@ -421,32 +467,31 @@ static enum print_line_t kmemtrace_print_line(struct trace_iterator *iter)
421467
{
422468
struct trace_entry *entry = iter->ent;
423469

424-
switch (entry->type) {
425-
case TRACE_KMEM_ALLOC: {
426-
struct kmemtrace_alloc_entry *field;
427-
428-
trace_assign_type(field, entry);
429-
if (kmem_tracer_flags.val & TRACE_KMEM_OPT_MINIMAL)
430-
return kmemtrace_print_alloc_compress(iter, field);
431-
else
432-
return kmemtrace_print_alloc_user(iter, field);
433-
}
434-
435-
case TRACE_KMEM_FREE: {
436-
struct kmemtrace_free_entry *field;
437-
438-
trace_assign_type(field, entry);
439-
if (kmem_tracer_flags.val & TRACE_KMEM_OPT_MINIMAL)
440-
return kmemtrace_print_free_compress(iter, field);
441-
else
442-
return kmemtrace_print_free_user(iter, field);
443-
}
470+
if (!(kmem_tracer_flags.val & TRACE_KMEM_OPT_MINIMAL))
471+
return TRACE_TYPE_UNHANDLED;
444472

473+
switch (entry->type) {
474+
case TRACE_KMEM_ALLOC:
475+
return kmemtrace_print_alloc_compress(iter);
476+
case TRACE_KMEM_FREE:
477+
return kmemtrace_print_free_compress(iter);
445478
default:
446479
return TRACE_TYPE_UNHANDLED;
447480
}
448481
}
449482

483+
static struct trace_event kmem_trace_alloc = {
484+
.type = TRACE_KMEM_ALLOC,
485+
.trace = kmemtrace_print_alloc_user,
486+
.binary = kmemtrace_print_alloc_user_bin,
487+
};
488+
489+
static struct trace_event kmem_trace_free = {
490+
.type = TRACE_KMEM_FREE,
491+
.trace = kmemtrace_print_free_user,
492+
.binary = kmemtrace_print_free_user_bin,
493+
};
494+
450495
static struct tracer kmem_tracer __read_mostly = {
451496
.name = "kmemtrace",
452497
.init = kmem_trace_init,
@@ -463,6 +508,21 @@ void kmemtrace_init(void)
463508

464509
static int __init init_kmem_tracer(void)
465510
{
466-
return register_tracer(&kmem_tracer);
511+
if (!register_ftrace_event(&kmem_trace_alloc)) {
512+
pr_warning("Warning: could not register kmem events\n");
513+
return 1;
514+
}
515+
516+
if (!register_ftrace_event(&kmem_trace_free)) {
517+
pr_warning("Warning: could not register kmem events\n");
518+
return 1;
519+
}
520+
521+
if (!register_tracer(&kmem_tracer)) {
522+
pr_warning("Warning: could not register the kmem tracer\n");
523+
return 1;
524+
}
525+
526+
return 0;
467527
}
468528
device_initcall(init_kmem_tracer);

0 commit comments

Comments
 (0)