static int blk_log_remap(struct trace_seq *s, const struct trace_entry *ent) { struct blk_io_trace_remap r = { .device_from = 0, }; get_pdu_remap(ent, &r); return trace_seq_printf(s, "%llu + %u <- (%d,%d) %llu\n", t_sector(ent), t_sec(ent), MAJOR(r.device_from), MINOR(r.device_from), (unsigned long long)r.sector_from); } static int blk_log_plug(struct trace_seq *s, const struct trace_entry *ent) { char cmd[TASK_COMM_LEN]; trace_find_cmdline(ent->pid, cmd); return trace_seq_printf(s, "[%s]\n", cmd); }
const char *nvme_trace_disk_name(struct trace_seq *p, char *name) { const char *ret = trace_seq_buffer_ptr(p); if (*name) trace_seq_printf(p, "disk=%s, ", name); trace_seq_putc(p, 0); return ret; }
static int timer_expire_handler(struct trace_seq *s, struct pevent_record *record, struct event_format *event, void *context) { trace_seq_printf(s, "hrtimer="); if (pevent_print_num_field(s, "0x%llx", event, "timer", record, 0) == -1) pevent_print_num_field(s, "0x%llx", event, "hrtimer", record, 1); trace_seq_printf(s, " now="); pevent_print_num_field(s, "%llu", event, "now", record, 1); pevent_print_func_field(s, " function=%s", event, "function", record, 0); return 0; }
static int blk_log_with_error(struct trace_seq *s, const struct trace_entry *ent) { if (t_action(ent) & BLK_TC_ACT(BLK_TC_PC)) { int ret; ret = blk_log_dump_pdu(s, ent); if (ret) return trace_seq_printf(s, "[%d]\n", t_error(ent)); return 0; } else { if (t_sec(ent)) return trace_seq_printf(s, "%llu + %u [%d]\n", t_sector(ent), t_sec(ent), t_error(ent)); return trace_seq_printf(s, "%llu [%d]\n", t_sector(ent), t_error(ent)); } }
static const char *nvme_trace_dsm(struct trace_seq *p, u8 *cdw10) { const char *ret = trace_seq_buffer_ptr(p); trace_seq_printf(p, "nr=%u, attributes=%u", get_unaligned_le32(cdw10), get_unaligned_le32(cdw10 + 4)); trace_seq_putc(p, 0); return ret; }
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 const char *nvme_trace_admin_identify(struct trace_seq *p, u8 *cdw10) { const char *ret = trace_seq_buffer_ptr(p); u8 cns = cdw10[0]; u16 ctrlid = get_unaligned_le16(cdw10 + 2); trace_seq_printf(p, "cns=%u, ctrlid=%u", cns, ctrlid); trace_seq_putc(p, 0); return ret; }
/** * trace_util_print_plugin_options - print out the registered plugin options * @s: The trace_seq descriptor to write the plugin options into * * Writes a list of options into trace_seq @s. */ void trace_util_print_plugin_options(struct trace_seq *s) { struct registered_plugin_options *reg; struct pevent_plugin_option *op; for (reg = registered_options; reg; reg = reg->next) { if (reg != registered_options) trace_seq_printf(s, "============\n"); for (op = reg->options; op->name; op++) { if (op != reg->options) trace_seq_printf(s, "------------\n"); print_op_data(s, "file", op->file); print_op_data(s, "plugin", op->plugin_alias); print_op_data(s, "option", op->name); print_op_data(s, "desc", op->description); print_op_data(s, "value", op->value); trace_seq_printf(s, "%8s:\t%d\n", "set", op->set); } } }
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; }
enum print_line_t print_kretprobe_event(struct trace_iterator *iter, int flags) { struct kretprobe_trace_entry *field; struct trace_seq *s = &iter->seq; struct trace_event *event; struct trace_probe *tp; int i; field = (struct kretprobe_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->ret_ip, flags | TRACE_ITER_SYM_OFFSET)) goto partial; if (!trace_seq_puts(s, " <- ")) goto partial; if (!seq_print_ip_sym(s, field->func, 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; }
/* Signal a overhead of time execution to the output */ static void print_graph_overhead(struct trace_seq *s, unsigned long long duration) { /* Non nested entry or return */ if (duration == ~0ULL) return (void)trace_seq_printf(s, " "); /* Duration exceeded 1 sec */ if (duration > 1000000000ULL) return (void)trace_seq_printf(s, "$ "); /* Duration exceeded 1000 usecs */ if (duration > 1000000ULL) return (void)trace_seq_printf(s, "# "); /* Duration exceeded 100 usecs */ if (duration > 100000ULL) return (void)trace_seq_printf(s, "! "); /* Duration exceeded 10 usecs */ if (duration > 10000ULL) return (void)trace_seq_printf(s, "+ "); trace_seq_printf(s, " "); }
static int sched_switch_handler(struct trace_seq *s, struct tep_record *record, struct event_format *event, void *context) { struct format_field *field; unsigned long long val; if (tep_get_field_val(s, event, "prev_pid", record, &val, 1)) return trace_seq_putc(s, '!'); field = tep_find_any_field(event, "prev_comm"); if (field) { write_and_save_comm(field, record, s, val); trace_seq_putc(s, ':'); } trace_seq_printf(s, "%lld ", val); if (tep_get_field_val(s, event, "prev_prio", record, &val, 0) == 0) trace_seq_printf(s, "[%d] ", (int) val); if (tep_get_field_val(s, event, "prev_state", record, &val, 0) == 0) write_state(s, val); trace_seq_puts(s, " ==> "); if (tep_get_field_val(s, event, "next_pid", record, &val, 1)) return trace_seq_putc(s, '!'); field = tep_find_any_field(event, "next_comm"); if (field) { write_and_save_comm(field, record, s, val); trace_seq_putc(s, ':'); } trace_seq_printf(s, "%lld", val); if (tep_get_field_val(s, event, "next_prio", record, &val, 0) == 0) trace_seq_printf(s, " [%d]", (int) val); return 0; }
static void report_extlog_mem_event(struct ras_events *ras, struct pevent_record *record, struct trace_seq *s, struct ras_extlog_event *ev) { trace_seq_printf(s, "%d %s error: %s physical addr: 0x%llx mask: 0x%llx%s %s %s", ev->error_seq, err_severity(ev->severity), err_type(ev->etype), ev->address, err_mask(ev->pa_mask_lsb), err_cper_data(ev->cper_data), ev->fru_text, uuid_le(ev->fru_id)); }
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; trace_assign_type(entry, iter->ent); /* 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 and print call site*/ ret = trace_seq_printf(s, " %pf\n", (void *)entry->call_site); if (!ret) return TRACE_TYPE_PARTIAL_LINE; return TRACE_TYPE_HANDLED; }
static int print_graph_nested(struct trace_seq *s, struct tep_event *event, struct tep_record *record) { struct tep_handle *pevent = event->tep; unsigned long long depth; unsigned long long val; const char *func; int ret; int i; /* No overhead */ print_graph_overhead(s, -1); /* No time */ trace_seq_puts(s, " | "); if (tep_get_field_val(s, event, "depth", record, &depth, 1)) return trace_seq_putc(s, '!'); /* Function */ for (i = 0; i < (int)(depth * TRACE_GRAPH_INDENT); i++) trace_seq_putc(s, ' '); if (tep_get_field_val(s, event, "func", record, &val, 1)) return trace_seq_putc(s, '!'); func = tep_find_function(pevent, val); if (func) ret = trace_seq_printf(s, "%s() {", func); else ret = trace_seq_printf(s, "%llx() {", val); if (ret && fgraph_depth->set) ret = trace_seq_printf(s, " (%lld)", depth); return ret; }
static int blk_log_generic(struct trace_seq *s, const struct trace_entry *ent) { char cmd[TASK_COMM_LEN]; trace_find_cmdline(ent->pid, cmd); if (t_action(ent) & BLK_TC_ACT(BLK_TC_PC)) { int ret; ret = trace_seq_printf(s, "%u ", t_bytes(ent)); if (!ret) return 0; ret = blk_log_dump_pdu(s, ent); if (!ret) return 0; return trace_seq_printf(s, "[%s]\n", cmd); } else { if (t_sec(ent)) return trace_seq_printf(s, "%llu + %u [%s]\n", t_sector(ent), t_sec(ent), cmd); return trace_seq_printf(s, "[%s]\n", cmd); } }
static const char *nvme_trace_create_cq(struct trace_seq *p, u8 *cdw10) { const char *ret = trace_seq_buffer_ptr(p); u16 cqid = get_unaligned_le16(cdw10); u16 qsize = get_unaligned_le16(cdw10 + 2); u16 cq_flags = get_unaligned_le16(cdw10 + 4); u16 irq_vector = get_unaligned_le16(cdw10 + 6); trace_seq_printf(p, "cqid=%u, qsize=%u, cq_flags=0x%x, irq_vector=%u", cqid, qsize, cq_flags, irq_vector); trace_seq_putc(p, 0); return ret; }
static int trace_stack_handler(struct trace_seq *s, struct tep_record *record, struct tep_event *event, void *context) { struct tracecmd_ftrace *finfo = context; struct tep_format_field *field; unsigned long long addr; const char *func; void *data = record->data; field = tep_find_any_field(event, "caller"); if (!field) { trace_seq_printf(s, "<CANT FIND FIELD %s>", "caller"); return 0; } trace_seq_puts(s, "<stack trace>\n"); long_size_check(finfo); for (data += field->offset; data < record->data + record->size; data += finfo->long_size) { addr = tep_read_number(event->tep, data, finfo->long_size); if ((finfo->long_size == 8 && addr == (unsigned long long)-1) || ((int)addr == -1)) break; func = tep_find_function(event->tep, addr); if (func) trace_seq_printf(s, "=> %s (%llx)\n", func, addr); else trace_seq_printf(s, "=> %llx\n", addr); } return 0; }
static void print_string(struct trace_seq *s, struct event_format *event, const char *name, const void *data) { struct format_field *f = tep_find_field(event, name); int offset; int length; if (!f) { trace_seq_printf(s, "NOTFOUND:%s", name); return; } offset = f->offset; length = f->size; if (!strncmp(f->type, "__data_loc", 10)) { unsigned long long v; if (tep_read_number_field(f, data, &v)) { trace_seq_printf(s, "invalid_data_loc"); return; } offset = v & 0xffff; length = v >> 16; }
static int blk_log_action_classic(struct trace_iterator *iter, const char *act) { char rwbs[RWBS_LEN]; unsigned long long ts = iter->ts; unsigned long nsec_rem = do_div(ts, NSEC_PER_SEC); unsigned secs = (unsigned long)ts; const struct blk_io_trace *t = te_blk_io_trace(iter->ent); fill_rwbs(rwbs, t); return trace_seq_printf(&iter->seq, "%3d,%-3d %2d %5d.%09lu %5u %2s %3s ", MAJOR(t->device), MINOR(t->device), iter->cpu, secs, nsec_rem, iter->ent->pid, act, rwbs); }
static enum print_line_t trace_branch_print(struct trace_iterator *iter, int flags, struct trace_event *event) { struct trace_branch *field; trace_assign_type(field, iter->ent); trace_seq_printf(&iter->seq, "[%s] %s:%s:%d\n", field->correct ? " ok " : " MISS ", field->func, field->file, field->line); return trace_handle_return(&iter->seq); }
int syscall_exit_format(struct ftrace_event_call *call, struct trace_seq *s) { int ret; struct syscall_trace_exit trace; ret = trace_seq_printf(s, "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n", SYSCALL_FIELD(int, nr), SYSCALL_FIELD(long, ret)); if (!ret) return 0; return trace_seq_printf(s, "\nprint fmt: \"0x%%lx\", REC->ret\n"); }
static enum print_line_t trace_branch_print(struct trace_iterator *iter, int flags, struct trace_event *event) { struct trace_branch *field; trace_assign_type(field, iter->ent); if (trace_seq_printf(&iter->seq, "[%s] %s:%s:%d\n", field->correct ? " ok " : " MISS ", field->func, field->file, field->line)) return TRACE_TYPE_PARTIAL_LINE; return TRACE_TYPE_HANDLED; }
static const char *nvme_trace_read_write(struct trace_seq *p, u8 *cdw10) { const char *ret = trace_seq_buffer_ptr(p); u64 slba = get_unaligned_le64(cdw10); u16 length = get_unaligned_le16(cdw10 + 8); u16 control = get_unaligned_le16(cdw10 + 10); u32 dsmgmt = get_unaligned_le32(cdw10 + 12); u32 reftag = get_unaligned_le32(cdw10 + 16); trace_seq_printf(p, "slba=%llu, len=%u, ctrl=0x%x, dsmgmt=%u, reftag=%u", slba, length, control, dsmgmt, reftag); trace_seq_putc(p, 0); return ret; }
static enum print_line_t kmemtrace_print_free(struct trace_iterator *iter, int flags) { struct trace_seq *s = &iter->seq; struct kmemtrace_free_entry *entry; int ret; trace_assign_type(entry, iter->ent); ret = trace_seq_printf(s, "type_id %d call_site %pF ptr %lu\n", entry->type_id, (void *)entry->call_site, (unsigned long)entry->ptr); if (!ret) return TRACE_TYPE_PARTIAL_LINE; return TRACE_TYPE_HANDLED; }
static void write_and_save_comm(struct format_field *field, struct tep_record *record, struct trace_seq *s, int pid) { const char *comm; int len; comm = (char *)(record->data + field->offset); len = s->len; trace_seq_printf(s, "%.*s", field->size, comm); /* make sure the comm has a \0 at the end. */ trace_seq_terminate(s); comm = &s->buffer[len]; /* Help out the comm to ids. This will handle dups */ tep_register_comm(field->event->pevent, comm, pid); }
static enum print_line_t kmemtrace_print_alloc(struct trace_iterator *iter, int flags) { struct trace_seq *s = &iter->seq; struct kmemtrace_alloc_entry *entry; int ret; trace_assign_type(entry, iter->ent); ret = trace_seq_printf(s, "type_id %d call_site %pF ptr %lu " "bytes_req %lu bytes_alloc %lu gfp_flags %lu node %d\n", entry->type_id, (void *)entry->call_site, (unsigned long)entry->ptr, (unsigned long)entry->bytes_req, (unsigned long)entry->bytes_alloc, (unsigned long)entry->gfp_flags, entry->node); if (!ret) return TRACE_TYPE_PARTIAL_LINE; return TRACE_TYPE_HANDLED; }
static int blk_log_dump_pdu(struct trace_seq *s, const struct trace_entry *ent) { const unsigned char *pdu_buf; int pdu_len; int i, end, ret; pdu_buf = pdu_start(ent); pdu_len = te_blk_io_trace(ent)->pdu_len; if (!pdu_len) return 1; /* find the last zero that needs to be printed */ for (end = pdu_len - 1; end >= 0; end--) if (pdu_buf[end]) break; end++; if (!trace_seq_putc(s, '(')) return 0; for (i = 0; i < pdu_len; i++) { ret = trace_seq_printf(s, "%s%02x", i == 0 ? "" : " ", pdu_buf[i]); if (!ret) return ret; /* * stop when the rest is just zeroes and indicate so * with a ".." appended */ if (i == end && end != pdu_len - 1) return trace_seq_puts(s, " ..) "); } return trace_seq_puts(s, ") "); }
static enum print_line_t initcall_call_print_line(struct trace_iterator *iter) { struct trace_entry *entry = iter->ent; struct trace_seq *s = &iter->seq; struct trace_boot_call *field; struct boot_trace_call *call; u64 ts; unsigned long nsec_rem; int ret; trace_assign_type(field, entry); call = &field->boot_call; ts = iter->ts; nsec_rem = do_div(ts, NSEC_PER_SEC); ret = trace_seq_printf(s, "[%5ld.%09ld] calling %s @ %i\n", (unsigned long)ts, nsec_rem, call->func, call->caller); if (!ret) return TRACE_TYPE_PARTIAL_LINE; else return TRACE_TYPE_HANDLED; }
static int function_handler(struct trace_seq *s, struct pevent_record *record, struct event_format *event, void *context) { struct pevent *pevent = event->pevent; unsigned long long function; unsigned long long pfunction; const char *func; const char *parent; int index; if (pevent_get_field_val(s, event, "ip", record, &function, 1)) return trace_seq_putc(s, '!'); func = pevent_find_function(pevent, function); if (pevent_get_field_val(s, event, "parent_ip", record, &pfunction, 1)) return trace_seq_putc(s, '!'); parent = pevent_find_function(pevent, pfunction); index = add_and_get_index(parent, func, record->cpu); trace_seq_printf(s, "%*s", index*3, ""); if (func) trace_seq_printf(s, "%s", func); else trace_seq_printf(s, "0x%llx", function); trace_seq_printf(s, " <-- "); if (parent) trace_seq_printf(s, "%s", parent); else trace_seq_printf(s, "0x%llx", pfunction); return 0; }