/* Event entry printers */ enum print_line_t print_kprobe_event(struct trace_iterator *iter, int flags) { struct kprobe_trace_entry *field; struct trace_seq *s = &iter->seq; struct trace_event *event; struct trace_probe *tp; int i; field = (struct kprobe_trace_entry *)iter->ent; event = ftrace_find_event(field->ent.type); tp = container_of(event, struct trace_probe, event); if (!trace_seq_printf(s, "%s: (", tp->call.name)) goto partial; if (!seq_print_ip_sym(s, field->ip, flags | TRACE_ITER_SYM_OFFSET)) goto partial; if (!trace_seq_puts(s, ")")) goto partial; for (i = 0; i < field->nargs; i++) if (!trace_seq_printf(s, " %s=%lx", tp->args[i].name, field->args[i])) goto partial; if (!trace_seq_puts(s, "\n")) goto partial; return TRACE_TYPE_HANDLED; partial: return TRACE_TYPE_PARTIAL_LINE; }
static enum print_line_t kmemtrace_print_free_compress(struct trace_iterator *iter, struct kmemtrace_free_entry *entry) { struct trace_seq *s = &iter->seq; int ret; /* Free entry */ ret = trace_seq_printf(s, " - "); if (!ret) return TRACE_TYPE_PARTIAL_LINE; /* Type */ switch (entry->type_id) { case KMEMTRACE_TYPE_KMALLOC: ret = trace_seq_printf(s, "K "); break; case KMEMTRACE_TYPE_CACHE: ret = trace_seq_printf(s, "C "); break; case KMEMTRACE_TYPE_PAGES: ret = trace_seq_printf(s, "P "); break; default: ret = trace_seq_printf(s, "? "); } if (!ret) return TRACE_TYPE_PARTIAL_LINE; /* Skip requested/allocated/flags */ ret = trace_seq_printf(s, " "); if (!ret) return TRACE_TYPE_PARTIAL_LINE; /* Pointer to allocated */ ret = trace_seq_printf(s, "0x%tx ", (ptrdiff_t)entry->ptr); if (!ret) return TRACE_TYPE_PARTIAL_LINE; /* Skip node */ ret = trace_seq_printf(s, " "); if (!ret) return TRACE_TYPE_PARTIAL_LINE; /* Call site */ ret = seq_print_ip_sym(s, entry->call_site, 0); if (!ret) return TRACE_TYPE_PARTIAL_LINE; if (!trace_seq_printf(s, "\n")) return TRACE_TYPE_PARTIAL_LINE; return TRACE_TYPE_HANDLED; }
static enum print_line_t bts_trace_print_line(struct trace_iterator *iter) { struct trace_entry *entry = iter->ent; struct trace_seq *seq = &iter->seq; struct hw_branch_entry *it; unsigned long symflags = TRACE_ITER_SYM_OFFSET; trace_assign_type(it, entry); if (entry->type == TRACE_HW_BRANCHES) { if (trace_seq_printf(seq, "%4d ", iter->cpu) && seq_print_ip_sym(seq, it->to, symflags) && trace_seq_printf(seq, "\t <- ") && seq_print_ip_sym(seq, it->from, symflags) && trace_seq_printf(seq, "\n")) return TRACE_TYPE_HANDLED; return TRACE_TYPE_PARTIAL_LINE;; } return TRACE_TYPE_UNHANDLED; }
static enum print_line_t bts_trace_print_line(struct trace_iterator *iter) { struct trace_entry *entry = iter->ent; struct trace_seq *seq = &iter->seq; struct hw_branch_entry *it; trace_assign_type(it, entry); if (entry->type == TRACE_HW_BRANCHES) { if (trace_seq_printf(seq, "%4d ", entry->cpu) && trace_seq_printf(seq, "0x%016llx -> 0x%016llx ", it->from, it->to) && (!it->from || seq_print_ip_sym(seq, it->from, /* sym_flags = */ 0)) && trace_seq_printf(seq, "\n")) return TRACE_TYPE_HANDLED; return TRACE_TYPE_PARTIAL_LINE;; } return TRACE_TYPE_UNHANDLED; }
/* The two other following provide a more minimalistic output */ static enum print_line_t kmemtrace_print_alloc_compress(struct trace_iterator *iter, struct kmemtrace_alloc_entry *entry) { struct trace_seq *s = &iter->seq; int ret; /* Alloc entry */ ret = trace_seq_printf(s, " + "); if (!ret) return TRACE_TYPE_PARTIAL_LINE; /* Type */ switch (entry->type_id) { case KMEMTRACE_TYPE_KMALLOC: ret = trace_seq_printf(s, "K "); break; case KMEMTRACE_TYPE_CACHE: ret = trace_seq_printf(s, "C "); break; case KMEMTRACE_TYPE_PAGES: ret = trace_seq_printf(s, "P "); break; default: ret = trace_seq_printf(s, "? "); } if (!ret) return TRACE_TYPE_PARTIAL_LINE; /* Requested */ ret = trace_seq_printf(s, "%4zu ", entry->bytes_req); if (!ret) return TRACE_TYPE_PARTIAL_LINE; /* Allocated */ ret = trace_seq_printf(s, "%4zu ", entry->bytes_alloc); if (!ret) return TRACE_TYPE_PARTIAL_LINE; /* Flags * TODO: would be better to see the name of the GFP flag names */ ret = trace_seq_printf(s, "%08x ", entry->gfp_flags); if (!ret) return TRACE_TYPE_PARTIAL_LINE; /* Pointer to allocated */ ret = trace_seq_printf(s, "0x%tx ", (ptrdiff_t)entry->ptr); if (!ret) return TRACE_TYPE_PARTIAL_LINE; /* Node */ ret = trace_seq_printf(s, "%4d ", entry->node); if (!ret) return TRACE_TYPE_PARTIAL_LINE; /* Call site */ ret = seq_print_ip_sym(s, entry->call_site, 0); if (!ret) return TRACE_TYPE_PARTIAL_LINE; if (!trace_seq_printf(s, "\n")) return TRACE_TYPE_PARTIAL_LINE; return TRACE_TYPE_HANDLED; }