Merge branch 'tip/tracing/ftrace' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace into tracing/ftrace
This commit is contained in:
Коммит
bc722f508a
|
@ -369,8 +369,35 @@ static inline char *pack_hex_byte(char *buf, u8 byte)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* General tracing related utility functions - trace_printk(),
|
* General tracing related utility functions - trace_printk(),
|
||||||
* tracing_start()/tracing_stop:
|
* tracing_on/tracing_off and tracing_start()/tracing_stop
|
||||||
|
*
|
||||||
|
* Use tracing_on/tracing_off when you want to quickly turn on or off
|
||||||
|
* tracing. It simply enables or disables the recording of the trace events.
|
||||||
|
* This also corresponds to the user space debugfs/tracing/tracing_on
|
||||||
|
* file, which gives a means for the kernel and userspace to interact.
|
||||||
|
* Place a tracing_off() in the kernel where you want tracing to end.
|
||||||
|
* From user space, examine the trace, and then echo 1 > tracing_on
|
||||||
|
* to continue tracing.
|
||||||
|
*
|
||||||
|
* tracing_stop/tracing_start has slightly more overhead. It is used
|
||||||
|
* by things like suspend to ram where disabling the recording of the
|
||||||
|
* trace is not enough, but tracing must actually stop because things
|
||||||
|
* like calling smp_processor_id() may crash the system.
|
||||||
|
*
|
||||||
|
* Most likely, you want to use tracing_on/tracing_off.
|
||||||
*/
|
*/
|
||||||
|
#ifdef CONFIG_RING_BUFFER
|
||||||
|
void tracing_on(void);
|
||||||
|
void tracing_off(void);
|
||||||
|
/* trace_off_permanent stops recording with no way to bring it back */
|
||||||
|
void tracing_off_permanent(void);
|
||||||
|
int tracing_is_on(void);
|
||||||
|
#else
|
||||||
|
static inline void tracing_on(void) { }
|
||||||
|
static inline void tracing_off(void) { }
|
||||||
|
static inline void tracing_off_permanent(void) { }
|
||||||
|
static inline int tracing_is_on(void) { return 0; }
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_TRACING
|
#ifdef CONFIG_TRACING
|
||||||
extern void tracing_start(void);
|
extern void tracing_start(void);
|
||||||
extern void tracing_stop(void);
|
extern void tracing_stop(void);
|
||||||
|
|
|
@ -124,21 +124,6 @@ void ring_buffer_normalize_time_stamp(int cpu, u64 *ts);
|
||||||
size_t ring_buffer_page_len(void *page);
|
size_t ring_buffer_page_len(void *page);
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The below functions are fine to use outside the tracing facility.
|
|
||||||
*/
|
|
||||||
#ifdef CONFIG_RING_BUFFER
|
|
||||||
void tracing_on(void);
|
|
||||||
void tracing_off(void);
|
|
||||||
void tracing_off_permanent(void);
|
|
||||||
int tracing_is_on(void);
|
|
||||||
#else
|
|
||||||
static inline void tracing_on(void) { }
|
|
||||||
static inline void tracing_off(void) { }
|
|
||||||
static inline void tracing_off_permanent(void) { }
|
|
||||||
static inline int tracing_is_on(void) { return 0; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void *ring_buffer_alloc_read_page(struct ring_buffer *buffer);
|
void *ring_buffer_alloc_read_page(struct ring_buffer *buffer);
|
||||||
void ring_buffer_free_read_page(struct ring_buffer *buffer, void *data);
|
void ring_buffer_free_read_page(struct ring_buffer *buffer, void *data);
|
||||||
int ring_buffer_read_page(struct ring_buffer *buffer, void **data_page,
|
int ring_buffer_read_page(struct ring_buffer *buffer, void **data_page,
|
||||||
|
|
|
@ -41,5 +41,6 @@ obj-$(CONFIG_WORKQUEUE_TRACER) += trace_workqueue.o
|
||||||
obj-$(CONFIG_BLK_DEV_IO_TRACE) += blktrace.o
|
obj-$(CONFIG_BLK_DEV_IO_TRACE) += blktrace.o
|
||||||
obj-$(CONFIG_EVENT_TRACER) += trace_events.o
|
obj-$(CONFIG_EVENT_TRACER) += trace_events.o
|
||||||
obj-$(CONFIG_EVENT_TRACER) += events.o
|
obj-$(CONFIG_EVENT_TRACER) += events.o
|
||||||
|
obj-$(CONFIG_EVENT_TRACER) += trace_export.o
|
||||||
|
|
||||||
libftrace-y := ftrace.o
|
libftrace-y := ftrace.o
|
||||||
|
|
|
@ -1869,21 +1869,21 @@ ftrace_notrace_release(struct inode *inode, struct file *file)
|
||||||
return ftrace_regex_release(inode, file, 0);
|
return ftrace_regex_release(inode, file, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct file_operations ftrace_avail_fops = {
|
static const struct file_operations ftrace_avail_fops = {
|
||||||
.open = ftrace_avail_open,
|
.open = ftrace_avail_open,
|
||||||
.read = seq_read,
|
.read = seq_read,
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = ftrace_avail_release,
|
.release = ftrace_avail_release,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct file_operations ftrace_failures_fops = {
|
static const struct file_operations ftrace_failures_fops = {
|
||||||
.open = ftrace_failures_open,
|
.open = ftrace_failures_open,
|
||||||
.read = seq_read,
|
.read = seq_read,
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = ftrace_avail_release,
|
.release = ftrace_avail_release,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct file_operations ftrace_filter_fops = {
|
static const struct file_operations ftrace_filter_fops = {
|
||||||
.open = ftrace_filter_open,
|
.open = ftrace_filter_open,
|
||||||
.read = ftrace_regex_read,
|
.read = ftrace_regex_read,
|
||||||
.write = ftrace_filter_write,
|
.write = ftrace_filter_write,
|
||||||
|
@ -1891,7 +1891,7 @@ static struct file_operations ftrace_filter_fops = {
|
||||||
.release = ftrace_filter_release,
|
.release = ftrace_filter_release,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct file_operations ftrace_notrace_fops = {
|
static const struct file_operations ftrace_notrace_fops = {
|
||||||
.open = ftrace_notrace_open,
|
.open = ftrace_notrace_open,
|
||||||
.read = ftrace_regex_read,
|
.read = ftrace_regex_read,
|
||||||
.write = ftrace_notrace_write,
|
.write = ftrace_notrace_write,
|
||||||
|
@ -2423,7 +2423,7 @@ ftrace_pid_write(struct file *filp, const char __user *ubuf,
|
||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct file_operations ftrace_pid_fops = {
|
static const struct file_operations ftrace_pid_fops = {
|
||||||
.read = ftrace_pid_read,
|
.read = ftrace_pid_read,
|
||||||
.write = ftrace_pid_write,
|
.write = ftrace_pid_write,
|
||||||
};
|
};
|
||||||
|
|
|
@ -2606,7 +2606,7 @@ rb_simple_write(struct file *filp, const char __user *ubuf,
|
||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct file_operations rb_simple_fops = {
|
static const struct file_operations rb_simple_fops = {
|
||||||
.open = tracing_open_generic,
|
.open = tracing_open_generic,
|
||||||
.read = rb_simple_read,
|
.read = rb_simple_read,
|
||||||
.write = rb_simple_write,
|
.write = rb_simple_write,
|
||||||
|
|
|
@ -1882,14 +1882,14 @@ static int show_traces_open(struct inode *inode, struct file *file)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct file_operations tracing_fops = {
|
static const struct file_operations tracing_fops = {
|
||||||
.open = tracing_open,
|
.open = tracing_open,
|
||||||
.read = seq_read,
|
.read = seq_read,
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = tracing_release,
|
.release = tracing_release,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct file_operations show_traces_fops = {
|
static const struct file_operations show_traces_fops = {
|
||||||
.open = show_traces_open,
|
.open = show_traces_open,
|
||||||
.read = seq_read,
|
.read = seq_read,
|
||||||
.release = seq_release,
|
.release = seq_release,
|
||||||
|
@ -1982,7 +1982,7 @@ err_unlock:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct file_operations tracing_cpumask_fops = {
|
static const struct file_operations tracing_cpumask_fops = {
|
||||||
.open = tracing_open_generic,
|
.open = tracing_open_generic,
|
||||||
.read = tracing_cpumask_read,
|
.read = tracing_cpumask_read,
|
||||||
.write = tracing_cpumask_write,
|
.write = tracing_cpumask_write,
|
||||||
|
@ -2134,7 +2134,7 @@ tracing_trace_options_write(struct file *filp, const char __user *ubuf,
|
||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct file_operations tracing_iter_fops = {
|
static const struct file_operations tracing_iter_fops = {
|
||||||
.open = tracing_open_generic,
|
.open = tracing_open_generic,
|
||||||
.read = tracing_trace_options_read,
|
.read = tracing_trace_options_read,
|
||||||
.write = tracing_trace_options_write,
|
.write = tracing_trace_options_write,
|
||||||
|
@ -2167,7 +2167,7 @@ tracing_readme_read(struct file *filp, char __user *ubuf,
|
||||||
readme_msg, strlen(readme_msg));
|
readme_msg, strlen(readme_msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct file_operations tracing_readme_fops = {
|
static const struct file_operations tracing_readme_fops = {
|
||||||
.open = tracing_open_generic,
|
.open = tracing_open_generic,
|
||||||
.read = tracing_readme_read,
|
.read = tracing_readme_read,
|
||||||
};
|
};
|
||||||
|
@ -2927,25 +2927,25 @@ tracing_mark_write(struct file *filp, const char __user *ubuf,
|
||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct file_operations tracing_max_lat_fops = {
|
static const struct file_operations tracing_max_lat_fops = {
|
||||||
.open = tracing_open_generic,
|
.open = tracing_open_generic,
|
||||||
.read = tracing_max_lat_read,
|
.read = tracing_max_lat_read,
|
||||||
.write = tracing_max_lat_write,
|
.write = tracing_max_lat_write,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct file_operations tracing_ctrl_fops = {
|
static const struct file_operations tracing_ctrl_fops = {
|
||||||
.open = tracing_open_generic,
|
.open = tracing_open_generic,
|
||||||
.read = tracing_ctrl_read,
|
.read = tracing_ctrl_read,
|
||||||
.write = tracing_ctrl_write,
|
.write = tracing_ctrl_write,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct file_operations set_tracer_fops = {
|
static const struct file_operations set_tracer_fops = {
|
||||||
.open = tracing_open_generic,
|
.open = tracing_open_generic,
|
||||||
.read = tracing_set_trace_read,
|
.read = tracing_set_trace_read,
|
||||||
.write = tracing_set_trace_write,
|
.write = tracing_set_trace_write,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct file_operations tracing_pipe_fops = {
|
static const struct file_operations tracing_pipe_fops = {
|
||||||
.open = tracing_open_pipe,
|
.open = tracing_open_pipe,
|
||||||
.poll = tracing_poll_pipe,
|
.poll = tracing_poll_pipe,
|
||||||
.read = tracing_read_pipe,
|
.read = tracing_read_pipe,
|
||||||
|
@ -2953,13 +2953,13 @@ static struct file_operations tracing_pipe_fops = {
|
||||||
.release = tracing_release_pipe,
|
.release = tracing_release_pipe,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct file_operations tracing_entries_fops = {
|
static const struct file_operations tracing_entries_fops = {
|
||||||
.open = tracing_open_generic,
|
.open = tracing_open_generic,
|
||||||
.read = tracing_entries_read,
|
.read = tracing_entries_read,
|
||||||
.write = tracing_entries_write,
|
.write = tracing_entries_write,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct file_operations tracing_mark_fops = {
|
static const struct file_operations tracing_mark_fops = {
|
||||||
.open = tracing_open_generic,
|
.open = tracing_open_generic,
|
||||||
.write = tracing_mark_write,
|
.write = tracing_mark_write,
|
||||||
};
|
};
|
||||||
|
@ -3240,7 +3240,7 @@ tracing_read_dyn_info(struct file *filp, char __user *ubuf,
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct file_operations tracing_dyn_info_fops = {
|
static const struct file_operations tracing_dyn_info_fops = {
|
||||||
.open = tracing_open_generic,
|
.open = tracing_open_generic,
|
||||||
.read = tracing_read_dyn_info,
|
.read = tracing_read_dyn_info,
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,165 @@
|
||||||
|
#undef TRACE_SYSTEM
|
||||||
|
#define TRACE_SYSTEM ftrace
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We cheat and use the proto type field as the ID
|
||||||
|
* and args as the entry type (minus 'struct')
|
||||||
|
*/
|
||||||
|
TRACE_EVENT_FORMAT(function, TRACE_FN, ftrace_entry, ignore,
|
||||||
|
TRACE_STRUCT(
|
||||||
|
TRACE_FIELD(unsigned long, ip, ip)
|
||||||
|
TRACE_FIELD(unsigned long, parent_ip, parent_ip)
|
||||||
|
),
|
||||||
|
TPRAWFMT(" %lx <-- %lx")
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT_FORMAT(funcgraph_entry, TRACE_GRAPH_ENT,
|
||||||
|
ftrace_graph_ent_entry, ignore,
|
||||||
|
TRACE_STRUCT(
|
||||||
|
TRACE_FIELD(unsigned long, graph_ent.func, func)
|
||||||
|
TRACE_FIELD(int, graph_ent.depth, depth)
|
||||||
|
),
|
||||||
|
TPRAWFMT("--> %lx (%d)")
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT_FORMAT(funcgraph_exit, TRACE_GRAPH_RET,
|
||||||
|
ftrace_graph_ret_entry, ignore,
|
||||||
|
TRACE_STRUCT(
|
||||||
|
TRACE_FIELD(unsigned long, ret.func, func)
|
||||||
|
TRACE_FIELD(int, ret.depth, depth)
|
||||||
|
),
|
||||||
|
TPRAWFMT("<-- %lx (%d)")
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT_FORMAT(wakeup, TRACE_WAKE, ctx_switch_entry, ignore,
|
||||||
|
TRACE_STRUCT(
|
||||||
|
TRACE_FIELD(unsigned int, prev_pid, prev_pid)
|
||||||
|
TRACE_FIELD(unsigned char, prev_prio, prev_prio)
|
||||||
|
TRACE_FIELD(unsigned char, prev_state, prev_state)
|
||||||
|
TRACE_FIELD(unsigned int, next_pid, next_pid)
|
||||||
|
TRACE_FIELD(unsigned char, next_prio, next_prio)
|
||||||
|
TRACE_FIELD(unsigned char, next_state, next_state)
|
||||||
|
TRACE_FIELD(unsigned int, next_cpu, next_cpu)
|
||||||
|
),
|
||||||
|
TPRAWFMT("%u:%u:%u ==+ %u:%u:%u [%03u]")
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT_FORMAT(context_switch, TRACE_CTX, ctx_switch_entry, ignore,
|
||||||
|
TRACE_STRUCT(
|
||||||
|
TRACE_FIELD(unsigned int, prev_pid, prev_pid)
|
||||||
|
TRACE_FIELD(unsigned char, prev_prio, prev_prio)
|
||||||
|
TRACE_FIELD(unsigned char, prev_state, prev_state)
|
||||||
|
TRACE_FIELD(unsigned int, next_pid, next_pid)
|
||||||
|
TRACE_FIELD(unsigned char, next_prio, next_prio)
|
||||||
|
TRACE_FIELD(unsigned char, next_state, next_state)
|
||||||
|
TRACE_FIELD(unsigned int, next_cpu, next_cpu)
|
||||||
|
),
|
||||||
|
TPRAWFMT("%u:%u:%u ==+ %u:%u:%u [%03u]")
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT_FORMAT(special, TRACE_SPECIAL, special_entry, ignore,
|
||||||
|
TRACE_STRUCT(
|
||||||
|
TRACE_FIELD(unsigned long, arg1, arg1)
|
||||||
|
TRACE_FIELD(unsigned long, arg2, arg2)
|
||||||
|
TRACE_FIELD(unsigned long, arg3, arg3)
|
||||||
|
),
|
||||||
|
TPRAWFMT("(%08lx) (%08lx) (%08lx)")
|
||||||
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Stack-trace entry:
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* #define FTRACE_STACK_ENTRIES 8 */
|
||||||
|
|
||||||
|
TRACE_EVENT_FORMAT(kernel_stack, TRACE_STACK, stack_entry, ignore,
|
||||||
|
TRACE_STRUCT(
|
||||||
|
TRACE_FIELD(unsigned long, caller[0], stack0)
|
||||||
|
TRACE_FIELD(unsigned long, caller[1], stack1)
|
||||||
|
TRACE_FIELD(unsigned long, caller[2], stack2)
|
||||||
|
TRACE_FIELD(unsigned long, caller[3], stack3)
|
||||||
|
TRACE_FIELD(unsigned long, caller[4], stack4)
|
||||||
|
TRACE_FIELD(unsigned long, caller[5], stack5)
|
||||||
|
TRACE_FIELD(unsigned long, caller[6], stack6)
|
||||||
|
TRACE_FIELD(unsigned long, caller[7], stack7)
|
||||||
|
),
|
||||||
|
TPRAWFMT("\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n"
|
||||||
|
"\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n")
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT_FORMAT(user_stack, TRACE_USER_STACK, userstack_entry, ignore,
|
||||||
|
TRACE_STRUCT(
|
||||||
|
TRACE_FIELD(unsigned long, caller[0], stack0)
|
||||||
|
TRACE_FIELD(unsigned long, caller[1], stack1)
|
||||||
|
TRACE_FIELD(unsigned long, caller[2], stack2)
|
||||||
|
TRACE_FIELD(unsigned long, caller[3], stack3)
|
||||||
|
TRACE_FIELD(unsigned long, caller[4], stack4)
|
||||||
|
TRACE_FIELD(unsigned long, caller[5], stack5)
|
||||||
|
TRACE_FIELD(unsigned long, caller[6], stack6)
|
||||||
|
TRACE_FIELD(unsigned long, caller[7], stack7)
|
||||||
|
),
|
||||||
|
TPRAWFMT("\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n"
|
||||||
|
"\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n")
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT_FORMAT(print, TRACE_PRINT, print_entry, ignore,
|
||||||
|
TRACE_STRUCT(
|
||||||
|
TRACE_FIELD(unsigned long, ip, ip)
|
||||||
|
TRACE_FIELD(unsigned int, depth, depth)
|
||||||
|
TRACE_FIELD_ZERO_CHAR(buf)
|
||||||
|
),
|
||||||
|
TPRAWFMT("%08lx (%d) %s")
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT_FORMAT(branch, TRACE_BRANCH, trace_branch, ignore,
|
||||||
|
TRACE_STRUCT(
|
||||||
|
TRACE_FIELD(unsigned int, line, line)
|
||||||
|
TRACE_FIELD_SPECIAL(char func[TRACE_FUNC_SIZE+1], func, func)
|
||||||
|
TRACE_FIELD_SPECIAL(char file[TRACE_FUNC_SIZE+1], file, file)
|
||||||
|
TRACE_FIELD(char, correct, correct)
|
||||||
|
),
|
||||||
|
TPRAWFMT("%u:%s:%s (%u)")
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT_FORMAT(hw_branch, TRACE_HW_BRANCHES, hw_branch_entry, ignore,
|
||||||
|
TRACE_STRUCT(
|
||||||
|
TRACE_FIELD(u64, from, from)
|
||||||
|
TRACE_FIELD(u64, to, to)
|
||||||
|
),
|
||||||
|
TPRAWFMT("from: %llx to: %llx")
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT_FORMAT(power, TRACE_POWER, trace_power, ignore,
|
||||||
|
TRACE_STRUCT(
|
||||||
|
TRACE_FIELD(ktime_t, state_data.stamp, stamp)
|
||||||
|
TRACE_FIELD(ktime_t, state_data.end, end)
|
||||||
|
TRACE_FIELD(int, state_data.type, type)
|
||||||
|
TRACE_FIELD(int, state_data.state, state)
|
||||||
|
),
|
||||||
|
TPRAWFMT("%llx->%llx type:%u state:%u")
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT_FORMAT(kmem_alloc, TRACE_KMEM_ALLOC, kmemtrace_alloc_entry, ignore,
|
||||||
|
TRACE_STRUCT(
|
||||||
|
TRACE_FIELD(enum kmemtrace_type_id, type_id, type_id)
|
||||||
|
TRACE_FIELD(unsigned long, call_site, call_site)
|
||||||
|
TRACE_FIELD(const void *, ptr, ptr)
|
||||||
|
TRACE_FIELD(size_t, bytes_req, bytes_req)
|
||||||
|
TRACE_FIELD(size_t, bytes_alloc, bytes_alloc)
|
||||||
|
TRACE_FIELD(gfp_t, gfp_flags, gfp_flags)
|
||||||
|
TRACE_FIELD(int, node, node)
|
||||||
|
),
|
||||||
|
TPRAWFMT("type:%u call_site:%lx ptr:%p req:%lu alloc:%lu"
|
||||||
|
" flags:%x node:%d")
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT_FORMAT(kmem_free, TRACE_KMEM_FREE, kmemtrace_free_entry, ignore,
|
||||||
|
TRACE_STRUCT(
|
||||||
|
TRACE_FIELD(enum kmemtrace_type_id, type_id, type_id)
|
||||||
|
TRACE_FIELD(unsigned long, call_site, call_site)
|
||||||
|
TRACE_FIELD(const void *, ptr, ptr)
|
||||||
|
),
|
||||||
|
TPRAWFMT("type:%u call_site:%lx ptr:%p")
|
||||||
|
);
|
||||||
|
|
||||||
|
#undef TRACE_SYSTEM
|
|
@ -656,11 +656,13 @@ event_create_dir(struct ftrace_event_call *call, struct dentry *d_events)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (call->regfunc) {
|
||||||
entry = debugfs_create_file("enable", 0644, call->dir, call,
|
entry = debugfs_create_file("enable", 0644, call->dir, call,
|
||||||
&ftrace_enable_fops);
|
&ftrace_enable_fops);
|
||||||
if (!entry)
|
if (!entry)
|
||||||
pr_warning("Could not create debugfs "
|
pr_warning("Could not create debugfs "
|
||||||
"'%s/enable' entry\n", call->name);
|
"'%s/enable' entry\n", call->name);
|
||||||
|
}
|
||||||
|
|
||||||
/* Only let type be writable, if we can change it */
|
/* Only let type be writable, if we can change it */
|
||||||
entry = debugfs_create_file("type",
|
entry = debugfs_create_file("type",
|
||||||
|
|
|
@ -75,56 +75,5 @@ ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \
|
||||||
|
|
||||||
#include <trace/trace_event_types.h>
|
#include <trace/trace_event_types.h>
|
||||||
|
|
||||||
/*
|
#include "trace_format.h"
|
||||||
* Setup the showing format of trace point.
|
|
||||||
*
|
|
||||||
* int
|
|
||||||
* ftrace_format_##call(struct trace_seq *s)
|
|
||||||
* {
|
|
||||||
* struct ftrace_raw_##call field;
|
|
||||||
* int ret;
|
|
||||||
*
|
|
||||||
* ret = trace_seq_printf(s, #type " " #item ";"
|
|
||||||
* " size:%d; offset:%d;\n",
|
|
||||||
* sizeof(field.type),
|
|
||||||
* offsetof(struct ftrace_raw_##call,
|
|
||||||
* item));
|
|
||||||
*
|
|
||||||
* }
|
|
||||||
*/
|
|
||||||
|
|
||||||
#undef TRACE_FIELD
|
|
||||||
#define TRACE_FIELD(type, item, assign) \
|
|
||||||
ret = trace_seq_printf(s, "\tfield:" #type " " #item ";\t" \
|
|
||||||
"offset:%lu;\tsize:%lu;\n", \
|
|
||||||
offsetof(typeof(field), item), \
|
|
||||||
sizeof(field.item)); \
|
|
||||||
if (!ret) \
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
|
|
||||||
#undef TRACE_FIELD_SPECIAL
|
|
||||||
#define TRACE_FIELD_SPECIAL(type_item, item, cmd) \
|
|
||||||
ret = trace_seq_printf(s, "\tfield special:" #type_item ";\t" \
|
|
||||||
"offset:%lu;\tsize:%lu;\n", \
|
|
||||||
offsetof(typeof(field), item), \
|
|
||||||
sizeof(field.item)); \
|
|
||||||
if (!ret) \
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
#undef TRACE_EVENT_FORMAT
|
|
||||||
#define TRACE_EVENT_FORMAT(call, proto, args, fmt, tstruct, tpfmt) \
|
|
||||||
int \
|
|
||||||
ftrace_format_##call(struct trace_seq *s) \
|
|
||||||
{ \
|
|
||||||
struct ftrace_raw_##call field; \
|
|
||||||
int ret; \
|
|
||||||
\
|
|
||||||
tstruct; \
|
|
||||||
\
|
|
||||||
trace_seq_printf(s, "\nprint fmt: \"%s\"\n", tpfmt); \
|
|
||||||
\
|
|
||||||
return ret; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#include <trace/trace_event_types.h>
|
#include <trace/trace_event_types.h>
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* trace_export.c - export basic ftrace utilities to user space
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Steven Rostedt <srostedt@redhat.com>
|
||||||
|
*/
|
||||||
|
#include <linux/stringify.h>
|
||||||
|
#include <linux/kallsyms.h>
|
||||||
|
#include <linux/seq_file.h>
|
||||||
|
#include <linux/debugfs.h>
|
||||||
|
#include <linux/uaccess.h>
|
||||||
|
#include <linux/ftrace.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/fs.h>
|
||||||
|
|
||||||
|
#include "trace_output.h"
|
||||||
|
|
||||||
|
#include "trace_format.h"
|
||||||
|
|
||||||
|
#undef TRACE_FIELD_ZERO_CHAR
|
||||||
|
#define TRACE_FIELD_ZERO_CHAR(item) \
|
||||||
|
ret = trace_seq_printf(s, "\tfield: char " #item ";\t" \
|
||||||
|
"offset:%lu;\tsize:0;\n", \
|
||||||
|
offsetof(typeof(field), item)); \
|
||||||
|
if (!ret) \
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
|
||||||
|
#undef TPRAWFMT
|
||||||
|
#define TPRAWFMT(args...) args
|
||||||
|
|
||||||
|
#undef TRACE_EVENT_FORMAT
|
||||||
|
#define TRACE_EVENT_FORMAT(call, proto, args, fmt, tstruct, tpfmt) \
|
||||||
|
static int \
|
||||||
|
ftrace_format_##call(struct trace_seq *s) \
|
||||||
|
{ \
|
||||||
|
struct args field; \
|
||||||
|
int ret; \
|
||||||
|
\
|
||||||
|
tstruct; \
|
||||||
|
\
|
||||||
|
trace_seq_printf(s, "\nprint fmt: \"%s\"\n", tpfmt); \
|
||||||
|
\
|
||||||
|
return ret; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "trace_event_types.h"
|
||||||
|
|
||||||
|
#undef TRACE_ZERO_CHAR
|
||||||
|
#define TRACE_ZERO_CHAR(arg)
|
||||||
|
|
||||||
|
#undef TRACE_FIELD
|
||||||
|
#define TRACE_FIELD(type, item, assign)\
|
||||||
|
entry->item = assign;
|
||||||
|
|
||||||
|
#undef TRACE_FIELD
|
||||||
|
#define TRACE_FIELD(type, item, assign)\
|
||||||
|
entry->item = assign;
|
||||||
|
|
||||||
|
#undef TPCMD
|
||||||
|
#define TPCMD(cmd...) cmd
|
||||||
|
|
||||||
|
#undef TRACE_ENTRY
|
||||||
|
#define TRACE_ENTRY entry
|
||||||
|
|
||||||
|
#undef TRACE_FIELD_SPECIAL
|
||||||
|
#define TRACE_FIELD_SPECIAL(type_item, item, cmd) \
|
||||||
|
cmd;
|
||||||
|
|
||||||
|
#undef TRACE_EVENT_FORMAT
|
||||||
|
#define TRACE_EVENT_FORMAT(call, proto, args, fmt, tstruct, tpfmt) \
|
||||||
|
\
|
||||||
|
static struct ftrace_event_call __used \
|
||||||
|
__attribute__((__aligned__(4))) \
|
||||||
|
__attribute__((section("_ftrace_events"))) event_##call = { \
|
||||||
|
.name = #call, \
|
||||||
|
.id = proto, \
|
||||||
|
.system = __stringify(TRACE_SYSTEM), \
|
||||||
|
.show_format = ftrace_format_##call, \
|
||||||
|
}
|
||||||
|
#include "trace_event_types.h"
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* Setup the showing format of trace point.
|
||||||
|
*
|
||||||
|
* int
|
||||||
|
* ftrace_format_##call(struct trace_seq *s)
|
||||||
|
* {
|
||||||
|
* struct ftrace_raw_##call field;
|
||||||
|
* int ret;
|
||||||
|
*
|
||||||
|
* ret = trace_seq_printf(s, #type " " #item ";"
|
||||||
|
* " size:%d; offset:%d;\n",
|
||||||
|
* sizeof(field.type),
|
||||||
|
* offsetof(struct ftrace_raw_##call,
|
||||||
|
* item));
|
||||||
|
*
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef TRACE_STRUCT
|
||||||
|
#define TRACE_STRUCT(args...) args
|
||||||
|
|
||||||
|
#undef TRACE_FIELD
|
||||||
|
#define TRACE_FIELD(type, item, assign) \
|
||||||
|
ret = trace_seq_printf(s, "\tfield:" #type " " #item ";\t" \
|
||||||
|
"offset:%lu;\tsize:%lu;\n", \
|
||||||
|
offsetof(typeof(field), item), \
|
||||||
|
sizeof(field.item)); \
|
||||||
|
if (!ret) \
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
|
||||||
|
#undef TRACE_FIELD_SPECIAL
|
||||||
|
#define TRACE_FIELD_SPECIAL(type_item, item, cmd) \
|
||||||
|
ret = trace_seq_printf(s, "\tfield special:" #type_item ";\t" \
|
||||||
|
"offset:%lu;\tsize:%lu;\n", \
|
||||||
|
offsetof(typeof(field), item), \
|
||||||
|
sizeof(field.item)); \
|
||||||
|
if (!ret) \
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
#undef TRACE_EVENT_FORMAT
|
||||||
|
#define TRACE_EVENT_FORMAT(call, proto, args, fmt, tstruct, tpfmt) \
|
||||||
|
static int \
|
||||||
|
ftrace_format_##call(struct trace_seq *s) \
|
||||||
|
{ \
|
||||||
|
struct ftrace_raw_##call field; \
|
||||||
|
int ret; \
|
||||||
|
\
|
||||||
|
tstruct; \
|
||||||
|
\
|
||||||
|
trace_seq_printf(s, "\nprint fmt: \"%s\"\n", tpfmt); \
|
||||||
|
\
|
||||||
|
return ret; \
|
||||||
|
}
|
||||||
|
|
|
@ -314,7 +314,7 @@ sysprof_sample_write(struct file *filp, const char __user *ubuf,
|
||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct file_operations sysprof_sample_fops = {
|
static const struct file_operations sysprof_sample_fops = {
|
||||||
.read = sysprof_sample_read,
|
.read = sysprof_sample_read,
|
||||||
.write = sysprof_sample_write,
|
.write = sysprof_sample_write,
|
||||||
};
|
};
|
||||||
|
|
Загрузка…
Ссылка в новой задаче