Blame view

include/trace/trace_events.h 21.7 KB
c32e827b2   Steven Rostedt   tracing: add raw ...
1
  /*
f42c85e74   Steven Rostedt   tracing/events: m...
2
3
4
5
   * Stage 1 of the trace events.
   *
   * Override the macros in <trace/trace_events.h> to include the following:
   *
a72377657   Steven Rostedt (Red Hat)   tracing: Rename f...
6
   * struct trace_event_raw_<call> {
f42c85e74   Steven Rostedt   tracing/events: m...
7
8
9
10
11
12
13
14
15
16
17
   *	struct trace_entry		ent;
   *	<type>				<item>;
   *	<type2>				<item2>[<len>];
   *	[...]
   * };
   *
   * The <type> <item> is created by the __field(type, item) macro or
   * the __array(type2, item2, len) macro.
   * We simply do "type item;", and that will create the fields
   * in the structure.
   */
af658dca2   Steven Rostedt (Red Hat)   tracing: Rename f...
18
  #include <linux/trace_events.h>
f42c85e74   Steven Rostedt   tracing/events: m...
19

acd388fd3   Steven Rostedt (Red Hat)   tracing: Give sys...
20
21
22
23
24
25
26
27
28
29
30
31
32
33
  #ifndef TRACE_SYSTEM_VAR
  #define TRACE_SYSTEM_VAR TRACE_SYSTEM
  #endif
  
  #define __app__(x, y) str__##x##y
  #define __app(x, y) __app__(x, y)
  
  #define TRACE_SYSTEM_STRING __app(TRACE_SYSTEM_VAR,__trace_system_name)
  
  #define TRACE_MAKE_SYSTEM_STR()				\
  	static const char TRACE_SYSTEM_STRING[] =	\
  		__stringify(TRACE_SYSTEM)
  
  TRACE_MAKE_SYSTEM_STR();
0c564a538   Steven Rostedt (Red Hat)   tracing: Add TRAC...
34
35
36
37
38
39
40
41
42
43
44
45
  #undef TRACE_DEFINE_ENUM
  #define TRACE_DEFINE_ENUM(a)				\
  	static struct trace_enum_map __used __initdata	\
  	__##TRACE_SYSTEM##_##a =			\
  	{						\
  		.system = TRACE_SYSTEM_STRING,		\
  		.enum_string = #a,			\
  		.enum_value = a				\
  	};						\
  	static struct trace_enum_map __used		\
  	__attribute__((section("_ftrace_enum_map")))	\
  	*TRACE_SYSTEM##_##a = &__##TRACE_SYSTEM##_##a
ff038f5c3   Steven Rostedt   tracing: Create n...
46
  /*
091ad3658   Ingo Molnar   events: Rename TR...
47
   * DECLARE_EVENT_CLASS can be used to add a generic function
ff038f5c3   Steven Rostedt   tracing: Create n...
48
49
50
   * handlers for events. That is, if all events have the same
   * parameters and just have distinct trace points.
   * Each tracepoint can be defined with DEFINE_EVENT and that
091ad3658   Ingo Molnar   events: Rename TR...
51
   * will map the DECLARE_EVENT_CLASS to the tracepoint.
ff038f5c3   Steven Rostedt   tracing: Create n...
52
53
54
55
56
   *
   * TRACE_EVENT is a one to one mapping between tracepoint and template.
   */
  #undef TRACE_EVENT
  #define TRACE_EVENT(name, proto, args, tstruct, assign, print) \
091ad3658   Ingo Molnar   events: Rename TR...
57
  	DECLARE_EVENT_CLASS(name,			       \
ff038f5c3   Steven Rostedt   tracing: Create n...
58
59
60
61
62
63
  			     PARAMS(proto),		       \
  			     PARAMS(args),		       \
  			     PARAMS(tstruct),		       \
  			     PARAMS(assign),		       \
  			     PARAMS(print));		       \
  	DEFINE_EVENT(name, name, PARAMS(proto), PARAMS(args));
7fcb7c472   Li Zefan   tracing/events: i...
64
65
  #undef __field
  #define __field(type, item)		type	item;
43b51ead3   Li Zefan   tracing/filters: ...
66
67
  #undef __field_ext
  #define __field_ext(type, item, filter_type)	type	item;
4d4c9cc83   Steven Rostedt   tracing: Add __fi...
68
69
70
71
72
  #undef __field_struct
  #define __field_struct(type, item)	type	item;
  
  #undef __field_struct_ext
  #define __field_struct_ext(type, item, filter_type)	type	item;
f42c85e74   Steven Rostedt   tracing/events: m...
73
74
  #undef __array
  #define __array(type, item, len)	type	item[len];
7fcb7c472   Li Zefan   tracing/events: i...
75
  #undef __dynamic_array
7d536cb3f   Li Zefan   tracing/events: r...
76
  #define __dynamic_array(type, item, len) u32 __data_loc_##item;
f42c85e74   Steven Rostedt   tracing/events: m...
77

9cbf11766   Frederic Weisbecker   tracing/events: p...
78
  #undef __string
7fcb7c472   Li Zefan   tracing/events: i...
79
  #define __string(item, src) __dynamic_array(char, item, -1)
9cbf11766   Frederic Weisbecker   tracing/events: p...
80

