2008-05-12 21:20:42 +02:00
# ifndef _LINUX_KERNEL_TRACE_H
# define _LINUX_KERNEL_TRACE_H
# include <linux/fs.h>
# include <asm/atomic.h>
# include <linux/sched.h>
# include <linux/clocksource.h>
/*
* Function trace entry - function address and parent function addres :
*/
struct ftrace_entry {
unsigned long ip ;
unsigned long parent_ip ;
} ;
/*
* Context switch trace entry - which task ( and prio ) we switched from / to :
*/
struct ctx_switch_entry {
unsigned int prev_pid ;
unsigned char prev_prio ;
unsigned char prev_state ;
unsigned int next_pid ;
unsigned char next_prio ;
} ;
2008-05-12 21:20:47 +02:00
/*
* Special ( free - form ) trace entry :
*/
struct special_entry {
unsigned long arg1 ;
unsigned long arg2 ;
unsigned long arg3 ;
} ;
2008-05-12 21:20:42 +02:00
/*
* 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 :
*
* bash - 15816 [ 01 ] 235.197585 : idle_cpu < - irq_enter
*/
struct trace_entry {
char type ;
char cpu ;
char flags ;
char preempt_count ;
int pid ;
cycle_t t ;
union {
struct ftrace_entry fn ;
struct ctx_switch_entry ctx ;
2008-05-12 21:20:47 +02:00
struct special_entry special ;
2008-05-12 21:20:42 +02:00
} ;
} ;
# define TRACE_ENTRY_SIZE sizeof(struct trace_entry)
/*
* The CPU trace array - it consists of thousands of trace entries
* plus some other descriptor data : ( for example which task started
* the trace , etc . )
*/
struct trace_array_cpu {
2008-05-12 21:20:43 +02:00
struct list_head trace_pages ;
2008-05-12 21:20:42 +02:00
atomic_t disabled ;
2008-05-12 21:20:46 +02:00
spinlock_t lock ;
2008-05-12 21:20:46 +02:00
struct lock_class_key lock_key ;
2008-05-12 21:20:45 +02:00
2008-05-12 21:20:45 +02:00
/* these fields get copied into max-trace: */
2008-05-12 21:20:45 +02:00
unsigned trace_head_idx ;
unsigned trace_tail_idx ;
void * trace_head ; /* producer */
void * trace_tail ; /* consumer */
2008-05-12 21:20:45 +02:00
unsigned long trace_idx ;
2008-05-12 21:20:42 +02:00
unsigned long saved_latency ;
unsigned long critical_start ;
unsigned long critical_end ;
unsigned long critical_sequence ;
unsigned long nice ;
unsigned long policy ;
unsigned long rt_priority ;
cycle_t preempt_timestamp ;
pid_t pid ;
uid_t uid ;
char comm [ TASK_COMM_LEN ] ;
} ;
struct trace_iterator ;
/*
* The trace array - an array of per - CPU trace arrays . This is the
* highest level data structure that individual tracers deal with .
* They have on / off state as well :
*/
struct trace_array {
unsigned long entries ;
long ctrl ;
int cpu ;
cycle_t time_start ;
2008-05-12 21:20:46 +02:00
struct task_struct * waiter ;
2008-05-12 21:20:42 +02:00
struct trace_array_cpu * data [ NR_CPUS ] ;
} ;
/*
* A specific tracer , represented by methods that operate on a trace array :
*/
struct tracer {
const char * name ;
void ( * init ) ( struct trace_array * tr ) ;
void ( * reset ) ( struct trace_array * tr ) ;
void ( * open ) ( struct trace_iterator * iter ) ;
void ( * close ) ( struct trace_iterator * iter ) ;
void ( * start ) ( struct trace_iterator * iter ) ;
void ( * stop ) ( struct trace_iterator * iter ) ;
void ( * ctrl_update ) ( struct trace_array * tr ) ;
2008-05-12 21:20:44 +02:00
# ifdef CONFIG_FTRACE_STARTUP_TEST
int ( * selftest ) ( struct tracer * trace ,
struct trace_array * tr ) ;
# endif
2008-05-12 21:20:42 +02:00
struct tracer * next ;
int print_max ;
} ;
2008-05-12 21:20:46 +02:00
struct trace_seq {
unsigned char buffer [ PAGE_SIZE ] ;
unsigned int len ;
} ;
2008-05-12 21:20:42 +02:00
/*
* Trace iterator - used by printout routines who present trace
* results to users and which routines might sleep , etc :
*/
struct trace_iterator {
2008-05-12 21:20:46 +02:00
struct trace_seq seq ;
2008-05-12 21:20:42 +02:00
struct trace_array * tr ;
struct tracer * trace ;
2008-05-12 21:20:45 +02:00
2008-05-12 21:20:42 +02:00
struct trace_entry * ent ;
2008-05-12 21:20:45 +02:00
int cpu ;
struct trace_entry * prev_ent ;
int prev_cpu ;
2008-05-12 21:20:42 +02:00
unsigned long iter_flags ;
loff_t pos ;
unsigned long next_idx [ NR_CPUS ] ;
2008-05-12 21:20:43 +02:00
struct list_head * next_page [ NR_CPUS ] ;
unsigned next_page_idx [ NR_CPUS ] ;
long idx ;
2008-05-12 21:20:42 +02:00
} ;
2008-05-12 21:20:51 +02:00
void tracing_reset ( struct trace_array_cpu * data ) ;
2008-05-12 21:20:42 +02:00
int tracing_open_generic ( struct inode * inode , struct file * filp ) ;
struct dentry * tracing_init_dentry ( void ) ;
void ftrace ( struct trace_array * tr ,
struct trace_array_cpu * data ,
unsigned long ip ,
unsigned long parent_ip ,
unsigned long flags ) ;
void tracing_sched_switch_trace ( struct trace_array * tr ,
struct trace_array_cpu * data ,
struct task_struct * prev ,
struct task_struct * next ,
unsigned long flags ) ;
void tracing_record_cmdline ( struct task_struct * tsk ) ;
2008-05-12 21:20:51 +02:00
void tracing_sched_wakeup_trace ( struct trace_array * tr ,
struct trace_array_cpu * data ,
struct task_struct * wakee ,
struct task_struct * cur ,
unsigned long flags ) ;
2008-05-12 21:20:47 +02:00
void trace_special ( struct trace_array * tr ,
struct trace_array_cpu * data ,
unsigned long arg1 ,
unsigned long arg2 ,
unsigned long arg3 ) ;
2008-05-12 21:20:49 +02:00
void trace_function ( struct trace_array * tr ,
struct trace_array_cpu * data ,
unsigned long ip ,
unsigned long parent_ip ,
unsigned long flags ) ;
2008-05-12 21:20:42 +02:00
void tracing_start_function_trace ( void ) ;
void tracing_stop_function_trace ( void ) ;
int register_tracer ( struct tracer * type ) ;
void unregister_tracer ( struct tracer * type ) ;
extern unsigned long nsecs_to_usecs ( unsigned long nsecs ) ;
extern unsigned long tracing_max_latency ;
extern unsigned long tracing_thresh ;
void update_max_tr ( struct trace_array * tr , struct task_struct * tsk , int cpu ) ;
void update_max_tr_single ( struct trace_array * tr ,
struct task_struct * tsk , int cpu ) ;
2008-05-12 21:20:51 +02:00
extern cycle_t ftrace_now ( int cpu ) ;
2008-05-12 21:20:42 +02:00
# ifdef CONFIG_SCHED_TRACER
2008-05-12 21:20:51 +02:00
extern void
2008-05-12 21:20:42 +02:00
wakeup_sched_switch ( struct task_struct * prev , struct task_struct * next ) ;
2008-05-12 21:20:51 +02:00
extern void
wakeup_sched_wakeup ( struct task_struct * wakee , struct task_struct * curr ) ;
2008-05-12 21:20:42 +02:00
# else
static inline void
wakeup_sched_switch ( struct task_struct * prev , struct task_struct * next )
{
}
2008-05-12 21:20:51 +02:00
static inline void
wakeup_sched_wakeup ( struct task_struct * wakee , struct task_struct * curr )
{
}
2008-05-12 21:20:42 +02:00
# endif
# ifdef CONFIG_CONTEXT_SWITCH_TRACER
typedef void
( * tracer_switch_func_t ) ( void * private ,
struct task_struct * prev ,
struct task_struct * next ) ;
struct tracer_switch_ops {
tracer_switch_func_t func ;
void * private ;
struct tracer_switch_ops * next ;
} ;
extern int register_tracer_switch ( struct tracer_switch_ops * ops ) ;
extern int unregister_tracer_switch ( struct tracer_switch_ops * ops ) ;
# endif /* CONFIG_CONTEXT_SWITCH_TRACER */
# ifdef CONFIG_DYNAMIC_FTRACE
extern unsigned long ftrace_update_tot_cnt ;
# endif
2008-05-12 21:20:44 +02:00
# ifdef CONFIG_FTRACE_STARTUP_TEST
# ifdef CONFIG_FTRACE
extern int trace_selftest_startup_function ( struct tracer * trace ,
struct trace_array * tr ) ;
# endif
# ifdef CONFIG_IRQSOFF_TRACER
extern int trace_selftest_startup_irqsoff ( struct tracer * trace ,
struct trace_array * tr ) ;
# endif
# ifdef CONFIG_PREEMPT_TRACER
extern int trace_selftest_startup_preemptoff ( struct tracer * trace ,
struct trace_array * tr ) ;
# endif
# if defined(CONFIG_IRQSOFF_TRACER) && defined(CONFIG_PREEMPT_TRACER)
extern int trace_selftest_startup_preemptirqsoff ( struct tracer * trace ,
struct trace_array * tr ) ;
# endif
# ifdef CONFIG_SCHED_TRACER
extern int trace_selftest_startup_wakeup ( struct tracer * trace ,
struct trace_array * tr ) ;
# endif
# ifdef CONFIG_CONTEXT_SWITCH_TRACER
extern int trace_selftest_startup_sched_switch ( struct tracer * trace ,
struct trace_array * tr ) ;
# endif
# endif /* CONFIG_FTRACE_STARTUP_TEST */
2008-05-12 21:20:45 +02:00
extern void * head_page ( struct trace_array_cpu * data ) ;
2008-05-12 21:20:42 +02:00
# endif /* _LINUX_KERNEL_TRACE_H */