diff options
| author | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-09-19 13:47:57 +0100 | 
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-09-19 13:47:57 +0100 | 
| commit | 40d743b8c16a8cf6e30c1d941aa6147f9550ea75 (patch) | |
| tree | 9fcdf9a06b18a275253048d1ea7c9803cec38845 /kernel/trace/trace.h | |
| parent | 7da18afa423f167e7ef3c9728e584d8bf05bd55a (diff) | |
| parent | 83e686ea0291ee93b87dcdc00b96443b80de56c9 (diff) | |
Merge branch 'for-rmk' of git://linux-arm.org/linux-2.6
Diffstat (limited to 'kernel/trace/trace.h')
| -rw-r--r-- | kernel/trace/trace.h | 276 | 
1 files changed, 77 insertions, 199 deletions
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index fa1dccb579d..86bcff94791 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -7,6 +7,7 @@  #include <linux/clocksource.h>  #include <linux/ring_buffer.h>  #include <linux/mmiotrace.h> +#include <linux/tracepoint.h>  #include <linux/ftrace.h>  #include <trace/boot.h>  #include <linux/kmemtrace.h> @@ -42,157 +43,54 @@ enum trace_type {  	__TRACE_LAST_TYPE,  }; -/* - * Function trace entry - function address and parent function addres: - */ -struct ftrace_entry { -	struct trace_entry	ent; -	unsigned long		ip; -	unsigned long		parent_ip; -}; - -/* Function call entry */ -struct ftrace_graph_ent_entry { -	struct trace_entry		ent; -	struct ftrace_graph_ent		graph_ent; +enum kmemtrace_type_id { +	KMEMTRACE_TYPE_KMALLOC = 0,	/* kmalloc() or kfree(). */ +	KMEMTRACE_TYPE_CACHE,		/* kmem_cache_*(). */ +	KMEMTRACE_TYPE_PAGES,		/* __get_free_pages() and friends. */  }; -/* Function return entry */ -struct ftrace_graph_ret_entry { -	struct trace_entry		ent; -	struct ftrace_graph_ret		ret; -};  extern struct tracer boot_tracer; -/* - * Context switch trace entry - which task (and prio) we switched from/to: - */ -struct ctx_switch_entry { -	struct trace_entry	ent; -	unsigned int		prev_pid; -	unsigned char		prev_prio; -	unsigned char		prev_state; -	unsigned int		next_pid; -	unsigned char		next_prio; -	unsigned char		next_state; -	unsigned int		next_cpu; -}; - -/* - * Special (free-form) trace entry: - */ -struct special_entry { -	struct trace_entry	ent; -	unsigned long		arg1; -	unsigned long		arg2; -	unsigned long		arg3; -}; - -/* - * Stack-trace entry: - */ - -#define FTRACE_STACK_ENTRIES	8 - -struct stack_entry { -	struct trace_entry	ent; -	unsigned long		caller[FTRACE_STACK_ENTRIES]; -}; - -struct userstack_entry { -	struct trace_entry	ent; -	unsigned long		caller[FTRACE_STACK_ENTRIES]; -}; - -/* - * trace_printk entry: - */ -struct bprint_entry { -	struct trace_entry	ent; -	unsigned long		ip; -	const char		*fmt; -	u32			buf[]; -}; +#undef __field +#define __field(type, item)		type	item; -struct print_entry { -	struct trace_entry	ent; -	unsigned long		ip; -	char			buf[]; -}; +#undef __field_struct +#define __field_struct(type, item)	__field(type, item) -#define TRACE_OLD_SIZE		88 +#undef __field_desc +#define __field_desc(type, container, item) -struct trace_field_cont { -	unsigned char		type; -	/* Temporary till we get rid of this completely */ -	char			buf[TRACE_OLD_SIZE - 1]; -}; +#undef __array +#define __array(type, item, size)	type	item[size]; -struct trace_mmiotrace_rw { -	struct trace_entry	ent; -	struct mmiotrace_rw	rw; -}; +#undef __array_desc +#define __array_desc(type, container, item, size) -struct trace_mmiotrace_map { -	struct trace_entry	ent; -	struct mmiotrace_map	map; -}; +#undef __dynamic_array +#define __dynamic_array(type, item)	type	item[]; -struct trace_boot_call { -	struct trace_entry	ent; -	struct boot_trace_call boot_call; -}; +#undef F_STRUCT +#define F_STRUCT(args...)		args -struct trace_boot_ret { -	struct trace_entry	ent; -	struct boot_trace_ret boot_ret; -}; - -#define TRACE_FUNC_SIZE 30 -#define TRACE_FILE_SIZE 20 -struct trace_branch { -	struct trace_entry	ent; -	unsigned	        line; -	char			func[TRACE_FUNC_SIZE+1]; -	char			file[TRACE_FILE_SIZE+1]; -	char			correct; -}; - -struct hw_branch_entry { -	struct trace_entry	ent; -	u64			from; -	u64			to; -}; - -struct trace_power { -	struct trace_entry	ent; -	struct power_trace	state_data; -}; +#undef FTRACE_ENTRY +#define FTRACE_ENTRY(name, struct_name, id, tstruct, print)	\ +	struct struct_name {					\ +		struct trace_entry	ent;			\ +		tstruct						\ +	} -enum kmemtrace_type_id { -	KMEMTRACE_TYPE_KMALLOC = 0,	/* kmalloc() or kfree(). */ -	KMEMTRACE_TYPE_CACHE,		/* kmem_cache_*(). */ -	KMEMTRACE_TYPE_PAGES,		/* __get_free_pages() and friends. */ -}; +#undef TP_ARGS +#define TP_ARGS(args...)	args -struct kmemtrace_alloc_entry { -	struct trace_entry	ent; -	enum kmemtrace_type_id type_id; -	unsigned long call_site; -	const void *ptr; -	size_t bytes_req; -	size_t bytes_alloc; -	gfp_t gfp_flags; -	int node; -}; +#undef FTRACE_ENTRY_DUP +#define FTRACE_ENTRY_DUP(name, name_struct, id, tstruct, printk) -struct kmemtrace_free_entry { -	struct trace_entry	ent; -	enum kmemtrace_type_id type_id; -	unsigned long call_site; -	const void *ptr; -}; +#include "trace_entries.h" +/* + * syscalls are special, and need special handling, this is why + * they are not included in trace_entries.h + */  struct syscall_trace_enter {  	struct trace_entry	ent;  	int			nr; @@ -205,13 +103,12 @@ struct syscall_trace_exit {  	unsigned long		ret;  }; -  /*   * trace_flag_type is an enumeration that holds different   * states when a trace occurs. These are:   *  IRQS_OFF		- interrupts were disabled   *  IRQS_NOSUPPORT	- arch does not support irqs_disabled_flags - *  NEED_RESCED		- reschedule is requested + *  NEED_RESCHED	- reschedule is requested   *  HARDIRQ		- inside an interrupt handler   *  SOFTIRQ		- inside a softirq handler   */ @@ -390,7 +287,6 @@ struct tracer {  	struct tracer		*next;  	int			print_max;  	struct tracer_flags	*flags; -	struct tracer_stat	*stats;  }; @@ -469,6 +365,7 @@ void tracing_stop_sched_switch_record(void);  void tracing_start_sched_switch_record(void);  int register_tracer(struct tracer *type);  void unregister_tracer(struct tracer *type); +int is_tracing_stopped(void);  extern unsigned long nsecs_to_usecs(unsigned long nsecs); @@ -509,20 +406,6 @@ static inline void __trace_stack(struct trace_array *tr, unsigned long flags,  extern cycle_t ftrace_now(int cpu); -#ifdef CONFIG_CONTEXT_SWITCH_TRACER -typedef void -(*tracer_switch_func_t)(void *private, -			void *__rq, -			struct task_struct *prev, -			struct task_struct *next); - -struct tracer_switch_ops { -	tracer_switch_func_t		func; -	void				*private; -	struct tracer_switch_ops	*next; -}; -#endif /* CONFIG_CONTEXT_SWITCH_TRACER */ -  extern void trace_find_cmdline(int pid, char comm[]);  #ifdef CONFIG_DYNAMIC_FTRACE @@ -638,6 +521,41 @@ static inline int ftrace_trace_task(struct task_struct *task)  #endif  /* + * struct trace_parser - servers for reading the user input separated by spaces + * @cont: set if the input is not complete - no final space char was found + * @buffer: holds the parsed user input + * @idx: user input lenght + * @size: buffer size + */ +struct trace_parser { +	bool		cont; +	char		*buffer; +	unsigned	idx; +	unsigned	size; +}; + +static inline bool trace_parser_loaded(struct trace_parser *parser) +{ +	return (parser->idx != 0); +} + +static inline bool trace_parser_cont(struct trace_parser *parser) +{ +	return parser->cont; +} + +static inline void trace_parser_clear(struct trace_parser *parser) +{ +	parser->cont = false; +	parser->idx = 0; +} + +extern int trace_parser_get_init(struct trace_parser *parser, int size); +extern void trace_parser_put(struct trace_parser *parser); +extern int trace_get_user(struct trace_parser *parser, const char __user *ubuf, +	size_t cnt, loff_t *ppos); + +/*   * trace_iterator_flags is an enumeration that defines bit   * positions into trace_flags that controls the output.   * @@ -823,58 +741,18 @@ filter_check_discard(struct ftrace_event_call *call, void *rec,  	return 0;  } -#define DEFINE_COMPARISON_PRED(type)					\ -static int filter_pred_##type(struct filter_pred *pred, void *event,	\ -			      int val1, int val2)			\ -{									\ -	type *addr = (type *)(event + pred->offset);			\ -	type val = (type)pred->val;					\ -	int match = 0;							\ -									\ -	switch (pred->op) {						\ -	case OP_LT:							\ -		match = (*addr < val);					\ -		break;							\ -	case OP_LE:							\ -		match = (*addr <= val);					\ -		break;							\ -	case OP_GT:							\ -		match = (*addr > val);					\ -		break;							\ -	case OP_GE:							\ -		match = (*addr >= val);					\ -		break;							\ -	default:							\ -		break;							\ -	}								\ -									\ -	return match;							\ -} - -#define DEFINE_EQUALITY_PRED(size)					\ -static int filter_pred_##size(struct filter_pred *pred, void *event,	\ -			      int val1, int val2)			\ -{									\ -	u##size *addr = (u##size *)(event + pred->offset);		\ -	u##size val = (u##size)pred->val;				\ -	int match;							\ -									\ -	match = (val == *addr) ^ pred->not;				\ -									\ -	return match;							\ -} -  extern struct mutex event_mutex;  extern struct list_head ftrace_events;  extern const char *__start___trace_bprintk_fmt[];  extern const char *__stop___trace_bprintk_fmt[]; -#undef TRACE_EVENT_FORMAT -#define TRACE_EVENT_FORMAT(call, proto, args, fmt, tstruct, tpfmt)	\ +#undef FTRACE_ENTRY +#define FTRACE_ENTRY(call, struct_name, id, tstruct, print)		\  	extern struct ftrace_event_call event_##call; -#undef TRACE_EVENT_FORMAT_NOFILTER -#define TRACE_EVENT_FORMAT_NOFILTER(call, proto, args, fmt, tstruct, tpfmt) -#include "trace_event_types.h" +#undef FTRACE_ENTRY_DUP +#define FTRACE_ENTRY_DUP(call, struct_name, id, tstruct, print)		\ +	FTRACE_ENTRY(call, struct_name, id, PARAMS(tstruct), PARAMS(print)) +#include "trace_entries.h"  #endif /* _LINUX_KERNEL_TRACE_H */  | 
