Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
ftrace_event.h
Go to the documentation of this file.
1
#ifndef _LINUX_FTRACE_EVENT_H
2
#define _LINUX_FTRACE_EVENT_H
3
4
#include <
linux/ring_buffer.h
>
5
#include <
linux/trace_seq.h
>
6
#include <
linux/percpu.h
>
7
#include <
linux/hardirq.h
>
8
#include <linux/perf_event.h>
9
10
struct
trace_array
;
11
struct
tracer
;
12
struct
dentry
;
13
14
struct
trace_print_flags
{
15
unsigned
long
mask
;
16
const
char
*
name
;
17
};
18
19
struct
trace_print_flags_u64
{
20
unsigned
long
long
mask
;
21
const
char
*
name
;
22
};
23
24
const
char
*
ftrace_print_flags_seq
(
struct
trace_seq
*
p
,
const
char
*delim,
25
unsigned
long
flags
,
26
const
struct
trace_print_flags
*flag_array);
27
28
const
char
*
ftrace_print_symbols_seq
(
struct
trace_seq
*
p
,
unsigned
long
val
,
29
const
struct
trace_print_flags
*symbol_array);
30
31
#if BITS_PER_LONG == 32
32
const
char
*ftrace_print_symbols_seq_u64(
struct
trace_seq
*
p
,
33
unsigned
long
long
val
,
34
const
struct
trace_print_flags_u64
35
*symbol_array);
36
#endif
37
38
const
char
*
ftrace_print_hex_seq
(
struct
trace_seq
*
p
,
39
const
unsigned
char
*
buf
,
int
len);
40
41
/*
42
* The trace entry - the most basic unit of tracing. This is what
43
* is printed in the end as a single line in the trace output, such as:
44
*
45
* bash-15816 [01] 235.197585: idle_cpu <- irq_enter
46
*/
47
struct
trace_entry
{
48
unsigned
short
type
;
49
unsigned
char
flags
;
50
unsigned
char
preempt_count
;
51
int
pid
;
52
int
padding
;
53
};
54
55
#define FTRACE_MAX_EVENT \
56
((1 << (sizeof(((struct trace_entry *)0)->type) * 8)) - 1)
57
58
/*
59
* Trace iterator - used by printout routines who present trace
60
* results to users and which routines might sleep, etc:
61
*/
62
struct
trace_iterator
{
63
struct
trace_array
*
tr
;
64
struct
tracer
*
trace
;
65
void
*
private
;
66
int
cpu_file
;
67
struct
mutex
mutex
;
68
struct
ring_buffer_iter
**
buffer_iter
;
69
unsigned
long
iter_flags
;
70
71
/* trace_seq for __print_flags() and __print_symbolic() etc. */
72
struct
trace_seq
tmp_seq
;
73
74
/* The below is zeroed out in pipe_read */
75
struct
trace_seq
seq
;
76
struct
trace_entry
*
ent
;
77
unsigned
long
lost_events
;
78
int
leftover
;
79
int
ent_size
;
80
int
cpu
;
81
u64
ts
;
82
83
loff_t
pos
;
84
long
idx
;
85
86
cpumask_var_t
started
;
87
};
88
89
90
struct
trace_event
;
91
92
typedef
enum
print_line_t
(*
trace_print_func
)(
struct
trace_iterator
*iter,
93
int
flags
,
struct
trace_event
*
event
);
94
95
struct
trace_event_functions
{
96
trace_print_func
trace
;
97
trace_print_func
raw
;
98
trace_print_func
hex
;
99
trace_print_func
binary
;
100
};
101
102
struct
trace_event
{
103
struct
hlist_node
node
;
104
struct
list_head
list
;
105
int
type
;
106
struct
trace_event_functions
*
funcs
;
107
};
108
109
extern
int
register_ftrace_event
(
struct
trace_event
*
event
);
110
extern
int
unregister_ftrace_event
(
struct
trace_event
*
event
);
111
112
/* Return values for print_line callback */
113
enum
print_line_t
{
114
TRACE_TYPE_PARTIAL_LINE
= 0,
/* Retry after flushing the seq */
115
TRACE_TYPE_HANDLED
= 1,
116
TRACE_TYPE_UNHANDLED
= 2,
/* Relay to other output functions */
117
TRACE_TYPE_NO_CONSUME
= 3
/* Handled but ask to not consume */
118
};
119
120
void
tracing_generic_entry_update
(
struct
trace_entry
*
entry
,
121
unsigned
long
flags
,
122
int
pc
);
123
struct
ring_buffer_event
*
124
trace_current_buffer_lock_reserve
(
struct
ring_buffer
**current_buffer,
125
int
type
,
unsigned
long
len,
126
unsigned
long
flags
,
int
pc
);
127
void
trace_current_buffer_unlock_commit
(
struct
ring_buffer
*
buffer
,
128
struct
ring_buffer_event
*
event
,
129
unsigned
long
flags
,
int
pc
);
130
void
trace_nowake_buffer_unlock_commit
(
struct
ring_buffer
*
buffer
,
131
struct
ring_buffer_event
*
event
,
132
unsigned
long
flags
,
int
pc
);
133
void
trace_nowake_buffer_unlock_commit_regs
(
struct
ring_buffer
*
buffer
,
134
struct
ring_buffer_event
*
event
,
135
unsigned
long
flags
,
int
pc
,
136
struct
pt_regs
*
regs
);
137
void
trace_current_buffer_discard_commit
(
struct
ring_buffer
*
buffer
,
138
struct
ring_buffer_event
*
event
);
139
140
void
tracing_record_cmdline
(
struct
task_struct
*tsk);
141
142
struct
event_filter
;
143
144
enum
trace_reg
{
145
TRACE_REG_REGISTER
,
146
TRACE_REG_UNREGISTER
,
147
#ifdef CONFIG_PERF_EVENTS
148
TRACE_REG_PERF_REGISTER,
149
TRACE_REG_PERF_UNREGISTER,
150
TRACE_REG_PERF_OPEN,
151
TRACE_REG_PERF_CLOSE,
152
TRACE_REG_PERF_ADD,
153
TRACE_REG_PERF_DEL,
154
#endif
155
};
156
157
struct
ftrace_event_call
;
158
159
struct
ftrace_event_class
{
160
char
*
system
;
161
void
*
probe
;
162
#ifdef CONFIG_PERF_EVENTS
163
void
*perf_probe;
164
#endif
165
int
(*
reg
)(
struct
ftrace_event_call
*
event
,
166
enum
trace_reg
type
,
void
*
data
);
167
int
(*
define_fields
)(
struct
ftrace_event_call
*);
168
struct
list_head
*(*get_fields)(
struct
ftrace_event_call
*);
169
struct
list_head
fields
;
170
int
(*
raw_init
)(
struct
ftrace_event_call
*);
171
};
172
173
extern
int
ftrace_event_reg
(
struct
ftrace_event_call
*
event
,
174
enum
trace_reg
type
,
void
*
data
);
175
176
enum
{
177
TRACE_EVENT_FL_ENABLED_BIT
,
178
TRACE_EVENT_FL_FILTERED_BIT
,
179
TRACE_EVENT_FL_RECORDED_CMD_BIT
,
180
TRACE_EVENT_FL_CAP_ANY_BIT
,
181
TRACE_EVENT_FL_NO_SET_FILTER_BIT
,
182
TRACE_EVENT_FL_IGNORE_ENABLE_BIT
,
183
};
184
185
enum
{
186
TRACE_EVENT_FL_ENABLED
= (1 <<
TRACE_EVENT_FL_ENABLED_BIT
),
187
TRACE_EVENT_FL_FILTERED
= (1 <<
TRACE_EVENT_FL_FILTERED_BIT
),
188
TRACE_EVENT_FL_RECORDED_CMD
= (1 <<
TRACE_EVENT_FL_RECORDED_CMD_BIT
),
189
TRACE_EVENT_FL_CAP_ANY
= (1 <<
TRACE_EVENT_FL_CAP_ANY_BIT
),
190
TRACE_EVENT_FL_NO_SET_FILTER
= (1 <<
TRACE_EVENT_FL_NO_SET_FILTER_BIT
),
191
TRACE_EVENT_FL_IGNORE_ENABLE
= (1 <<
TRACE_EVENT_FL_IGNORE_ENABLE_BIT
),
192
};
193
194
struct
ftrace_event_call
{
195
struct
list_head
list
;
196
struct
ftrace_event_class
*
class
;
197
char
*
name
;
198
struct
dentry
*
dir
;
199
struct
trace_event
event
;
200
const
char
*
print_fmt
;
201
struct
event_filter
*
filter
;
202
void
*
mod
;
203
void
*
data
;
204
205
/*
206
* 32 bit flags:
207
* bit 1: enabled
208
* bit 2: filter_active
209
* bit 3: enabled cmd record
210
* bit 4: allow trace by non root (cap any)
211
* bit 5: failed to apply filter
212
* bit 6: ftrace internal event (do not enable)
213
*
214
* Changes to flags must hold the event_mutex.
215
*
216
* Note: Reads of flags do not hold the event_mutex since
217
* they occur in critical sections. But the way flags
218
* is currently used, these changes do no affect the code
219
* except that when a change is made, it may have a slight
220
* delay in propagating the changes to other CPUs due to
221
* caching and such.
222
*/
223
unsigned
int
flags
;
224
225
#ifdef CONFIG_PERF_EVENTS
226
int
perf_refcount;
227
struct
hlist_head
__percpu
*perf_events;
228
#endif
229
};
230
231
#define __TRACE_EVENT_FLAGS(name, value) \
232
static int __init trace_init_flags_##name(void) \
233
{ \
234
event_##name.flags = value; \
235
return 0; \
236
} \
237
early_initcall(trace_init_flags_##name);
238
239
#define PERF_MAX_TRACE_SIZE 2048
240
241
#define MAX_FILTER_STR_VAL 256
/* Should handle KSYM_SYMBOL_LEN */
242
243
extern
void
destroy_preds
(
struct
ftrace_event_call
*call);
244
extern
int
filter_match_preds
(
struct
event_filter
*
filter
,
void
*rec);
245
extern
int
filter_current_check_discard
(
struct
ring_buffer
*
buffer
,
246
struct
ftrace_event_call
*call,
247
void
*rec,
248
struct
ring_buffer_event
*
event
);
249
250
enum
{
251
FILTER_OTHER
= 0,
252
FILTER_STATIC_STRING
,
253
FILTER_DYN_STRING
,
254
FILTER_PTR_STRING
,
255
FILTER_TRACE_FN
,
256
};
257
258
#define EVENT_STORAGE_SIZE 128
259
extern
struct
mutex
event_storage_mutex
;
260
extern
char
event_storage
[
EVENT_STORAGE_SIZE
];
261
262
extern
int
trace_event_raw_init
(
struct
ftrace_event_call
*call);
263
extern
int
trace_define_field
(
struct
ftrace_event_call
*call,
const
char
*
type
,
264
const
char
*
name
,
int
offset
,
int
size
,
265
int
is_signed
,
int
filter_type
);
266
extern
int
trace_add_event_call
(
struct
ftrace_event_call
*call);
267
extern
void
trace_remove_event_call
(
struct
ftrace_event_call
*call);
268
269
#define is_signed_type(type) (((type)(-1)) < 0)
270
271
int
trace_set_clr_event
(
const
char
*
system
,
const
char
*
event
,
int
set
);
272
273
/*
274
* The double __builtin_constant_p is because gcc will give us an error
275
* if we try to allocate the static variable to fmt if it is not a
276
* constant. Even with the outer if statement optimizing out.
277
*/
278
#define event_trace_printk(ip, fmt, args...) \
279
do { \
280
__trace_printk_check_format(fmt, ##args); \
281
tracing_record_cmdline(current); \
282
if (__builtin_constant_p(fmt)) { \
283
static const char *trace_printk_fmt \
284
__attribute__((section("__trace_printk_fmt"))) = \
285
__builtin_constant_p(fmt) ? fmt : NULL; \
286
\
287
__trace_bprintk(ip, trace_printk_fmt, ##args); \
288
} else \
289
__trace_printk(ip, fmt, ##args); \
290
} while (0)
291
292
#ifdef CONFIG_PERF_EVENTS
293
struct
perf_event
;
294
295
DECLARE_PER_CPU
(
struct
pt_regs
, perf_trace_regs);
296
297
extern
int
perf_trace_init
(
struct
perf_event
*
event
);
298
extern
void
perf_trace_destroy
(
struct
perf_event
*
event
);
299
extern
int
perf_trace_add
(
struct
perf_event
*
event
,
int
flags
);
300
extern
void
perf_trace_del
(
struct
perf_event
*
event
,
int
flags
);
301
extern
int
ftrace_profile_set_filter(
struct
perf_event
*
event
,
int
event_id
,
302
char
*filter_str);
303
extern
void
ftrace_profile_free_filter(
struct
perf_event
*
event
);
304
extern
void
*
perf_trace_buf_prepare
(
int
size
,
unsigned
short
type
,
305
struct
pt_regs
*
regs
,
int
*rctxp);
306
307
static
inline
void
308
perf_trace_buf_submit(
void
*raw_data,
int
size
,
int
rctx,
u64
addr
,
309
u64
count
,
struct
pt_regs
*
regs
,
void
*
head
,
310
struct
task_struct
*
task
)
311
{
312
perf_tp_event(addr, count, raw_data, size, regs, head, rctx, task);
313
}
314
#endif
315
316
#endif
/* _LINUX_FTRACE_EVENT_H */
Generated on Thu Jan 10 2013 14:51:28 for Linux Kernel by
1.8.2