Loading kernel/trace/trace.c +64 −26 Original line number Diff line number Diff line Loading @@ -338,7 +338,8 @@ static DECLARE_WAIT_QUEUE_HEAD(trace_wait); /* trace_flags holds trace_options default values */ unsigned long trace_flags = TRACE_ITER_PRINT_PARENT | TRACE_ITER_PRINTK | TRACE_ITER_ANNOTATE | TRACE_ITER_CONTEXT_INFO | TRACE_ITER_SLEEP_TIME | TRACE_ITER_GRAPH_TIME | TRACE_ITER_RECORD_CMD | TRACE_ITER_OVERWRITE; TRACE_ITER_GRAPH_TIME | TRACE_ITER_RECORD_CMD | TRACE_ITER_OVERWRITE | TRACE_ITER_IRQ_INFO; static int trace_stop_count; static DEFINE_RAW_SPINLOCK(tracing_start_lock); Loading Loading @@ -426,6 +427,7 @@ static const char *trace_options[] = { "record-cmd", "overwrite", "disable_on_free", "irq-info", NULL }; Loading Loading @@ -1843,6 +1845,33 @@ static void s_stop(struct seq_file *m, void *p) trace_event_read_unlock(); } static void get_total_entries(struct trace_array *tr, unsigned long *total, unsigned long *entries) { unsigned long count; int cpu; *total = 0; *entries = 0; for_each_tracing_cpu(cpu) { count = ring_buffer_entries_cpu(tr->buffer, cpu); /* * If this buffer has skipped entries, then we hold all * entries for the trace and we need to ignore the * ones before the time stamp. */ if (tr->data[cpu]->skipped_entries) { count -= tr->data[cpu]->skipped_entries; /* total is the same as the entries */ *total += count; } else *total += count + ring_buffer_overrun_cpu(tr->buffer, cpu); *entries += count; } } static void print_lat_help_header(struct seq_file *m) { seq_puts(m, "# _------=> CPU# \n"); Loading @@ -1855,12 +1884,35 @@ static void print_lat_help_header(struct seq_file *m) seq_puts(m, "# \\ / ||||| \\ | / \n"); } static void print_func_help_header(struct seq_file *m) static void print_event_info(struct trace_array *tr, struct seq_file *m) { unsigned long total; unsigned long entries; get_total_entries(tr, &total, &entries); seq_printf(m, "# entries-in-buffer/entries-written: %lu/%lu #P:%d\n", entries, total, num_online_cpus()); seq_puts(m, "#\n"); } static void print_func_help_header(struct trace_array *tr, struct seq_file *m) { print_event_info(tr, m); seq_puts(m, "# TASK-PID CPU# TIMESTAMP FUNCTION\n"); seq_puts(m, "# | | | | |\n"); } static void print_func_help_header_irq(struct trace_array *tr, struct seq_file *m) { print_event_info(tr, m); seq_puts(m, "# _-----=> irqs-off\n"); seq_puts(m, "# / _----=> need-resched\n"); seq_puts(m, "# | / _---=> hardirq/softirq\n"); seq_puts(m, "# || / _--=> preempt-depth\n"); seq_puts(m, "# ||| / delay\n"); seq_puts(m, "# TASK-PID CPU# |||| TIMESTAMP FUNCTION\n"); seq_puts(m, "# | | | |||| | |\n"); } void print_trace_header(struct seq_file *m, struct trace_iterator *iter) Loading @@ -1869,32 +1921,14 @@ print_trace_header(struct seq_file *m, struct trace_iterator *iter) struct trace_array *tr = iter->tr; struct trace_array_cpu *data = tr->data[tr->cpu]; struct tracer *type = current_trace; unsigned long entries = 0; unsigned long total = 0; unsigned long count; unsigned long entries; unsigned long total; const char *name = "preemption"; int cpu; if (type) name = type->name; for_each_tracing_cpu(cpu) { count = ring_buffer_entries_cpu(tr->buffer, cpu); /* * If this buffer has skipped entries, then we hold all * entries for the trace and we need to ignore the * ones before the time stamp. */ if (tr->data[cpu]->skipped_entries) { count -= tr->data[cpu]->skipped_entries; /* total is the same as the entries */ total += count; } else total += count + ring_buffer_overrun_cpu(tr->buffer, cpu); entries += count; } get_total_entries(tr, &total, &entries); seq_printf(m, "# %s latency trace v1.1.5 on %s\n", name, UTS_RELEASE); Loading Loading @@ -2170,8 +2204,12 @@ void trace_default_header(struct seq_file *m) if (!(trace_flags & TRACE_ITER_VERBOSE)) print_lat_help_header(m); } else { if (!(trace_flags & TRACE_ITER_VERBOSE)) print_func_help_header(m); if (!(trace_flags & TRACE_ITER_VERBOSE)) { if (trace_flags & TRACE_ITER_IRQ_INFO) print_func_help_header_irq(iter->tr, m); else print_func_help_header(iter->tr, m); } } } Loading kernel/trace/trace.h +1 −0 Original line number Diff line number Diff line Loading @@ -655,6 +655,7 @@ enum trace_iterator_flags { TRACE_ITER_RECORD_CMD = 0x100000, TRACE_ITER_OVERWRITE = 0x200000, TRACE_ITER_STOP_ON_FREE = 0x400000, TRACE_ITER_IRQ_INFO = 0x800000, }; /* Loading kernel/trace/trace_output.c +14 −2 Original line number Diff line number Diff line Loading @@ -627,11 +627,23 @@ int trace_print_context(struct trace_iterator *iter) unsigned long usec_rem = do_div(t, USEC_PER_SEC); unsigned long secs = (unsigned long)t; char comm[TASK_COMM_LEN]; int ret; trace_find_cmdline(entry->pid, comm); return trace_seq_printf(s, "%16s-%-5d [%03d] %5lu.%06lu: ", comm, entry->pid, iter->cpu, secs, usec_rem); ret = trace_seq_printf(s, "%16s-%-5d [%03d] ", comm, entry->pid, iter->cpu); if (!ret) return 0; if (trace_flags & TRACE_ITER_IRQ_INFO) { ret = trace_print_lat_fmt(s, entry); if (!ret) return 0; } return trace_seq_printf(s, " %5lu.%06lu: ", secs, usec_rem); } int trace_print_lat_context(struct trace_iterator *iter) Loading Loading
kernel/trace/trace.c +64 −26 Original line number Diff line number Diff line Loading @@ -338,7 +338,8 @@ static DECLARE_WAIT_QUEUE_HEAD(trace_wait); /* trace_flags holds trace_options default values */ unsigned long trace_flags = TRACE_ITER_PRINT_PARENT | TRACE_ITER_PRINTK | TRACE_ITER_ANNOTATE | TRACE_ITER_CONTEXT_INFO | TRACE_ITER_SLEEP_TIME | TRACE_ITER_GRAPH_TIME | TRACE_ITER_RECORD_CMD | TRACE_ITER_OVERWRITE; TRACE_ITER_GRAPH_TIME | TRACE_ITER_RECORD_CMD | TRACE_ITER_OVERWRITE | TRACE_ITER_IRQ_INFO; static int trace_stop_count; static DEFINE_RAW_SPINLOCK(tracing_start_lock); Loading Loading @@ -426,6 +427,7 @@ static const char *trace_options[] = { "record-cmd", "overwrite", "disable_on_free", "irq-info", NULL }; Loading Loading @@ -1843,6 +1845,33 @@ static void s_stop(struct seq_file *m, void *p) trace_event_read_unlock(); } static void get_total_entries(struct trace_array *tr, unsigned long *total, unsigned long *entries) { unsigned long count; int cpu; *total = 0; *entries = 0; for_each_tracing_cpu(cpu) { count = ring_buffer_entries_cpu(tr->buffer, cpu); /* * If this buffer has skipped entries, then we hold all * entries for the trace and we need to ignore the * ones before the time stamp. */ if (tr->data[cpu]->skipped_entries) { count -= tr->data[cpu]->skipped_entries; /* total is the same as the entries */ *total += count; } else *total += count + ring_buffer_overrun_cpu(tr->buffer, cpu); *entries += count; } } static void print_lat_help_header(struct seq_file *m) { seq_puts(m, "# _------=> CPU# \n"); Loading @@ -1855,12 +1884,35 @@ static void print_lat_help_header(struct seq_file *m) seq_puts(m, "# \\ / ||||| \\ | / \n"); } static void print_func_help_header(struct seq_file *m) static void print_event_info(struct trace_array *tr, struct seq_file *m) { unsigned long total; unsigned long entries; get_total_entries(tr, &total, &entries); seq_printf(m, "# entries-in-buffer/entries-written: %lu/%lu #P:%d\n", entries, total, num_online_cpus()); seq_puts(m, "#\n"); } static void print_func_help_header(struct trace_array *tr, struct seq_file *m) { print_event_info(tr, m); seq_puts(m, "# TASK-PID CPU# TIMESTAMP FUNCTION\n"); seq_puts(m, "# | | | | |\n"); } static void print_func_help_header_irq(struct trace_array *tr, struct seq_file *m) { print_event_info(tr, m); seq_puts(m, "# _-----=> irqs-off\n"); seq_puts(m, "# / _----=> need-resched\n"); seq_puts(m, "# | / _---=> hardirq/softirq\n"); seq_puts(m, "# || / _--=> preempt-depth\n"); seq_puts(m, "# ||| / delay\n"); seq_puts(m, "# TASK-PID CPU# |||| TIMESTAMP FUNCTION\n"); seq_puts(m, "# | | | |||| | |\n"); } void print_trace_header(struct seq_file *m, struct trace_iterator *iter) Loading @@ -1869,32 +1921,14 @@ print_trace_header(struct seq_file *m, struct trace_iterator *iter) struct trace_array *tr = iter->tr; struct trace_array_cpu *data = tr->data[tr->cpu]; struct tracer *type = current_trace; unsigned long entries = 0; unsigned long total = 0; unsigned long count; unsigned long entries; unsigned long total; const char *name = "preemption"; int cpu; if (type) name = type->name; for_each_tracing_cpu(cpu) { count = ring_buffer_entries_cpu(tr->buffer, cpu); /* * If this buffer has skipped entries, then we hold all * entries for the trace and we need to ignore the * ones before the time stamp. */ if (tr->data[cpu]->skipped_entries) { count -= tr->data[cpu]->skipped_entries; /* total is the same as the entries */ total += count; } else total += count + ring_buffer_overrun_cpu(tr->buffer, cpu); entries += count; } get_total_entries(tr, &total, &entries); seq_printf(m, "# %s latency trace v1.1.5 on %s\n", name, UTS_RELEASE); Loading Loading @@ -2170,8 +2204,12 @@ void trace_default_header(struct seq_file *m) if (!(trace_flags & TRACE_ITER_VERBOSE)) print_lat_help_header(m); } else { if (!(trace_flags & TRACE_ITER_VERBOSE)) print_func_help_header(m); if (!(trace_flags & TRACE_ITER_VERBOSE)) { if (trace_flags & TRACE_ITER_IRQ_INFO) print_func_help_header_irq(iter->tr, m); else print_func_help_header(iter->tr, m); } } } Loading
kernel/trace/trace.h +1 −0 Original line number Diff line number Diff line Loading @@ -655,6 +655,7 @@ enum trace_iterator_flags { TRACE_ITER_RECORD_CMD = 0x100000, TRACE_ITER_OVERWRITE = 0x200000, TRACE_ITER_STOP_ON_FREE = 0x400000, TRACE_ITER_IRQ_INFO = 0x800000, }; /* Loading
kernel/trace/trace_output.c +14 −2 Original line number Diff line number Diff line Loading @@ -627,11 +627,23 @@ int trace_print_context(struct trace_iterator *iter) unsigned long usec_rem = do_div(t, USEC_PER_SEC); unsigned long secs = (unsigned long)t; char comm[TASK_COMM_LEN]; int ret; trace_find_cmdline(entry->pid, comm); return trace_seq_printf(s, "%16s-%-5d [%03d] %5lu.%06lu: ", comm, entry->pid, iter->cpu, secs, usec_rem); ret = trace_seq_printf(s, "%16s-%-5d [%03d] ", comm, entry->pid, iter->cpu); if (!ret) return 0; if (trace_flags & TRACE_ITER_IRQ_INFO) { ret = trace_print_lat_fmt(s, entry); if (!ret) return 0; } return trace_seq_printf(s, " %5lu.%06lu: ", secs, usec_rem); } int trace_print_lat_context(struct trace_iterator *iter) Loading