4449bf927   Steven Rostedt (Red Hat)   tracing: Add __bi...
81
82
  #undef __bitmask
  #define __bitmask(item, nr_bits) __dynamic_array(char, item, -1)
f42c85e74   Steven Rostedt   tracing/events: m...
83
84
  #undef TP_STRUCT__entry
  #define TP_STRUCT__entry(args...) args
091ad3658   Ingo Molnar   events: Rename TR...
85
86
  #undef DECLARE_EVENT_CLASS
  #define DECLARE_EVENT_CLASS(name, proto, args, tstruct, assign, print)	\
a72377657   Steven Rostedt (Red Hat)   tracing: Rename f...
87
  	struct trace_event_raw_##name {					\
ff038f5c3   Steven Rostedt   tracing: Create n...
88
89
90
  		struct trace_entry	ent;				\
  		tstruct							\
  		char			__data[0];			\
8f0820183   Steven Rostedt   tracing: Create c...
91
92
  	};								\
  									\
2425bcb92   Steven Rostedt (Red Hat)   tracing: Rename f...
93
  	static struct trace_event_class event_class_##name;
8f0820183   Steven Rostedt   tracing: Create c...
94

ff038f5c3   Steven Rostedt   tracing: Create n...
95
96
  #undef DEFINE_EVENT
  #define DEFINE_EVENT(template, name, proto, args)	\
2425bcb92   Steven Rostedt (Red Hat)   tracing: Rename f...
97
  	static struct trace_event_call	__used		\
86c38a31a   Jeff Mahoney   tracing: Fix ftra...
98
  	__attribute__((__aligned__(4))) event_##name
f42c85e74   Steven Rostedt   tracing/events: m...
99

f5abaa1bf   Steven Rostedt   tracing: Add DEFI...
100
101
102
  #undef DEFINE_EVENT_FN
  #define DEFINE_EVENT_FN(template, name, proto, args, reg, unreg)	\
  	DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
e5bc97216   Steven Rostedt   tracing: Create n...
103
104
105
  #undef DEFINE_EVENT_PRINT
  #define DEFINE_EVENT_PRINT(template, name, proto, args, print)	\
  	DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
974198758   Josh Stone   tracing: Move tra...
106
107
  /* Callbacks are meaningless to ftrace. */
  #undef TRACE_EVENT_FN
0dd7b7478   Frederic Weisbecker   tracing: Fix doub...
108
109
  #define TRACE_EVENT_FN(name, proto, args, tstruct,			\
  		assign, print, reg, unreg)				\
819ce45af   Frederic Weisbecker   tracing: Drop cpp...
110
111
  	TRACE_EVENT(name, PARAMS(proto), PARAMS(args),			\
  		PARAMS(tstruct), PARAMS(assign), PARAMS(print))		\
2701121b8   Denis Kirjanov   tracing: Introduc...
112
113
114
115
116
117
  
  #undef TRACE_EVENT_FN_COND
  #define TRACE_EVENT_FN_COND(name, proto, args, cond, tstruct,	\
  		assign, print, reg, unreg)				\
  	TRACE_EVENT_CONDITION(name, PARAMS(proto), PARAMS(args), PARAMS(cond),		\
  		PARAMS(tstruct), PARAMS(assign), PARAMS(print))		\
974198758   Josh Stone   tracing: Move tra...
118

1ed0c5971   Frederic Weisbecker   tracing: New macr...
119
120
  #undef TRACE_EVENT_FLAGS
  #define TRACE_EVENT_FLAGS(name, value)					\
53cf810b1   Frederic Weisbecker   tracing: Allow sy...
121
  	__TRACE_EVENT_FLAGS(name, value)
1ed0c5971   Frederic Weisbecker   tracing: New macr...
122

d5b5f391d   Peter Zijlstra   ftrace, perf: Avo...
123
124
125
  #undef TRACE_EVENT_PERF_PERM
  #define TRACE_EVENT_PERF_PERM(name, expr...)				\
  	__TRACE_EVENT_PERF_PERM(name, expr)
f42c85e74   Steven Rostedt   tracing/events: m...
126
127
128
129
130
  #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
  
  /*
   * Stage 2 of the trace events.
   *
9cbf11766   Frederic Weisbecker   tracing/events: p...
131
132
   * Include the following:
   *
62323a148   Steven Rostedt (Red Hat)   tracing: Rename f...
133
   * struct trace_event_data_offsets_<call> {
7d536cb3f   Li Zefan   tracing/events: r...
134
135
   *	u32				<item1>;
   *	u32				<item2>;
9cbf11766   Frederic Weisbecker   tracing/events: p...
136
137
138
   *	[...]
   * };
   *
7d536cb3f   Li Zefan   tracing/events: r...
139
   * The __dynamic_array() macro will create each u32 <item>, this is
7fcb7c472   Li Zefan   tracing/events: i...
140
   * to keep the offset of each array from the beginning of the event.
7d536cb3f   Li Zefan   tracing/events: r...
141
   * The size of an array is also encoded, in the higher 16 bits of <item>.
9cbf11766   Frederic Weisbecker   tracing/events: p...
142
   */
0c564a538   Steven Rostedt (Red Hat)   tracing: Add TRAC...
143
144
  #undef TRACE_DEFINE_ENUM
  #define TRACE_DEFINE_ENUM(a)
7fcb7c472   Li Zefan   tracing/events: i...
145
  #undef __field
