diff options
Diffstat (limited to 'include/linux/ftrace_event.h')
| -rw-r--r-- | include/linux/ftrace_event.h | 111 | 
1 files changed, 85 insertions, 26 deletions
diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h index 13a54d0bdfa..34e00fb49be 100644 --- a/include/linux/ftrace_event.h +++ b/include/linux/ftrace_event.h @@ -8,6 +8,7 @@  #include <linux/perf_event.h>  struct trace_array; +struct trace_buffer;  struct tracer;  struct dentry; @@ -38,6 +39,12 @@ const char *ftrace_print_symbols_seq_u64(struct trace_seq *p,  const char *ftrace_print_hex_seq(struct trace_seq *p,  				 const unsigned char *buf, int len); +struct trace_iterator; +struct trace_event; + +int ftrace_raw_output_prep(struct trace_iterator *iter, +			   struct trace_event *event); +  /*   * The trace entry - the most basic unit of tracing. This is what   * is printed in the end as a single line in the trace output, such as: @@ -61,6 +68,7 @@ struct trace_entry {  struct trace_iterator {  	struct trace_array	*tr;  	struct tracer		*trace; +	struct trace_buffer	*trace_buffer;  	void			*private;  	int			cpu_file;  	struct mutex		mutex; @@ -95,8 +103,6 @@ enum trace_iter_flags {  }; -struct trace_event; -  typedef enum print_line_t (*trace_print_func)(struct trace_iterator *iter,  				      int flags, struct trace_event *event); @@ -128,6 +134,13 @@ enum print_line_t {  void tracing_generic_entry_update(struct trace_entry *entry,  				  unsigned long flags,  				  int pc); +struct ftrace_event_file; + +struct ring_buffer_event * +trace_event_buffer_lock_reserve(struct ring_buffer **current_buffer, +				struct ftrace_event_file *ftrace_file, +				int type, unsigned long len, +				unsigned long flags, int pc);  struct ring_buffer_event *  trace_current_buffer_lock_reserve(struct ring_buffer **current_buffer,  				  int type, unsigned long len, @@ -182,53 +195,49 @@ extern int ftrace_event_reg(struct ftrace_event_call *event,  			    enum trace_reg type, void *data);  enum { -	TRACE_EVENT_FL_ENABLED_BIT,  	TRACE_EVENT_FL_FILTERED_BIT, -	TRACE_EVENT_FL_RECORDED_CMD_BIT,  	TRACE_EVENT_FL_CAP_ANY_BIT,  	TRACE_EVENT_FL_NO_SET_FILTER_BIT,  	TRACE_EVENT_FL_IGNORE_ENABLE_BIT, +	TRACE_EVENT_FL_WAS_ENABLED_BIT,  }; +/* + * Event flags: + *  FILTERED	  - The event has a filter attached + *  CAP_ANY	  - Any user can enable for perf + *  NO_SET_FILTER - Set when filter has error and is to be ignored + *  IGNORE_ENABLE - For ftrace internal events, do not enable with debugfs file + *  WAS_ENABLED   - Set and stays set when an event was ever enabled + *                    (used for module unloading, if a module event is enabled, + *                     it is best to clear the buffers that used it). + */  enum { -	TRACE_EVENT_FL_ENABLED		= (1 << TRACE_EVENT_FL_ENABLED_BIT),  	TRACE_EVENT_FL_FILTERED		= (1 << TRACE_EVENT_FL_FILTERED_BIT), -	TRACE_EVENT_FL_RECORDED_CMD	= (1 << TRACE_EVENT_FL_RECORDED_CMD_BIT),  	TRACE_EVENT_FL_CAP_ANY		= (1 << TRACE_EVENT_FL_CAP_ANY_BIT),  	TRACE_EVENT_FL_NO_SET_FILTER	= (1 << TRACE_EVENT_FL_NO_SET_FILTER_BIT),  	TRACE_EVENT_FL_IGNORE_ENABLE	= (1 << TRACE_EVENT_FL_IGNORE_ENABLE_BIT), +	TRACE_EVENT_FL_WAS_ENABLED	= (1 << TRACE_EVENT_FL_WAS_ENABLED_BIT),  };  struct ftrace_event_call {  	struct list_head	list;  	struct ftrace_event_class *class;  	char			*name; -	struct dentry		*dir;  	struct trace_event	event;  	const char		*print_fmt;  	struct event_filter	*filter; +	struct list_head	*files;  	void			*mod;  	void			*data; -  	/* -	 * 32 bit flags: -	 *   bit 1:		enabled -	 *   bit 2:		filter_active -	 *   bit 3:		enabled cmd record -	 *   bit 4:		allow trace by non root (cap any) -	 *   bit 5:		failed to apply filter -	 *   bit 6:		ftrace internal event (do not enable) -	 * -	 * Changes to flags must hold the event_mutex. -	 * -	 * Note: Reads of flags do not hold the event_mutex since -	 * they occur in critical sections. But the way flags -	 * is currently used, these changes do no affect the code -	 * except that when a change is made, it may have a slight -	 * delay in propagating the changes to other CPUs due to -	 * caching and such. +	 *   bit 0:		filter_active +	 *   bit 1:		allow trace by non root (cap any) +	 *   bit 2:		failed to apply filter +	 *   bit 3:		ftrace internal event (do not enable) +	 *   bit 4:		Event was enabled by module  	 */ -	unsigned int		flags; +	int			flags; /* static flags of different events */  #ifdef CONFIG_PERF_EVENTS  	int				perf_refcount; @@ -236,6 +245,56 @@ struct ftrace_event_call {  #endif  }; +struct trace_array; +struct ftrace_subsystem_dir; + +enum { +	FTRACE_EVENT_FL_ENABLED_BIT, +	FTRACE_EVENT_FL_RECORDED_CMD_BIT, +	FTRACE_EVENT_FL_SOFT_MODE_BIT, +	FTRACE_EVENT_FL_SOFT_DISABLED_BIT, +}; + +/* + * Ftrace event file flags: + *  ENABLED	  - The event is enabled + *  RECORDED_CMD  - The comms should be recorded at sched_switch + *  SOFT_MODE     - The event is enabled/disabled by SOFT_DISABLED + *  SOFT_DISABLED - When set, do not trace the event (even though its + *                   tracepoint may be enabled) + */ +enum { +	FTRACE_EVENT_FL_ENABLED		= (1 << FTRACE_EVENT_FL_ENABLED_BIT), +	FTRACE_EVENT_FL_RECORDED_CMD	= (1 << FTRACE_EVENT_FL_RECORDED_CMD_BIT), +	FTRACE_EVENT_FL_SOFT_MODE	= (1 << FTRACE_EVENT_FL_SOFT_MODE_BIT), +	FTRACE_EVENT_FL_SOFT_DISABLED	= (1 << FTRACE_EVENT_FL_SOFT_DISABLED_BIT), +}; + +struct ftrace_event_file { +	struct list_head		list; +	struct ftrace_event_call	*event_call; +	struct dentry			*dir; +	struct trace_array		*tr; +	struct ftrace_subsystem_dir	*system; + +	/* +	 * 32 bit flags: +	 *   bit 0:		enabled +	 *   bit 1:		enabled cmd record +	 *   bit 2:		enable/disable with the soft disable bit +	 *   bit 3:		soft disabled +	 * +	 * Note: The bits must be set atomically to prevent races +	 * from other writers. Reads of flags do not need to be in +	 * sync as they occur in critical sections. But the way flags +	 * is currently used, these changes do not affect the code +	 * except that when a change is made, it may have a slight +	 * delay in propagating the changes to other CPUs due to +	 * caching and such. Which is mostly OK ;-) +	 */ +	unsigned long		flags; +}; +  #define __TRACE_EVENT_FLAGS(name, value)				\  	static int __init trace_init_flags_##name(void)			\  	{								\ @@ -274,7 +333,7 @@ extern int trace_define_field(struct ftrace_event_call *call, const char *type,  extern int trace_add_event_call(struct ftrace_event_call *call);  extern void trace_remove_event_call(struct ftrace_event_call *call); -#define is_signed_type(type)	(((type)(-1)) < (type)0) +#define is_signed_type(type)	(((type)(-1)) < (type)1)  int trace_set_clr_event(const char *system, const char *event, int set);  |