ftrace: updates for tip
Subsystems (2)
Steven Rostedt
maintainercover ftrace: updates for tip
This series restructures the output functions of trace.c.
Events are now registered and maintaining an event output is simplified by keeping the output close together.
The following patches are in:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.git
branch: tip/devel
Steven Rostedt (3):
ftrace: remove obsolete print continue functionality
ftrace: set up trace event hash infrastructure
ftrace: change trace.c to use registered events
----
kernel/trace/Makefile | 1 + kernel/trace/trace.c | 738 ++---------------------------- kernel/trace/trace.h | 15 +- kernel/trace/trace_boot.c | 1 + kernel/trace/trace_branch.c | 53 +++ kernel/trace/trace_functions_graph.c | 4 +- kernel/trace/trace_hw_branches.c | 1 + kernel/trace/trace_mmiotrace.c | 4 +- kernel/trace/trace_output.c | 832 ++++++++++++++++++++++++++++++++++ kernel/trace/trace_output.h | 59 +++ kernel/trace/trace_power.c | 1 + 11 files changed, 990 insertions(+), 719 deletions(-)
Steven Rostedt
maintainerPATCH 1/3 ftrace: remove obsolete print continue functionality
From: Steven Rostedt <[email protected]>
Impact: clean up
Now that the ring buffer used by ftrace allows for variable length entries, we do not need the 'cont' feature of the buffer. This code makes other parts of ftrace more complex and by removing this it simplifies the ftrace code.
--- kernel/trace/trace.c | 61 ---------------------------------- kernel/trace/trace.h | 7 ---- kernel/trace/trace_functions_graph.c | 3 -- kernel/trace/trace_mmiotrace.c | 3 -- 4 files changed, 0 insertions(+), 74 deletions(-)
kernel/trace/trace.c +0 -61
@@ -1765,43 +1765,6 @@ static int task_state_char(unsigned long state)return bit <sizeof (state_to_char) -1 ? state_to_char[bit] :'?' ; } -/* -* The message is supposed to contain an ending newline. -* If the printing stops prematurely, try to add a newline of our own. -*/ -void trace_seq_print_cont (struct trace_seq *s,struct trace_iterator *iter) -{ -struct trace_entry *ent; -struct trace_field_cont *cont; -bool ok = true; - - ent =peek_next_entry (iter, iter->cpu,NULL ); -if (!ent || ent->type !=TRACE_CONT ) { -trace_seq_putc (s,'\n' ); -return ; - } - -do { - cont = (struct trace_field_cont *)ent; -if (ok) - ok = (trace_seq_printf (s,"%s" , cont->buf) >0 ); - -ftrace_disable_cpu (); - -if (iter->buffer_iter[iter->cpu]) -ring_buffer_read (iter->buffer_iter[iter->cpu],NULL ); -else -ring_buffer_consume (iter->tr->buffer, iter->cpu,NULL ); - -ftrace_enable_cpu (); - - ent =peek_next_entry (iter, iter->cpu,NULL ); - }while (ent && ent->type ==TRACE_CONT ); - -if (!ok) -trace_seq_putc (s,'\n' ); -} -static void test_cpu_buff_start (struct trace_iterator *iter) {struct trace_seq *s = &iter->seq;
@@ -1834,9 +1797,6 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu)int S ,T ;int i; -if (entry->type ==TRACE_CONT ) -return TRACE_TYPE_HANDLED ; -test_cpu_buff_start (iter); next_entry =find_next_entry (iter,NULL , &next_ts);
@@ -1922,8 +1882,6 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu)seq_print_ip_sym (s, field->ip, sym_flags);trace_seq_printf (s,": %s" , field->buf); -if (entry->flags &TRACE_FLAG_CONT ) -trace_seq_print_cont (s, iter);break ; }case TRACE_BRANCH : {
@@ -1968,9 +1926,6 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter) entry = iter->ent; -if (entry->type ==TRACE_CONT ) -return TRACE_TYPE_HANDLED ; -test_cpu_buff_start (iter); comm =trace_find_cmdline (iter->ent->pid);
@@ -2076,8 +2031,6 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter)seq_print_ip_sym (s, field->ip, sym_flags);trace_seq_printf (s,": %s" , field->buf); -if (entry->flags &TRACE_FLAG_CONT ) -trace_seq_print_cont (s, iter);break ; }case TRACE_GRAPH_RET : {
@@ -2124,9 +2077,6 @@ static enum print_line_t print_raw_fmt(struct trace_iterator *iter) entry = iter->ent; -if (entry->type ==TRACE_CONT ) -return TRACE_TYPE_HANDLED ; - ret =trace_seq_printf (s,"%d %d %llu " , entry->pid, iter->cpu, iter->ts);if (!ret)
@@ -2187,8 +2137,6 @@ static enum print_line_t print_raw_fmt(struct trace_iterator *iter)trace_assign_type (field, entry);trace_seq_printf (s,"# %lx %s" , field->ip, field->buf); -if (entry->flags &TRACE_FLAG_CONT ) -trace_seq_print_cont (s, iter);break ; } }
@@ -2217,9 +2165,6 @@ static enum print_line_t print_hex_fmt(struct trace_iterator *iter) entry = iter->ent; -if (entry->type ==TRACE_CONT ) -return TRACE_TYPE_HANDLED ; -SEQ_PUT_HEX_FIELD_RET (s, entry->pid);SEQ_PUT_HEX_FIELD_RET (s, iter->cpu);SEQ_PUT_HEX_FIELD_RET (s, iter->ts);
@@ -2283,9 +2228,6 @@ static enum print_line_t print_printk_msg_only(struct trace_iterator *iter)if (!ret)return TRACE_TYPE_PARTIAL_LINE ; -if (entry->flags &TRACE_FLAG_CONT ) -trace_seq_print_cont (s, iter); -return TRACE_TYPE_HANDLED ; }
@@ -2296,9 +2238,6 @@ static enum print_line_t print_bin_fmt(struct trace_iterator *iter) entry = iter->ent; -if (entry->type ==TRACE_CONT ) -return TRACE_TYPE_HANDLED ; -SEQ_PUT_FIELD_RET (s, entry->pid);SEQ_PUT_FIELD_RET (s, entry->cpu);SEQ_PUT_FIELD_RET (s, iter->ts);
kernel/trace/trace.h +0 -7
@@ -16,7 +16,6 @@ enum trace_type {TRACE_FN ,TRACE_CTX ,TRACE_WAKE , -TRACE_CONT ,TRACE_STACK ,TRACE_PRINT , TRACE_SPECIAL,
@@ -178,7 +177,6 @@ struct trace_power {* NEED_RESCED - reschedule is requested * HARDIRQ - inside an interrupt handler * SOFTIRQ - inside a softirq handler -* CONT - multiple entries hold the trace item */ enum trace_flag_type {TRACE_FLAG_IRQS_OFF =0x01 ,
@@ -186,7 +184,6 @@ enum trace_flag_type {TRACE_FLAG_NEED_RESCHED =0x04 ,TRACE_FLAG_HARDIRQ =0x08 , TRACE_FLAG_SOFTIRQ = 0x10, - TRACE_FLAG_CONT = 0x20, };#define TRACE_BUF_SIZE 1024
@@ -262,7 +259,6 @@ extern void __ftrace_bad_type(void); do { \ IF_ASSIGN(var, ent, struct ftrace_entry, TRACE_FN); \ IF_ASSIGN(var, ent, struct ctx_switch_entry, 0); \ - IF_ASSIGN(var, ent, struct trace_field_cont, TRACE_CONT); \ IF_ASSIGN(var, ent, struct stack_entry, TRACE_STACK); \ IF_ASSIGN(var, ent, struct userstack_entry, TRACE_USER_STACK);\ IF_ASSIGN(var, ent, struct print_entry, TRACE_PRINT); \
@@ -489,9 +485,6 @@ extern int trace_selftest_startup_branch(struct tracer *trace,extern void *head_page (struct trace_array_cpu *data);extern int trace_seq_printf (struct trace_seq *s,const char *fmt, ...); -extern void trace_seq_print_cont (struct trace_seq *s, -struct trace_iterator *iter); -extern int seq_print_ip_sym (struct trace_seq *s,unsigned long ip,unsigned long sym_flags);
kernel/trace/trace_functions_graph.c +0 -3
@@ -589,9 +589,6 @@ print_graph_comment(struct print_entry *trace, struct trace_seq *s,if (!ret)return TRACE_TYPE_PARTIAL_LINE ; -if (ent->flags &TRACE_FLAG_CONT ) -trace_seq_print_cont (s, iter); - ret =trace_seq_printf (s," */\n" );if (!ret)return TRACE_TYPE_PARTIAL_LINE ;
kernel/trace/trace_mmiotrace.c +0 -3
@@ -262,9 +262,6 @@ static enum print_line_t mmio_print_mark(struct trace_iterator *iter)if (!ret)return TRACE_TYPE_PARTIAL_LINE ; -if (entry->flags &TRACE_FLAG_CONT ) -trace_seq_print_cont (s, iter); -return TRACE_TYPE_HANDLED ; }
Signature · 3 lines
1.5.6.5 --
Steven Rostedt
maintainerPATCH 2/3 ftrace: set up trace event hash infrastructure
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
Impact: introduction of trace event hash
The trace.c file is becoming more difficult to maintain due to the growing number of events. There is several formats that an event may be printed. This patch sets up the infrastructure of an event hash to allow for events to register how they should be printed.
--- kernel/trace/Makefile | 1 + kernel/trace/trace.c | 275 +------------------------- kernel/trace/trace.h | 8 +- kernel/trace/trace_boot.c | 1 + kernel/trace/trace_functions_graph.c | 1 + kernel/trace/trace_hw_branches.c | 1 + kernel/trace/trace_mmiotrace.c | 1 + kernel/trace/trace_output.c | 365 ++++++++++++++++++++++++++++++++++ kernel/trace/trace_output.h | 43 ++++ kernel/trace/trace_power.c | 1 + 10 files changed, 416 insertions(+), 281 deletions(-) create mode 100644 kernel/trace/trace_output.c create mode 100644 kernel/trace/trace_output.h
kernel/trace/Makefile +1 -0
@@ -19,6 +19,7 @@ obj-$(CONFIG_FUNCTION_TRACER) += libftrace.o obj-$(CONFIG_RING_BUFFER) += ring_buffer.o obj-$(CONFIG_TRACING) += trace.o +obj-$(CONFIG_TRACING) += trace_output.o obj-$(CONFIG_CONTEXT_SWITCH_TRACER) += trace_sched_switch.o obj-$(CONFIG_SYSPROF_TRACER) += trace_sysprof.o obj-$(CONFIG_FUNCTION_TRACER) += trace_functions.o
kernel/trace/trace.c +1 -274
293 lines not on this page · raw message
kernel/trace/trace.h +1 -7
@@ -30,7 +30,7 @@ enum trace_type {TRACE_HW_BRANCHES ,TRACE_POWER , - __TRACE_LAST_TYPE + __TRACE_LAST_TYPE, };/*
@@ -484,12 +484,6 @@ extern int trace_selftest_startup_branch(struct tracer *trace,#endif /* CONFIG_FTRACE_STARTUP_TEST */ extern void *head_page (struct trace_array_cpu *data); -extern int trace_seq_printf (struct trace_seq *s,const char *fmt, ...); -extern int -seq_print_ip_sym (struct trace_seq *s,unsigned long ip, -unsigned long sym_flags); -extern ssize_t trace_seq_to_user (struct trace_seq *s,char __user *ubuf, -size_t cnt);extern long ns2usecs (cycle_t nsec);extern int trace_vprintk (unsigned long ip,int depth,const char *fmt,va_list args);
kernel/trace/trace_boot.c +1 -0
@@ -11,6 +11,7 @@#include <linux/kallsyms.h> #include "trace.h" +#include "trace_output.h" static struct trace_array *boot_trace;static bool pre_initcalls_finished;
kernel/trace/trace_functions_graph.c +1 -0
@@ -12,6 +12,7 @@#include <linux/fs.h> #include "trace.h" +#include "trace_output.h" #define TRACE_GRAPH_INDENT 2
kernel/trace/trace_hw_branches.c +1 -0
@@ -14,6 +14,7 @@#include <asm/ds.h> #include "trace.h" +#include "trace_output.h" #define SIZEOF_BTS (1 << 13)
kernel/trace/trace_mmiotrace.c +1 -0
@@ -11,6 +11,7 @@#include <linux/pci.h> #include "trace.h" +#include "trace_output.h" struct header_iter {struct pci_dev *dev;
kernel/trace/trace_output.c new file +365 -0
365 lines not on this page · raw message
kernel/trace/trace_output.h new file +43 -0
43 lines not on this page · raw message
kernel/trace/trace_power.c +1 -0
@@ -16,6 +16,7 @@#include <linux/module.h> #include "trace.h" +#include "trace_output.h" static struct trace_array *power_trace;static int __read_mostly trace_power_enabled;
Signature · 3 lines
1.5.6.5 --
Steven Rostedt
maintainerPATCH 3/3 ftrace: change trace.c to use registered events
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
Impact: rework to use new event register API
Almost every ftrace event has to implement its output display in trace.c through a different function. Some events did not handle all the formats (trace, latency-trace, raw, hex, binary), and this method does not scale well.
This patch converts the format functions to use the event API to find the event and and print its format. Currently, we have a print function for trace, latency_trace, raw, hex and binary. A trace_nop_print is available if the event wants to avoid output on a particular format.
Perhaps other tracers could use this in the future (like mmiotrace and function_graph).
--- kernel/trace/trace.c | 402 ++++--------------------------------- kernel/trace/trace_branch.c | 53 +++++ kernel/trace/trace_output.c | 467 +++++++++++++++++++++++++++++++++++++++++++ kernel/trace/trace_output.h | 16 ++ 4 files changed, 574 insertions(+), 364 deletions(-)
kernel/trace/trace.c +38 -364
@@ -1483,15 +1483,6 @@ lat_print_timestamp(struct trace_seq *s, u64 abs_usecs,trace_seq_puts (s," : " ); } -static const char state_to_char[] =TASK_STATE_TO_CHAR_STR ; - -static int task_state_char (unsigned long state) -{ -int bit = state ?__ffs (state) +1 :0 ; - -return bit <sizeof (state_to_char) -1 ? state_to_char[bit] :'?' ; -} -static void test_cpu_buff_start (struct trace_iterator *iter) {struct trace_seq *s = &iter->seq;
@@ -1515,14 +1506,14 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu)struct trace_seq *s = &iter->seq;unsigned long sym_flags = (trace_flags &TRACE_ITER_SYM_MASK );struct trace_entry *next_entry; +struct trace_event *event;unsigned long verbose = (trace_flags &TRACE_ITER_VERBOSE );struct trace_entry *entry = iter->ent;unsigned long abs_usecs;unsigned long rel_usecs;u64 next_ts;char *comm; -int S ,T ; -int i; +int ret;test_cpu_buff_start (iter);
@@ -1547,94 +1538,16 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu)lat_print_generic (s, entry, cpu);lat_print_timestamp (s, abs_usecs, rel_usecs); } -switch (entry->type) { -case TRACE_FN : { -struct ftrace_entry *field; - -trace_assign_type (field, entry); - -seq_print_ip_sym (s, field->ip, sym_flags); -trace_seq_puts (s," (" ); -seq_print_ip_sym (s, field->parent_ip, sym_flags); -trace_seq_puts (s,")\n" ); -break ; - } -case TRACE_CTX : -case TRACE_WAKE : { -struct ctx_switch_entry *field; - -trace_assign_type (field, entry); - -T =task_state_char (field->next_state); -S =task_state_char (field->prev_state); - comm =trace_find_cmdline (field->next_pid); -trace_seq_printf (s," %5d:%3d:%c %s [%03d] %5d:%3d:%c %s\n" , - field->prev_pid, - field->prev_prio, -S , entry->type ==TRACE_CTX ?"==>" :" +" , - field->next_cpu, - field->next_pid, - field->next_prio, -T , comm); -break ; - } -case TRACE_SPECIAL : { -struct special_entry *field; - -trace_assign_type (field, entry); - -trace_seq_printf (s,"# %ld %ld %ld\n" , - field->arg1, - field->arg2, - field->arg3); -break ; - } -case TRACE_STACK : { -struct stack_entry *field; - -trace_assign_type (field, entry); - -for (i =0 ; i <FTRACE_STACK_ENTRIES ; i++) { -if (i) -trace_seq_puts (s," <= " ); -seq_print_ip_sym (s, field->caller[i], sym_flags); - } -trace_seq_puts (s,"\n" ); -break ; - } -case TRACE_PRINT : { -struct print_entry *field; - -trace_assign_type (field, entry); -seq_print_ip_sym (s, field->ip, sym_flags); -trace_seq_printf (s,": %s" , field->buf); -break ; - } -case TRACE_BRANCH : { -struct trace_branch *field; - -trace_assign_type (field, entry); - -trace_seq_printf (s,"[%s] %s:%s:%d\n" , - field->correct ?" ok " :" MISS " , - field->func, - field->file, - field->line); -break ; + event =ftrace_find_event (entry->type); +if (event && event->latency_trace) { + ret = event->latency_trace (s, entry, sym_flags); +if (ret) +return ret; +return TRACE_TYPE_HANDLED ; } -case TRACE_USER_STACK : { -struct userstack_entry *field; -trace_assign_type (field, entry); - -seq_print_userip_objs (field, s, sym_flags); -trace_seq_putc (s,'\n' ); -break ; - } -default : -trace_seq_printf (s,"Unknown type %d\n" , entry->type); - } +trace_seq_printf (s,"Unknown type %d\n" , entry->type);return TRACE_TYPE_HANDLED ; }
@@ -1643,13 +1556,12 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter)struct trace_seq *s = &iter->seq;unsigned long sym_flags = (trace_flags &TRACE_ITER_SYM_MASK );struct trace_entry *entry; +struct trace_event *event;unsigned long usec_rem;unsigned long long t;unsigned long secs;char *comm;int ret; -int S ,T ; -int i; entry = iter->ent;
@@ -1671,127 +1583,17 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter)if (!ret)return TRACE_TYPE_PARTIAL_LINE ; -switch (entry->type) { -case TRACE_FN : { -struct ftrace_entry *field; - -trace_assign_type (field, entry); - - ret =seq_print_ip_sym (s, field->ip, sym_flags); -if (!ret) -return TRACE_TYPE_PARTIAL_LINE ; -if ((sym_flags &TRACE_ITER_PRINT_PARENT ) && - field->parent_ip) { - ret =trace_seq_printf (s," <-" ); -if (!ret) -return TRACE_TYPE_PARTIAL_LINE ; - ret =seq_print_ip_sym (s, - field->parent_ip, - sym_flags); -if (!ret) -return TRACE_TYPE_PARTIAL_LINE ; - } - ret =trace_seq_printf (s,"\n" ); -if (!ret) -return TRACE_TYPE_PARTIAL_LINE ; -break ; - } -case TRACE_CTX : -case TRACE_WAKE : { -struct ctx_switch_entry *field; - -trace_assign_type (field, entry); - -T =task_state_char (field->next_state); -S =task_state_char (field->prev_state); - ret =trace_seq_printf (s," %5d:%3d:%c %s [%03d] %5d:%3d:%c\n" , - field->prev_pid, - field->prev_prio, -S , - entry->type ==TRACE_CTX ?"==>" :" +" , - field->next_cpu, - field->next_pid, - field->next_prio, -T ); -if (!ret) -return TRACE_TYPE_PARTIAL_LINE ; -break ; - } -case TRACE_SPECIAL : { -struct special_entry *field; - -trace_assign_type (field, entry); - - ret =trace_seq_printf (s,"# %ld %ld %ld\n" , - field->arg1, - field->arg2, - field->arg3); -if (!ret) -return TRACE_TYPE_PARTIAL_LINE ; -break ; - } -case TRACE_STACK : { -struct stack_entry *field; - -trace_assign_type (field, entry); - -for (i =0 ; i <FTRACE_STACK_ENTRIES ; i++) { -if (i) { - ret =trace_seq_puts (s," <= " ); -if (!ret) -return TRACE_TYPE_PARTIAL_LINE ; - } - ret =seq_print_ip_sym (s, field->caller[i], - sym_flags); -if (!ret) -return TRACE_TYPE_PARTIAL_LINE ; - } - ret =trace_seq_puts (s,"\n" ); -if (!ret) -return TRACE_TYPE_PARTIAL_LINE ; -break ; - } -case TRACE_PRINT : { -struct print_entry *field; - -trace_assign_type (field, entry); - -seq_print_ip_sym (s, field->ip, sym_flags); -trace_seq_printf (s,": %s" , field->buf); -break ; - } -case TRACE_GRAPH_RET : { -return print_graph_function (iter); - } -case TRACE_GRAPH_ENT : { -return print_graph_function (iter); - } -case TRACE_BRANCH : { -struct trace_branch *field; - -trace_assign_type (field, entry); - -trace_seq_printf (s,"[%s] %s:%s:%d\n" , - field->correct ?" ok " :" MISS " , - field->func, - field->file, - field->line); -break ; + event =ftrace_find_event (entry->type); +if (event && event->trace) { + ret = event->trace (s, entry, sym_flags); +if (ret) +return ret; +return TRACE_TYPE_HANDLED ; } -case TRACE_USER_STACK : { -struct userstack_entry *field; - -trace_assign_type (field, entry); + ret =trace_seq_printf (s,"Unknown type %d\n" , entry->type); +if (!ret) +return TRACE_TYPE_PARTIAL_LINE ; - ret =seq_print_userip_objs (field, s, sym_flags); -if (!ret) -return TRACE_TYPE_PARTIAL_LINE ; - ret =trace_seq_putc (s,'\n' ); -if (!ret) -return TRACE_TYPE_PARTIAL_LINE ; -break ; - } - }return TRACE_TYPE_HANDLED ; }
@@ -1799,8 +1601,8 @@ static enum print_line_t print_raw_fmt(struct trace_iterator *iter) {struct trace_seq *s = &iter->seq;struct trace_entry *entry; +struct trace_event *event;int ret; -int S ,T ; entry = iter->ent;
@@ -1809,86 +1611,26 @@ static enum print_line_t print_raw_fmt(struct trace_iterator *iter)if (!ret)return TRACE_TYPE_PARTIAL_LINE ; -switch (entry->type) { -case TRACE_FN : { -struct ftrace_entry *field; - -trace_assign_type (field, entry); - - ret =trace_seq_printf (s,"%x %x\n" , - field->ip, - field->parent_ip); -if (!ret) -return TRACE_TYPE_PARTIAL_LINE ; -break ; - } -case TRACE_CTX : -case TRACE_WAKE : { -struct ctx_switch_entry *field; - -trace_assign_type (field, entry); - -T =task_state_char (field->next_state); -S = entry->type ==TRACE_WAKE ?'+' : -task_state_char (field->prev_state); - ret =trace_seq_printf (s,"%d %d %c %d %d %d %c\n" , - field->prev_pid, - field->prev_prio, -S , - field->next_cpu, - field->next_pid, - field->next_prio, -T ); -if (!ret) -return TRACE_TYPE_PARTIAL_LINE ; -break ; - } -case TRACE_SPECIAL : -case TRACE_USER_STACK : -case TRACE_STACK : { -struct special_entry *field; - -trace_assign_type (field, entry); - - ret =trace_seq_printf (s,"# %ld %ld %ld\n" , - field->arg1, - field->arg2, - field->arg3); -if (!ret) -return TRACE_TYPE_PARTIAL_LINE ; -break ; + event =ftrace_find_event (entry->type); +if (event && event->raw) { + ret = event->raw (s, entry,0 ); +if (ret) +return ret; +return TRACE_TYPE_HANDLED ; } -case TRACE_PRINT : { -struct print_entry *field; - -trace_assign_type (field, entry); + ret =trace_seq_printf (s,"%d ?\n" , entry->type); +if (!ret) +return TRACE_TYPE_PARTIAL_LINE ; -trace_seq_printf (s,"# %lx %s" , field->ip, field->buf); -break ; - } - }return TRACE_TYPE_HANDLED ; } -#define SEQ_PUT_FIELD_RET (s, x) \ -do { \ - if (!trace_seq_putmem(s, &(x), sizeof(x))) \ - return 0; \ -} while (0) - -#define SEQ_PUT_HEX_FIELD_RET (s, x) \ -do { \ - BUILD_BUG_ON(sizeof(x) > MAX_MEMHEX_BYTES); \ - if (!trace_seq_putmem_hex(s, &(x), sizeof(x))) \ - return 0; \ -} while (0) -static enum print_line_t print_hex_fmt (struct trace_iterator *iter) {struct trace_seq *s = &iter->seq;unsigned char newline ='\n' ;struct trace_entry *entry; -int S ,T ; +struct trace_event *event; entry = iter->ent;
@@ -1896,47 +1638,10 @@ static enum print_line_t print_hex_fmt(struct trace_iterator *iter)SEQ_PUT_HEX_FIELD_RET (s, iter->cpu);SEQ_PUT_HEX_FIELD_RET (s, iter->ts); -switch (entry->type) { -case TRACE_FN : { -struct ftrace_entry *field; - -trace_assign_type (field, entry); - -SEQ_PUT_HEX_FIELD_RET (s, field->ip); -SEQ_PUT_HEX_FIELD_RET (s, field->parent_ip); -break ; - } -case TRACE_CTX : -case TRACE_WAKE : { -struct ctx_switch_entry *field; - -trace_assign_type (field, entry); - -T =task_state_char (field->next_state); -S = entry->type ==TRACE_WAKE ?'+' : -task_state_char (field->prev_state); -SEQ_PUT_HEX_FIELD_RET (s, field->prev_pid); -SEQ_PUT_HEX_FIELD_RET (s, field->prev_prio); -SEQ_PUT_HEX_FIELD_RET (s,S ); -SEQ_PUT_HEX_FIELD_RET (s, field->next_cpu); -SEQ_PUT_HEX_FIELD_RET (s, field->next_pid); -SEQ_PUT_HEX_FIELD_RET (s, field->next_prio); -SEQ_PUT_HEX_FIELD_RET (s,T ); -break ; - } -case TRACE_SPECIAL : -case TRACE_USER_STACK : -case TRACE_STACK : { -struct special_entry *field; - -trace_assign_type (field, entry); + event =ftrace_find_event (entry->type); +if (event && event->hex) + event->hex (s, entry,0 ); -SEQ_PUT_HEX_FIELD_RET (s, field->arg1); -SEQ_PUT_HEX_FIELD_RET (s, field->arg2); -SEQ_PUT_HEX_FIELD_RET (s, field->arg3); -break ; - } - }SEQ_PUT_FIELD_RET (s, newline);return TRACE_TYPE_HANDLED ;
@@ -1962,6 +1667,7 @@ static enum print_line_t print_bin_fmt(struct trace_iterator *iter) {struct trace_seq *s = &iter->seq;struct trace_entry *entry; +struct trace_event *event; entry = iter->ent;
@@ -1969,43 +1675,11 @@ static enum print_line_t print_bin_fmt(struct trace_iterator *iter)SEQ_PUT_FIELD_RET (s, entry->cpu);SEQ_PUT_FIELD_RET (s, iter->ts); -switch (entry->type) { -case TRACE_FN : { -struct ftrace_entry *field; - -trace_assign_type (field, entry); + event =ftrace_find_event (entry->type); +if (event && event->binary) + event->binary (s, entry,0 ); -SEQ_PUT_FIELD_RET (s, field->ip); -SEQ_PUT_FIELD_RET (s, field->parent_ip); -break ; - } -case TRACE_CTX : { -struct ctx_switch_entry *field; - -trace_assign_type (field, entry); - -SEQ_PUT_FIELD_RET (s, field->prev_pid); -SEQ_PUT_FIELD_RET (s, field->prev_prio); -SEQ_PUT_FIELD_RET (s, field->prev_state); -SEQ_PUT_FIELD_RET (s, field->next_pid); -SEQ_PUT_FIELD_RET (s, field->next_prio); -SEQ_PUT_FIELD_RET (s, field->next_state); -break ; - } -case TRACE_SPECIAL : -case TRACE_USER_STACK : -case TRACE_STACK : { -struct special_entry *field; - -trace_assign_type (field, entry); - -SEQ_PUT_FIELD_RET (s, field->arg1); -SEQ_PUT_FIELD_RET (s, field->arg2); -SEQ_PUT_FIELD_RET (s, field->arg3); -break ; - } - } -return 1 ; +return TRACE_TYPE_HANDLED ; }static int trace_empty (struct trace_iterator *iter)
kernel/trace/trace_branch.c +53 -0
72 lines not on this page · raw message
kernel/trace/trace_output.c +467 -0
476 lines not on this page · raw message
kernel/trace/trace_output.h +16 -0
@@ -36,8 +36,24 @@ struct trace_event *ftrace_find_event(int type);int register_ftrace_event (struct trace_event *event);int unregister_ftrace_event (struct trace_event *event); +int +trace_nop_print (struct trace_seq *s,struct trace_entry *entry,int flags); +#define MAX_MEMHEX_BYTES 8#define HEX_CHARS (MAX_MEMHEX_BYTES*2 + 1) +#define SEQ_PUT_FIELD_RET (s, x) \ +do { \ + if (!trace_seq_putmem(s, &(x), sizeof(x))) \ + return 0; \ +} while (0) + +#define SEQ_PUT_HEX_FIELD_RET (s, x) \ +do { \ + BUILD_BUG_ON(sizeof(x) > MAX_MEMHEX_BYTES); \ + if (!trace_seq_putmem_hex(s, &(x), sizeof(x))) \ + return 0; \ +} while (0) +#endif
Signature · 3 lines
1.5.6.5 --
Quoted 9 lines · Steven Rostedt
This series restructures the output functions of
trace.c.Events are now registered and maintaining an event output is simplified by keeping the output close together.
The following patches are in:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.git
Quoted 8 lines
branch: tip/devel
Steven Rostedt (3):
ftrace: remove obsolete print continue functionality
ftrace: set up trace event hash infrastructure
ftrace: changetrace.cto use registered events
Which does mean that a tracer will now be able to build as a module? That's all good news!
I'm testing a bit these patches...
Quoted 10 lines · Steven Rostedt
This series restructures the output functions of
trace.c.Events are now registered and maintaining an event output is simplified by keeping the output close together.
The following patches are in:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.gitbranch: tip/devel
BTW it seems to be more likely on devel than tip/devel ...
Quoted 9 lines · Steven Rostedt
This series restructures the output functions of
trace.c.Events are now registered and maintaining an event output is simplified by keeping the output close together.
The following patches are in:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.git
Quoted 7 lines
branch: tip/devel
Steven Rostedt (3):
ftrace: remove obsolete print continue functionality
ftrace: set up trace event hash infrastructure
ftrace: changetrace.cto use registered events
pulled, thanks Steve!
Ingo