43b51ead3   Li Zefan   tracing/filters: ...
146
147
148
149
  #define __field(type, item)
  
  #undef __field_ext
  #define __field_ext(type, item, filter_type)
7fcb7c472   Li Zefan   tracing/events: i...
150

4d4c9cc83   Steven Rostedt   tracing: Add __fi...
151
152
153
154
155
  #undef __field_struct
  #define __field_struct(type, item)
  
  #undef __field_struct_ext
  #define __field_struct_ext(type, item, filter_type)
9cbf11766   Frederic Weisbecker   tracing/events: p...
156
157
  #undef __array
  #define __array(type, item, len)
7fcb7c472   Li Zefan   tracing/events: i...
158
  #undef __dynamic_array
7d536cb3f   Li Zefan   tracing/events: r...
159
  #define __dynamic_array(type, item, len)	u32 item;
9cbf11766   Frederic Weisbecker   tracing/events: p...
160
161
  
  #undef __string
7fcb7c472   Li Zefan   tracing/events: i...
162
  #define __string(item, src) __dynamic_array(char, item, -1)
9cbf11766   Frederic Weisbecker   tracing/events: p...
163

4449bf927   Steven Rostedt (Red Hat)   tracing: Add __bi...
164
165
  #undef __bitmask
  #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1)
091ad3658   Ingo Molnar   events: Rename TR...
166
167
  #undef DECLARE_EVENT_CLASS
  #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print)	\
62323a148   Steven Rostedt (Red Hat)   tracing: Rename f...
168
  	struct trace_event_data_offsets_##call {			\
9cbf11766   Frederic Weisbecker   tracing/events: p...
169
170
  		tstruct;						\
  	};
ff038f5c3   Steven Rostedt   tracing: Create n...
171
172
  #undef DEFINE_EVENT
  #define DEFINE_EVENT(template, name, proto, args)
e5bc97216   Steven Rostedt   tracing: Create n...
173
174
175
  #undef DEFINE_EVENT_PRINT
  #define DEFINE_EVENT_PRINT(template, name, proto, args, print)	\
  	DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
1ed0c5971   Frederic Weisbecker   tracing: New macr...
176
177
  #undef TRACE_EVENT_FLAGS
  #define TRACE_EVENT_FLAGS(event, flag)
d5b5f391d   Peter Zijlstra   ftrace, perf: Avo...
178
179
  #undef TRACE_EVENT_PERF_PERM
  #define TRACE_EVENT_PERF_PERM(event, expr...)
9cbf11766   Frederic Weisbecker   tracing/events: p...
180
181
182
183
184
  #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
  
  /*
   * Stage 3 of the trace events.
   *
f42c85e74   Steven Rostedt   tracing/events: m...
185
186
187
   * Override the macros in <trace/trace_events.h> to include the following:
   *
   * enum print_line_t
892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
188
   * trace_raw_output_<call>(struct trace_iterator *iter, int flags)
f42c85e74   Steven Rostedt   tracing/events: m...
189
190
   * {
   *	struct trace_seq *s = &iter->seq;
a72377657   Steven Rostedt (Red Hat)   tracing: Rename f...
191
   *	struct trace_event_raw_<call> *field; <-- defined in stage 1
f42c85e74   Steven Rostedt   tracing/events: m...
192
   *	struct trace_entry *entry;
bc289ae98   Lai Jiangshan   tracing: Reduce l...
193
   *	struct trace_seq *p = &iter->tmp_seq;
f42c85e74   Steven Rostedt   tracing/events: m...
194
195
196
197
   *	int ret;
   *
   *	entry = iter->ent;
   *
32c0edaea   Steven Rostedt   tracing: Remove d...
198
   *	if (entry->type != event_<call>->event.type) {
f42c85e74   Steven Rostedt   tracing/events: m...
199
200
201
202
203
204
   *		WARN_ON_ONCE(1);
   *		return TRACE_TYPE_UNHANDLED;
   *	}
   *
   *	field = (typeof(field))entry;
   *
56d8bd3f0   Steven Whitehouse   tracing: fix mult...
205
   *	trace_seq_init(p);
50354a8a2   Li Zefan   tracing: Update c...
206
207
208
209
   *	ret = trace_seq_printf(s, "%s: ", <call>);
   *	if (ret)
   *		ret = trace_seq_printf(s, <TP_printk> "
  ");
f42c85e74   Steven Rostedt   tracing/events: m...
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
   *	if (!ret)
   *		return TRACE_TYPE_PARTIAL_LINE;
   *
   *	return TRACE_TYPE_HANDLED;
   * }
   *
   * This is the method used to print the raw event to the trace
   * output format. Note, this is not needed if the data is read
   * in binary.
   */
  
  #undef __entry
  #define __entry field
  
  #undef TP_printk
  #define TP_printk(fmt, args...) fmt "
  ", args
7fcb7c472   Li Zefan   tracing/events: i...
227
228
  #undef __get_dynamic_array
  #define __get_dynamic_array(field)	\
7d536cb3f   Li Zefan   tracing/events: r...
229
  		((void *)__entry + (__entry->__data_loc_##field & 0xffff))
7fcb7c472   Li Zefan   tracing/events: i...
230

beba4bb09   Steven Rostedt (Red Hat)   tracing: Add __ge...
231
232
233
  #undef __get_dynamic_array_len
  #define __get_dynamic_array_len(field)	\
  		((__entry->__data_loc_##field >> 16) & 0xffff)
9cbf11766   Frederic Weisbecker   tracing/events: p...
234
  #undef __get_str
934de5f2e   Daniel Bristot de Oliveira   tracing: Use oute...
235
  #define __get_str(field) ((char *)__get_dynamic_array(field))
9cbf11766   Frederic Weisbecker   tracing/events: p...
236

4449bf927   Steven Rostedt (Red Hat)   tracing: Add __bi...
237
238
239
240
241
  #undef __get_bitmask
  #define __get_bitmask(field)						\
  	({								\
  		void *__bitmask = __get_dynamic_array(field);		\
  		unsigned int __bitmask_size;				\
beba4bb09   Steven Rostedt (Red Hat)   tracing: Add __ge...
242
  		__bitmask_size = __get_dynamic_array_len(field);	\
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
243
  		trace_print_bitmask_seq(p, __bitmask, __bitmask_size);	\
4449bf927   Steven Rostedt (Red Hat)   tracing: Add __bi...
244
  	})
be74b73a5   Steven Rostedt   tracing: add __pr...
245
246
247
  #undef __print_flags
  #define __print_flags(flag, delim, flag_array...)			\
  	({								\
a48f494e1   Steven Rostedt   tracing: have TRA...
248
  		static const struct trace_print_flags __flags[] =	\
be74b73a5   Steven Rostedt   tracing: add __pr...
249
  			{ flag_array, { -1, NULL }};			\
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
250
  		trace_print_flags_seq(p, delim, flag, __flags);	\
be74b73a5   Steven Rostedt   tracing: add __pr...
251
  	})
0f4fc29dd   Steven Rostedt   tracing: add __pr...
252
253
254
255
256
  #undef __print_symbolic
  #define __print_symbolic(value, symbol_array...)			\
  	({								\
  		static const struct trace_print_flags symbols[] =	\
  			{ symbol_array, { -1, NULL }};			\
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
257
  		trace_print_symbols_seq(p, value, symbols);		\
0f4fc29dd   Steven Rostedt   tracing: add __pr...
258
  	})
2fc1b6f0d   liubo   tracing: Add __pr...
259
260
261
262
263
264
  #undef __print_symbolic_u64
  #if BITS_PER_LONG == 32
  #define __print_symbolic_u64(value, symbol_array...)			\
  	({								\
  		static const struct trace_print_flags_u64 symbols[] =	\
  			{ symbol_array, { -1, NULL } };			\
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
265
  		trace_print_symbols_seq_u64(p, value, symbols);	\
2fc1b6f0d   liubo   tracing: Add __pr...
266
267
268
269
270
  	})
  #else
  #define __print_symbolic_u64(value, symbol_array...)			\
  			__print_symbolic(value, symbol_array)
  #endif
5a2e39959   Kei Tokunaga   [SCSI] ftrace: ad...
271
  #undef __print_hex
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
272
  #define __print_hex(buf, buf_len) trace_print_hex_seq(p, buf, buf_len)
5a2e39959   Kei Tokunaga   [SCSI] ftrace: ad...
273

6ea22486b   Dave Martin   tracing: Add arra...
274
275
276
277
278
  #undef __print_array
  #define __print_array(array, count, el_size)				\
  	({								\
  		BUILD_BUG_ON(el_size != 1 && el_size != 2 &&		\
  			     el_size != 4 && el_size != 8);		\
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
279
  		trace_print_array_seq(p, array, count, el_size);	\
6ea22486b   Dave Martin   tracing: Add arra...
280
  	})
091ad3658   Ingo Molnar   events: Rename TR...
281
282
  #undef DECLARE_EVENT_CLASS
  #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print)	\
83f0d5399   Steven Rostedt   tracing: Add notr...
283
  static notrace enum print_line_t					\
892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
284
285
  trace_raw_output_##call(struct trace_iterator *iter, int flags,		\
  			struct trace_event *trace_event)		\
f42c85e74   Steven Rostedt   tracing/events: m...
286
287
  {									\
  	struct trace_seq *s = &iter->seq;				\
f71130de5   Li Zefan   tracing: Add a he...
288
  	struct trace_seq __maybe_unused *p = &iter->tmp_seq;		\
a72377657   Steven Rostedt (Red Hat)   tracing: Rename f...
289
  	struct trace_event_raw_##call *field;				\
f42c85e74   Steven Rostedt   tracing/events: m...
290
291
  	int ret;							\
  									\
f71130de5   Li Zefan   tracing: Add a he...
292
  	field = (typeof(field))iter->ent;				\
80decc70a   Steven Rostedt   tracing: Move pri...
293
  									\
892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
294
  	ret = trace_raw_output_prep(iter, trace_event);			\
8e2e095cb   Steven Rostedt (Red Hat)   tracing: Fix retu...
295
  	if (ret != TRACE_TYPE_HANDLED)					\
f71130de5   Li Zefan   tracing: Add a he...
296
297
  		return ret;						\
  									\
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
298
  	trace_seq_printf(s, print);					\
f42c85e74   Steven Rostedt   tracing/events: m...
299
  									\
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
300
  	return trace_handle_return(s);					\
80decc70a   Steven Rostedt   tracing: Move pri...
301
  }									\
3ad017bac   Steven Rostedt (Red Hat)   tracing: Rename f...
302
  static struct trace_event_functions trace_event_type_funcs_##call = {	\
892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
303
  	.trace			= trace_raw_output_##call,		\
80decc70a   Steven Rostedt   tracing: Move pri...
304
  };
ff038f5c3   Steven Rostedt   tracing: Create n...
305

e5bc97216   Steven Rostedt   tracing: Create n...
306
307
  #undef DEFINE_EVENT_PRINT
  #define DEFINE_EVENT_PRINT(template, call, proto, args, print)		\
83f0d5399   Steven Rostedt   tracing: Add notr...
308
  static notrace enum print_line_t					\
892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
309
  trace_raw_output_##call(struct trace_iterator *iter, int flags,		\
a9a577638   Steven Rostedt   tracing: Allow ev...
310
  			 struct trace_event *event)			\
e5bc97216   Steven Rostedt   tracing: Create n...
311
  {									\
a72377657   Steven Rostedt (Red Hat)   tracing: Rename f...
312
  	struct trace_event_raw_##template *field;			\
e5bc97216   Steven Rostedt   tracing: Create n...
313
  	struct trace_entry *entry;					\
bc289ae98   Lai Jiangshan   tracing: Reduce l...
314
  	struct trace_seq *p = &iter->tmp_seq;				\
e5bc97216   Steven Rostedt   tracing: Create n...
315
316
317
  									\
  	entry = iter->ent;						\
  									\
32c0edaea   Steven Rostedt   tracing: Remove d...
318
  	if (entry->type != event_##call.event.type) {			\
f42c85e74   Steven Rostedt   tracing/events: m...
319
320
321
322
323
324
  		WARN_ON_ONCE(1);					\
  		return TRACE_TYPE_UNHANDLED;				\
  	}								\
  									\
  	field = (typeof(field))entry;					\
  									\
56d8bd3f0   Steven Whitehouse   tracing: fix mult...
325
  	trace_seq_init(p);						\
892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
326
  	return trace_output_call(iter, #call, print);			\
80decc70a   Steven Rostedt   tracing: Move pri...
327
  }									\
3ad017bac   Steven Rostedt (Red Hat)   tracing: Rename f...
328
  static struct trace_event_functions trace_event_type_funcs_##call = {	\
892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
329
  	.trace			= trace_raw_output_##call,		\
80decc70a   Steven Rostedt   tracing: Move pri...
330
  };
e5bc97216   Steven Rostedt   tracing: Create n...
331

f42c85e74   Steven Rostedt   tracing/events: m...
332
  #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
43b51ead3   Li Zefan   tracing/filters: ...
333
334
  #undef __field_ext
  #define __field_ext(type, item, filter_type)				\
f42c85e74   Steven Rostedt   tracing/events: m...
335
336
  	ret = trace_define_field(event_call, #type, #item,		\
  				 offsetof(typeof(field), item),		\
43b51ead3   Li Zefan   tracing/filters: ...
337
338
  				 sizeof(field.item),			\
  				 is_signed_type(type), filter_type);	\
f42c85e74   Steven Rostedt   tracing/events: m...
339
340
  	if (ret)							\
  		return ret;
4d4c9cc83   Steven Rostedt   tracing: Add __fi...
341
342
343
344
345
346
347
348
  #undef __field_struct_ext
  #define __field_struct_ext(type, item, filter_type)			\
  	ret = trace_define_field(event_call, #type, #item,		\
  				 offsetof(typeof(field), item),		\
  				 sizeof(field.item),			\
  				 0, filter_type);			\
  	if (ret)							\
  		return ret;
43b51ead3   Li Zefan   tracing/filters: ...
349
350
  #undef __field
  #define __field(type, item)	__field_ext(type, item, FILTER_OTHER)
4d4c9cc83   Steven Rostedt   tracing: Add __fi...
351
352
  #undef __field_struct
  #define __field_struct(type, item) __field_struct_ext(type, item, FILTER_OTHER)
f42c85e74   Steven Rostedt   tracing/events: m...
353
354
  #undef __array
  #define __array(type, item, len)					\
042957801   Steven Rostedt   tracing/events: S...
355
  	do {								\
87291347c   Vaibhav Nagarnaik   tracing: Fix arra...
356
  		char *type_str = #type"["__stringify(len)"]";		\
042957801   Steven Rostedt   tracing/events: S...
357
  		BUILD_BUG_ON(len > MAX_FILTER_STR_VAL);			\
87291347c   Vaibhav Nagarnaik   tracing: Fix arra...
358
  		ret = trace_define_field(event_call, type_str, #item,	\
f42c85e74   Steven Rostedt   tracing/events: m...
359
  				 offsetof(typeof(field), item),		\
fb7ae981c   Lai Jiangshan   tracing: Fix sign...
360
361
  				 sizeof(field.item),			\
  				 is_signed_type(type), FILTER_OTHER);	\
042957801   Steven Rostedt   tracing/events: S...
362
363
364
  		if (ret)						\
  			return ret;					\
  	} while (0);
f42c85e74   Steven Rostedt   tracing/events: m...
365

7fcb7c472   Li Zefan   tracing/events: i...
366
367
  #undef __dynamic_array
  #define __dynamic_array(type, item, len)				       \
68fd60a8c   Lai Jiangshan   tracing/events: a...
368
  	ret = trace_define_field(event_call, "__data_loc " #type "[]", #item,  \
43b51ead3   Li Zefan   tracing/filters: ...
369
  				 offsetof(typeof(field), __data_loc_##item),   \
fb7ae981c   Lai Jiangshan   tracing: Fix sign...
370
371
  				 sizeof(field.__data_loc_##item),	       \
  				 is_signed_type(type), FILTER_OTHER);
7fcb7c472   Li Zefan   tracing/events: i...
372

9cbf11766   Frederic Weisbecker   tracing/events: p...
373
  #undef __string
7fcb7c472   Li Zefan   tracing/events: i...
374
  #define __string(item, src) __dynamic_array(char, item, -1)
9cbf11766   Frederic Weisbecker   tracing/events: p...
375

4449bf927   Steven Rostedt (Red Hat)   tracing: Add __bi...
376
377
  #undef __bitmask
  #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1)
091ad3658   Ingo Molnar   events: Rename TR...
378
379
  #undef DECLARE_EVENT_CLASS
  #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, func, print)	\
7e4f44b15   Li Zefan   tracing: Annotate...
380
  static int notrace __init						\
33d0f35ee   Steven Rostedt (Red Hat)   tracing: Rename f...
381
  trace_event_define_fields_##call(struct trace_event_call *event_call)	\
f42c85e74   Steven Rostedt   tracing/events: m...
382
  {									\
a72377657   Steven Rostedt (Red Hat)   tracing: Rename f...
383
  	struct trace_event_raw_##call field;				\
f42c85e74   Steven Rostedt   tracing/events: m...
384
385
  	int ret;							\
  									\
f42c85e74   Steven Rostedt   tracing/events: m...
386
387
388
389
  	tstruct;							\
  									\
  	return ret;							\
  }
ff038f5c3   Steven Rostedt   tracing: Create n...
390
391
  #undef DEFINE_EVENT
  #define DEFINE_EVENT(template, name, proto, args)
e5bc97216   Steven Rostedt   tracing: Create n...
392
393
394
  #undef DEFINE_EVENT_PRINT
  #define DEFINE_EVENT_PRINT(template, name, proto, args, print)	\
  	DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
f42c85e74   Steven Rostedt   tracing/events: m...
395
396
397
  #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
  
  /*
7fcb7c472   Li Zefan   tracing/events: i...
398
399
400
401
402
403
404
405
   * remember the offset of each array from the beginning of the event.
   */
  
  #undef __entry
  #define __entry entry
  
  #undef __field
  #define __field(type, item)
43b51ead3   Li Zefan   tracing/filters: ...
406
407
  #undef __field_ext
  #define __field_ext(type, item, filter_type)
4d4c9cc83   Steven Rostedt   tracing: Add __fi...
408
409
410
411
412
  #undef __field_struct
  #define __field_struct(type, item)
  
  #undef __field_struct_ext
  #define __field_struct_ext(type, item, filter_type)
7fcb7c472   Li Zefan   tracing/events: i...
413
414
415
416
417
  #undef __array
  #define __array(type, item, len)
  
  #undef __dynamic_array
  #define __dynamic_array(type, item, len)				\
114e7b52d   Filipe Brandenburger   tracing: Evaluate...
418
  	__item_length = (len) * sizeof(type);				\
7fcb7c472   Li Zefan   tracing/events: i...
419
420
  	__data_offsets->item = __data_size +				\
  			       offsetof(typeof(*entry), __data);	\
114e7b52d   Filipe Brandenburger   tracing: Evaluate...
421
422
  	__data_offsets->item |= __item_length << 16;			\
  	__data_size += __item_length;
7fcb7c472   Li Zefan   tracing/events: i...
423
424
  
  #undef __string
4e58e5475   Steven Rostedt (Red Hat)   tracing: Allow ev...
425
426
  #define __string(item, src) __dynamic_array(char, item,			\
  		    strlen((src) ? (const char *)(src) : "(null)") + 1)
7fcb7c472   Li Zefan   tracing/events: i...
427

4449bf927   Steven Rostedt (Red Hat)   tracing: Add __bi...
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
  /*
   * __bitmask_size_in_bytes_raw is the number of bytes needed to hold
   * num_possible_cpus().
   */
  #define __bitmask_size_in_bytes_raw(nr_bits)	\
  	(((nr_bits) + 7) / 8)
  
  #define __bitmask_size_in_longs(nr_bits)			\
  	((__bitmask_size_in_bytes_raw(nr_bits) +		\
  	  ((BITS_PER_LONG / 8) - 1)) / (BITS_PER_LONG / 8))
  
  /*
   * __bitmask_size_in_bytes is the number of bytes needed to hold
   * num_possible_cpus() padded out to the nearest long. This is what
   * is saved in the buffer, just to be consistent.
   */
  #define __bitmask_size_in_bytes(nr_bits)				\
  	(__bitmask_size_in_longs(nr_bits) * (BITS_PER_LONG / 8))
  
  #undef __bitmask
  #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item,	\
  					 __bitmask_size_in_longs(nr_bits))
091ad3658   Ingo Molnar   events: Rename TR...
450
451
  #undef DECLARE_EVENT_CLASS
  #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print)	\
d0ee8f4a1   Steven Rostedt (Red Hat)   tracing: Rename f...
452
  static inline notrace int trace_event_get_offsets_##call(		\
62323a148   Steven Rostedt (Red Hat)   tracing: Rename f...
453
  	struct trace_event_data_offsets_##call *__data_offsets, proto)	\
7fcb7c472   Li Zefan   tracing/events: i...
454
455
  {									\
  	int __data_size = 0;						\
114e7b52d   Filipe Brandenburger   tracing: Evaluate...
456
  	int __maybe_unused __item_length;				\
a72377657   Steven Rostedt (Red Hat)   tracing: Rename f...
457
  	struct trace_event_raw_##call __maybe_unused *entry;		\
7fcb7c472   Li Zefan   tracing/events: i...
458
459
460
461
462
  									\
  	tstruct;							\
  									\
  	return __data_size;						\
  }
ff038f5c3   Steven Rostedt   tracing: Create n...
463
464
  #undef DEFINE_EVENT
  #define DEFINE_EVENT(template, name, proto, args)
e5bc97216   Steven Rostedt   tracing: Create n...
465
466
467
  #undef DEFINE_EVENT_PRINT
  #define DEFINE_EVENT_PRINT(template, name, proto, args, print)	\
  	DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
7fcb7c472   Li Zefan   tracing/events: i...
468
  #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
46ac51822   Steven Rostedt (Red Hat)   tracing: Move non...
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
  /*
   * Stage 4 of the trace events.
   *
   * Override the macros in <trace/trace_events.h> to include the following:
   *
   * For those macros defined with TRACE_EVENT:
   *
   * static struct trace_event_call event_<call>;
   *
   * static void trace_event_raw_event_<call>(void *__data, proto)
   * {
   *	struct trace_event_file *trace_file = __data;
   *	struct trace_event_call *event_call = trace_file->event_call;
   *	struct trace_event_data_offsets_<call> __maybe_unused __data_offsets;
   *	unsigned long eflags = trace_file->flags;
   *	enum event_trigger_type __tt = ETT_NONE;
   *	struct ring_buffer_event *event;
   *	struct trace_event_raw_<call> *entry; <-- defined in stage 1
   *	struct ring_buffer *buffer;
   *	unsigned long irq_flags;
   *	int __data_size;
   *	int pc;
   *
   *	if (!(eflags & EVENT_FILE_FL_TRIGGER_COND)) {
   *		if (eflags & EVENT_FILE_FL_TRIGGER_MODE)
   *			event_triggers_call(trace_file, NULL);
   *		if (eflags & EVENT_FILE_FL_SOFT_DISABLED)
   *			return;
   *	}
   *
   *	local_save_flags(irq_flags);
   *	pc = preempt_count();
   *
   *	__data_size = trace_event_get_offsets_<call>(&__data_offsets, args);
   *
   *	event = trace_event_buffer_lock_reserve(&buffer, trace_file,
   *				  event_<call>->event.type,
   *				  sizeof(*entry) + __data_size,
   *				  irq_flags, pc);
   *	if (!event)
   *		return;
   *	entry	= ring_buffer_event_data(event);
   *
   *	{ <assign>; }  <-- Here we assign the entries by the __field and
   *			   __array macros.
   *
   *	if (eflags & EVENT_FILE_FL_TRIGGER_COND)
   *		__tt = event_triggers_call(trace_file, entry);
   *
   *	if (test_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT,
   *		     &trace_file->flags))
   *		ring_buffer_discard_commit(buffer, event);
   *	else if (!filter_check_discard(trace_file, entry, buffer, event))
   *		trace_buffer_unlock_commit(buffer, event, irq_flags, pc);
   *
   *	if (__tt)
   *		event_triggers_post_call(trace_file, __tt);
   * }
   *
   * static struct trace_event ftrace_event_type_<call> = {
   *	.trace			= trace_raw_output_<call>, <-- stage 2
   * };
   *
   * static char print_fmt_<call>[] = <TP_printk>;
   *
   * static struct trace_event_class __used event_class_<template> = {
   *	.system			= "<system>",
   *	.define_fields		= trace_event_define_fields_<call>,
   *	.fields			= LIST_HEAD_INIT(event_class_##call.fields),
   *	.raw_init		= trace_event_raw_init,
   *	.probe			= trace_event_raw_event_##call,
   *	.reg			= trace_event_reg,
   * };
   *
   * static struct trace_event_call event_<call> = {
   *	.class			= event_class_<template>,
   *	{
   *		.tp			= &__tracepoint_<call>,
   *	},
   *	.event			= &ftrace_event_type_<call>,
   *	.print_fmt		= print_fmt_<call>,
   *	.flags			= TRACE_EVENT_FL_TRACEPOINT,
   * };
   * // its only safe to use pointers when doing linker tricks to
   * // create an array.
   * static struct trace_event_call __used
   * __attribute__((section("_ftrace_events"))) *__event_<call> = &event_<call>;
   *
   */
  
  #ifdef CONFIG_PERF_EVENTS
  
  #define _TRACE_PERF_PROTO(call, proto)					\
  	static notrace void						\
  	perf_trace_##call(void *__data, proto);
  
  #define _TRACE_PERF_INIT(call)						\
  	.perf_probe		= perf_trace_##call,
  
  #else
  #define _TRACE_PERF_PROTO(call, proto)
  #define _TRACE_PERF_INIT(call)
  #endif /* CONFIG_PERF_EVENTS */
  
  #undef __entry
  #define __entry entry
  
  #undef __field
  #define __field(type, item)
  
  #undef __field_struct
  #define __field_struct(type, item)
  
  #undef __array
  #define __array(type, item, len)
  
  #undef __dynamic_array
  #define __dynamic_array(type, item, len)				\
  	__entry->__data_loc_##item = __data_offsets.item;
  
  #undef __string
  #define __string(item, src) __dynamic_array(char, item, -1)
  
  #undef __assign_str
  #define __assign_str(dst, src)						\
  	strcpy(__get_str(dst), (src) ? (const char *)(src) : "(null)");
  
  #undef __bitmask
  #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1)
  
  #undef __get_bitmask
  #define __get_bitmask(field) (char *)__get_dynamic_array(field)
  
  #undef __assign_bitmask
  #define __assign_bitmask(dst, src, nr_bits)					\
  	memcpy(__get_bitmask(dst), (src), __bitmask_size_in_bytes(nr_bits))
  
  #undef TP_fast_assign
  #define TP_fast_assign(args...) args
46ac51822   Steven Rostedt (Red Hat)   tracing: Move non...
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
  #undef __perf_count
  #define __perf_count(c)	(c)
  
  #undef __perf_task
  #define __perf_task(t)	(t)
  
  #undef DECLARE_EVENT_CLASS
  #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print)	\
  									\
  static notrace void							\
  trace_event_raw_event_##call(void *__data, proto)			\
  {									\
  	struct trace_event_file *trace_file = __data;			\
  	struct trace_event_data_offsets_##call __maybe_unused __data_offsets;\
  	struct trace_event_buffer fbuffer;				\
  	struct trace_event_raw_##call *entry;				\
  	int __data_size;						\
  									\
  	if (trace_trigger_soft_disabled(trace_file))			\
  		return;							\
  									\
  	__data_size = trace_event_get_offsets_##call(&__data_offsets, args); \
  									\
  	entry = trace_event_buffer_reserve(&fbuffer, trace_file,	\
  				 sizeof(*entry) + __data_size);		\
  									\
  	if (!entry)							\
  		return;							\
  									\
  	tstruct								\
  									\
  	{ assign; }							\
  									\
  	trace_event_buffer_commit(&fbuffer);				\
  }
  /*
   * The ftrace_test_probe is compiled out, it is only here as a build time check
   * to make sure that if the tracepoint handling changes, the ftrace probe will
   * fail to compile unless it too is updated.
   */
  
  #undef DEFINE_EVENT
  #define DEFINE_EVENT(template, call, proto, args)			\
  static inline void ftrace_test_probe_##call(void)			\
  {									\
  	check_trace_callback_type_##call(trace_event_raw_event_##template); \
  }
  
  #undef DEFINE_EVENT_PRINT
  #define DEFINE_EVENT_PRINT(template, name, proto, args, print)
  
  #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
  
  #undef __entry
  #define __entry REC
  
  #undef __print_flags
  #undef __print_symbolic
  #undef __print_hex
  #undef __get_dynamic_array
  #undef __get_dynamic_array_len
  #undef __get_str
  #undef __get_bitmask
  #undef __print_array
  
  #undef TP_printk
  #define TP_printk(fmt, args...) "\"" fmt "\", "  __stringify(args)
  
  #undef DECLARE_EVENT_CLASS
  #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print)	\
  _TRACE_PERF_PROTO(call, PARAMS(proto));					\
  static char print_fmt_##call[] = print;					\
  static struct trace_event_class __used __refdata event_class_##call = { \
  	.system			= TRACE_SYSTEM_STRING,			\
  	.define_fields		= trace_event_define_fields_##call,	\
  	.fields			= LIST_HEAD_INIT(event_class_##call.fields),\
  	.raw_init		= trace_event_raw_init,			\
  	.probe			= trace_event_raw_event_##call,		\
  	.reg			= trace_event_reg,			\
  	_TRACE_PERF_INIT(call)						\
  };
  
  #undef DEFINE_EVENT
  #define DEFINE_EVENT(template, call, proto, args)			\
  									\
  static struct trace_event_call __used event_##call = {			\
  	.class			= &event_class_##template,		\
  	{								\
  		.tp			= &__tracepoint_##call,		\
  	},								\
  	.event.funcs		= &trace_event_type_funcs_##template,	\
  	.print_fmt		= print_fmt_##template,			\
  	.flags			= TRACE_EVENT_FL_TRACEPOINT,		\
  };									\
  static struct trace_event_call __used					\
  __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call
  
  #undef DEFINE_EVENT_PRINT
  #define DEFINE_EVENT_PRINT(template, call, proto, args, print)		\
  									\
  static char print_fmt_##call[] = print;					\
  									\
  static struct trace_event_call __used event_##call = {			\
  	.class			= &event_class_##template,		\
  	{								\
  		.tp			= &__tracepoint_##call,		\
  	},								\
  	.event.funcs		= &trace_event_type_funcs_##call,	\
  	.print_fmt		= print_fmt_##call,			\
  	.flags			= TRACE_EVENT_FL_TRACEPOINT,		\
  };									\
  static struct trace_event_call __used					\
  __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call
  
  #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)