Blame view

include/trace/trace_events.h 22.7 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  /* SPDX-License-Identifier: GPL-2.0 */
c32e827b2   Steven Rostedt   tracing: add raw ...
2
  /*
f42c85e74   Steven Rostedt   tracing/events: m...
3
4
5
6
   * 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...
7
   * struct trace_event_raw_<call> {
f42c85e74   Steven Rostedt   tracing/events: m...
8
9
10
11
12
13
14
15
16
17
18
   *	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...
19
  #include <linux/trace_events.h>
f42c85e74   Steven Rostedt   tracing/events: m...
20

acd388fd3   Steven Rostedt (Red Hat)   tracing: Give sys...
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  #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...
35
36
  #undef TRACE_DEFINE_ENUM
  #define TRACE_DEFINE_ENUM(a)				\
00f4b652b   Jeremy Linton   trace: rename tra...
37
  	static struct trace_eval_map __used __initdata	\
0c564a538   Steven Rostedt (Red Hat)   tracing: Add TRAC...
38
39
40
  	__##TRACE_SYSTEM##_##a =			\
  	{						\
  		.system = TRACE_SYSTEM_STRING,		\
00f4b652b   Jeremy Linton   trace: rename tra...
41
42
  		.eval_string = #a,			\
  		.eval_value = a				\
0c564a538   Steven Rostedt (Red Hat)   tracing: Add TRAC...
43
  	};						\
00f4b652b   Jeremy Linton   trace: rename tra...
44
  	static struct trace_eval_map __used		\
02fd7f68f   Jeremy Linton   trace: rename ker...
45
  	__attribute__((section("_ftrace_eval_map")))	\
0c564a538   Steven Rostedt (Red Hat)   tracing: Add TRAC...
46
  	*TRACE_SYSTEM##_##a = &__##TRACE_SYSTEM##_##a
4f0dfd76e   Jeremy Linton   tracing: define T...
47
48
49
50
51
52
53
54
55
56
57
58
  #undef TRACE_DEFINE_SIZEOF
  #define TRACE_DEFINE_SIZEOF(a)				\
  	static struct trace_eval_map __used __initdata	\
  	__##TRACE_SYSTEM##_##a =			\
  	{						\
  		.system = TRACE_SYSTEM_STRING,		\
  		.eval_string = "sizeof(" #a ")",	\
  		.eval_value = sizeof(a)			\
  	};						\
  	static struct trace_eval_map __used		\
  	__attribute__((section("_ftrace_eval_map")))	\
  	*TRACE_SYSTEM##_##a = &__##TRACE_SYSTEM##_##a
ff038f5c3   Steven Rostedt   tracing: Create n...
59
  /*
091ad3658   Ingo Molnar   events: Rename TR...
60
   * DECLARE_EVENT_CLASS can be used to add a generic function
ff038f5c3   Steven Rostedt   tracing: Create n...
61
62
63
   * 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...
64
   * will map the DECLARE_EVENT_CLASS to the tracepoint.
ff038f5c3   Steven Rostedt   tracing: Create n...
65
66
67
68
69
   *
   * 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...
70
  	DECLARE_EVENT_CLASS(name,			       \
ff038f5c3   Steven Rostedt   tracing: Create n...
71
72
73
74
75
76
  			     PARAMS(proto),		       \
  			     PARAMS(args),		       \
  			     PARAMS(tstruct),		       \
  			     PARAMS(assign),		       \
  			     PARAMS(print));		       \
  	DEFINE_EVENT(name, name, PARAMS(proto), PARAMS(args));
7fcb7c472   Li Zefan   tracing/events: i...
77
78
  #undef __field
  #define __field(type, item)		type	item;
43b51ead3   Li Zefan   tracing/filters: ...
79
80
  #undef __field_ext
  #define __field_ext(type, item, filter_type)	type	item;
4d4c9cc83   Steven Rostedt   tracing: Add __fi...
81
82
83
84
85
  #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...
86
87
  #undef __array
  #define __array(type, item, len)	type	item[len];
7fcb7c472   Li Zefan   tracing/events: i...
88
  #undef __dynamic_array
7d536cb3f   Li Zefan   tracing/events: r...
89
  #define __dynamic_array(type, item, len) u32 __data_loc_##item;
f42c85e74   Steven Rostedt   tracing/events: m...
90

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

4449bf927   Steven Rostedt (Red Hat)   tracing: Add __bi...
94
95
  #undef __bitmask
  #define __bitmask(item, nr_bits) __dynamic_array(char, item, -1)
f42c85e74   Steven Rostedt   tracing/events: m...
96
97
  #undef TP_STRUCT__entry
  #define TP_STRUCT__entry(args...) args
091ad3658   Ingo Molnar   events: Rename TR...
98
99
  #undef DECLARE_EVENT_CLASS
  #define DECLARE_EVENT_CLASS(name, proto, args, tstruct, assign, print)	\
a72377657   Steven Rostedt (Red Hat)   tracing: Rename f...
100
  	struct trace_event_raw_##name {					\
ff038f5c3   Steven Rostedt   tracing: Create n...
101
102
103
  		struct trace_entry	ent;				\
  		tstruct							\
  		char			__data[0];			\
8f0820183   Steven Rostedt   tracing: Create c...
104
105
  	};								\
  									\
2425bcb92   Steven Rostedt (Red Hat)   tracing: Rename f...
106
  	static struct trace_event_class event_class_##name;
8f0820183   Steven Rostedt   tracing: Create c...
107

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

f5abaa1bf   Steven Rostedt   tracing: Add DEFI...
113
114
115
  #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...
116
117
118
  #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...
119
120
  /* Callbacks are meaningless to ftrace. */
  #undef TRACE_EVENT_FN
0dd7b7478   Frederic Weisbecker   tracing: Fix doub...
121
122
  #define TRACE_EVENT_FN(name, proto, args, tstruct,			\
  		assign, print, reg, unreg)				\
819ce45af   Frederic Weisbecker   tracing: Drop cpp...
123
124
  	TRACE_EVENT(name, PARAMS(proto), PARAMS(args),			\
  		PARAMS(tstruct), PARAMS(assign), PARAMS(print))		\
2701121b8   Denis Kirjanov   tracing: Introduc...
125
126
127
128
129
130
  
  #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...
131

1ed0c5971   Frederic Weisbecker   tracing: New macr...
132
133
  #undef TRACE_EVENT_FLAGS
  #define TRACE_EVENT_FLAGS(name, value)					\
53cf810b1   Frederic Weisbecker   tracing: Allow sy...
134
  	__TRACE_EVENT_FLAGS(name, value)
1ed0c5971   Frederic Weisbecker   tracing: New macr...
135

d5b5f391d   Peter Zijlstra   ftrace, perf: Avo...
136
137
138
  #undef TRACE_EVENT_PERF_PERM
  #define TRACE_EVENT_PERF_PERM(name, expr...)				\
  	__TRACE_EVENT_PERF_PERM(name, expr)
f42c85e74   Steven Rostedt   tracing/events: m...
139
140
141
142
143
  #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
  
  /*
   * Stage 2 of the trace events.
   *
9cbf11766   Frederic Weisbecker   tracing/events: p...
144
145
   * Include the following:
   *
62323a148   Steven Rostedt (Red Hat)   tracing: Rename f...
146
   * struct trace_event_data_offsets_<call> {
7d536cb3f   Li Zefan   tracing/events: r...
147
148
   *	u32				<item1>;
   *	u32				<item2>;
9cbf11766   Frederic Weisbecker   tracing/events: p...
149
150
151
   *	[...]
   * };
   *
7d536cb3f   Li Zefan   tracing/events: r...
152
   * The __dynamic_array() macro will create each u32 <item>, this is
7fcb7c472   Li Zefan   tracing/events: i...
153
   * to keep the offset of each array from the beginning of the event.
7d536cb3f   Li Zefan   tracing/events: r...
154
   * The size of an array is also encoded, in the higher 16 bits of <item>.
9cbf11766   Frederic Weisbecker   tracing/events: p...
155
   */
0c564a538   Steven Rostedt (Red Hat)   tracing: Add TRAC...
156
157
  #undef TRACE_DEFINE_ENUM
  #define TRACE_DEFINE_ENUM(a)
4f0dfd76e   Jeremy Linton   tracing: define T...
158
159
  #undef TRACE_DEFINE_SIZEOF
  #define TRACE_DEFINE_SIZEOF(a)
7fcb7c472   Li Zefan   tracing/events: i...
160
  #undef __field
43b51ead3   Li Zefan   tracing/filters: ...
161
162
163
164
  #define __field(type, item)
  
  #undef __field_ext
  #define __field_ext(type, item, filter_type)
7fcb7c472   Li Zefan   tracing/events: i...
165

4d4c9cc83   Steven Rostedt   tracing: Add __fi...
166
167
168
169
170
  #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...
171
172
  #undef __array
  #define __array(type, item, len)
7fcb7c472   Li Zefan   tracing/events: i...
173
  #undef __dynamic_array
7d536cb3f   Li Zefan   tracing/events: r...
174
  #define __dynamic_array(type, item, len)	u32 item;
9cbf11766   Frederic Weisbecker   tracing/events: p...
175
176
  
  #undef __string
7fcb7c472   Li Zefan   tracing/events: i...
177
  #define __string(item, src) __dynamic_array(char, item, -1)
9cbf11766   Frederic Weisbecker   tracing/events: p...
178

4449bf927   Steven Rostedt (Red Hat)   tracing: Add __bi...
179
180
  #undef __bitmask
  #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1)
091ad3658   Ingo Molnar   events: Rename TR...
181
182
  #undef DECLARE_EVENT_CLASS
  #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print)	\
62323a148   Steven Rostedt (Red Hat)   tracing: Rename f...
183
  	struct trace_event_data_offsets_##call {			\
9cbf11766   Frederic Weisbecker   tracing/events: p...
184
185
  		tstruct;						\
  	};
ff038f5c3   Steven Rostedt   tracing: Create n...
186
187
  #undef DEFINE_EVENT
  #define DEFINE_EVENT(template, name, proto, args)
e5bc97216   Steven Rostedt   tracing: Create n...
188
189
190
  #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...
191
192
  #undef TRACE_EVENT_FLAGS
  #define TRACE_EVENT_FLAGS(event, flag)
d5b5f391d   Peter Zijlstra   ftrace, perf: Avo...
193
194
  #undef TRACE_EVENT_PERF_PERM
  #define TRACE_EVENT_PERF_PERM(event, expr...)
9cbf11766   Frederic Weisbecker   tracing/events: p...
195
196
197
198
199
  #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
  
  /*
   * Stage 3 of the trace events.
   *
f42c85e74   Steven Rostedt   tracing/events: m...
200
201
202
   * Override the macros in <trace/trace_events.h> to include the following:
   *
   * enum print_line_t
892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
203
   * trace_raw_output_<call>(struct trace_iterator *iter, int flags)
f42c85e74   Steven Rostedt   tracing/events: m...
204
205
   * {
   *	struct trace_seq *s = &iter->seq;
a72377657   Steven Rostedt (Red Hat)   tracing: Rename f...
206
   *	struct trace_event_raw_<call> *field; <-- defined in stage 1
f42c85e74   Steven Rostedt   tracing/events: m...
207
   *	struct trace_entry *entry;
bc289ae98   Lai Jiangshan   tracing: Reduce l...
208
   *	struct trace_seq *p = &iter->tmp_seq;
f42c85e74   Steven Rostedt   tracing/events: m...
209
210
211
212
   *	int ret;
   *
   *	entry = iter->ent;
   *
32c0edaea   Steven Rostedt   tracing: Remove d...
213
   *	if (entry->type != event_<call>->event.type) {
f42c85e74   Steven Rostedt   tracing/events: m...
214
215
216
217
218
219
   *		WARN_ON_ONCE(1);
   *		return TRACE_TYPE_UNHANDLED;
   *	}
   *
   *	field = (typeof(field))entry;
   *
56d8bd3f0   Steven Whitehouse   tracing: fix mult...
220
   *	trace_seq_init(p);
50354a8a2   Li Zefan   tracing: Update c...
221
222
223
224
   *	ret = trace_seq_printf(s, "%s: ", <call>);
   *	if (ret)
   *		ret = trace_seq_printf(s, <TP_printk> "
  ");
f42c85e74   Steven Rostedt   tracing/events: m...
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
   *	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...
242
243
  #undef __get_dynamic_array
  #define __get_dynamic_array(field)	\
7d536cb3f   Li Zefan   tracing/events: r...
244
  		((void *)__entry + (__entry->__data_loc_##field & 0xffff))
7fcb7c472   Li Zefan   tracing/events: i...
245

beba4bb09   Steven Rostedt (Red Hat)   tracing: Add __ge...
246
247
248
  #undef __get_dynamic_array_len
  #define __get_dynamic_array_len(field)	\
  		((__entry->__data_loc_##field >> 16) & 0xffff)
9cbf11766   Frederic Weisbecker   tracing/events: p...
249
  #undef __get_str
934de5f2e   Daniel Bristot de Oliveira   tracing: Use oute...
250
  #define __get_str(field) ((char *)__get_dynamic_array(field))
9cbf11766   Frederic Weisbecker   tracing/events: p...
251

4449bf927   Steven Rostedt (Red Hat)   tracing: Add __bi...
252
253
254
255
256
  #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...
257
  		__bitmask_size = __get_dynamic_array_len(field);	\
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
258
  		trace_print_bitmask_seq(p, __bitmask, __bitmask_size);	\
4449bf927   Steven Rostedt (Red Hat)   tracing: Add __bi...
259
  	})
be74b73a5   Steven Rostedt   tracing: add __pr...
260
261
262
  #undef __print_flags
  #define __print_flags(flag, delim, flag_array...)			\
  	({								\
a48f494e1   Steven Rostedt   tracing: have TRA...
263
  		static const struct trace_print_flags __flags[] =	\
be74b73a5   Steven Rostedt   tracing: add __pr...
264
  			{ flag_array, { -1, NULL }};			\
645df987f   Steven Rostedt (Red Hat)   tracing: Rename f...
265
  		trace_print_flags_seq(p, delim, flag, __flags);	\
be74b73a5   Steven Rostedt   tracing: add __pr...
266
  	})
0f4fc29dd   Steven Rostedt   tracing: add __pr...
267
268
269
270
271
  #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...
272
  		trace_print_symbols_seq(p, value, symbols);		\
0f4fc29dd   Steven Rostedt   tracing: add __pr...
273
  	})
d3213e8fd   Ross Zwisler   tracing: add __pr...
274
  #undef __print_flags_u64
2fc1b6f0d   liubo   tracing: Add __pr...
275
276
  #undef __print_symbolic_u64
  #if BITS_PER_LONG == 32
d3213e8fd   Ross Zwisler   tracing: add __pr...
277
278
279
280
281
282
  #define __print_flags_u64(flag, delim, flag_array...)			\
  	({								\
  		static const struct trace_print_flags_u64 __flags[] =	\
  			{ flag_array, { -1, NULL } };			\
  		trace_print_flags_seq_u64(p, delim, flag, __flags);	\
  	})
2fc1b6f0d   liubo   tracing: Add __pr...
283
284
285
286
  #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...
287
  		trace_print_symbols_seq_u64(p, value, symbols);	\
2fc1b6f0d   liubo   tracing: Add __pr...
288
289
  	})
  #else
d3213e8fd   Ross Zwisler   tracing: add __pr...
290
291
  #define __print_flags_u64(flag, delim, flag_array...)			\
  			__print_flags(flag, delim, flag_array)
2fc1b6f0d   liubo   tracing: Add __pr...
292
293
294
  #define __print_symbolic_u64(value, symbol_array...)			\
  			__print_symbolic(value, symbol_array)
  #endif
5a2e39959   Kei Tokunaga   [SCSI] ftrace: ad...
295
  #undef __print_hex
2acae0d5b   Daniel Borkmann   trace: add varian...
296
  #define __print_hex(buf, buf_len)					\
3898fac1f   Daniel Borkmann   trace: rename tra...
297
  	trace_print_hex_seq(p, buf, buf_len, false)
2acae0d5b   Daniel Borkmann   trace: add varian...
298
299
300
  
  #undef __print_hex_str
  #define __print_hex_str(buf, buf_len)					\
3898fac1f   Daniel Borkmann   trace: rename tra...
301
  	trace_print_hex_seq(p, buf, buf_len, true)
5a2e39959   Kei Tokunaga   [SCSI] ftrace: ad...
302

6ea22486b   Dave Martin   tracing: Add arra...
303
304
305
306
307
  #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...
308
  		trace_print_array_seq(p, array, count, el_size);	\
6ea22486b   Dave Martin   tracing: Add arra...
309
  	})
091ad3658   Ingo Molnar   events: Rename TR...
310
311
  #undef DECLARE_EVENT_CLASS
  #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print)	\
83f0d5399   Steven Rostedt   tracing: Add notr...
312
  static notrace enum print_line_t					\
892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
313
314
  trace_raw_output_##call(struct trace_iterator *iter, int flags,		\
  			struct trace_event *trace_event)		\
f42c85e74   Steven Rostedt   tracing/events: m...
315
316
  {									\
  	struct trace_seq *s = &iter->seq;				\
f71130de5   Li Zefan   tracing: Add a he...
317
  	struct trace_seq __maybe_unused *p = &iter->tmp_seq;		\
a72377657   Steven Rostedt (Red Hat)   tracing: Rename f...
318
  	struct trace_event_raw_##call *field;				\
f42c85e74   Steven Rostedt   tracing/events: m...
319
320
  	int ret;							\
  									\
f71130de5   Li Zefan   tracing: Add a he...
321
  	field = (typeof(field))iter->ent;				\
80decc70a   Steven Rostedt   tracing: Move pri...
322
  									\
892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
323
  	ret = trace_raw_output_prep(iter, trace_event);			\
8e2e095cb   Steven Rostedt (Red Hat)   tracing: Fix retu...
324
  	if (ret != TRACE_TYPE_HANDLED)					\
f71130de5   Li Zefan   tracing: Add a he...
325
326
  		return ret;						\
  									\
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
327
  	trace_seq_printf(s, print);					\
f42c85e74   Steven Rostedt   tracing/events: m...
328
  									\
19a7fe206   Steven Rostedt (Red Hat)   tracing: Add trac...
329
  	return trace_handle_return(s);					\
80decc70a   Steven Rostedt   tracing: Move pri...
330
  }									\
3ad017bac   Steven Rostedt (Red Hat)   tracing: Rename f...
331
  static struct trace_event_functions trace_event_type_funcs_##call = {	\
892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
332
  	.trace			= trace_raw_output_##call,		\
80decc70a   Steven Rostedt   tracing: Move pri...
333
  };
ff038f5c3   Steven Rostedt   tracing: Create n...
334

e5bc97216   Steven Rostedt   tracing: Create n...
335
336
  #undef DEFINE_EVENT_PRINT
  #define DEFINE_EVENT_PRINT(template, call, proto, args, print)		\
83f0d5399   Steven Rostedt   tracing: Add notr...
337
  static notrace enum print_line_t					\
892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
338
  trace_raw_output_##call(struct trace_iterator *iter, int flags,		\
a9a577638   Steven Rostedt   tracing: Allow ev...
339
  			 struct trace_event *event)			\
e5bc97216   Steven Rostedt   tracing: Create n...
340
  {									\
a72377657   Steven Rostedt (Red Hat)   tracing: Rename f...
341
  	struct trace_event_raw_##template *field;			\
e5bc97216   Steven Rostedt   tracing: Create n...
342
  	struct trace_entry *entry;					\
bc289ae98   Lai Jiangshan   tracing: Reduce l...
343
  	struct trace_seq *p = &iter->tmp_seq;				\
e5bc97216   Steven Rostedt   tracing: Create n...
344
345
346
  									\
  	entry = iter->ent;						\
  									\
32c0edaea   Steven Rostedt   tracing: Remove d...
347
  	if (entry->type != event_##call.event.type) {			\
f42c85e74   Steven Rostedt   tracing/events: m...
348
349
350
351
352
353
  		WARN_ON_ONCE(1);					\
  		return TRACE_TYPE_UNHANDLED;				\
  	}								\
  									\
  	field = (typeof(field))entry;					\
  									\
56d8bd3f0   Steven Whitehouse   tracing: fix mult...
354
  	trace_seq_init(p);						\
892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
355
  	return trace_output_call(iter, #call, print);			\
80decc70a   Steven Rostedt   tracing: Move pri...
356
  }									\
3ad017bac   Steven Rostedt (Red Hat)   tracing: Rename f...
357
  static struct trace_event_functions trace_event_type_funcs_##call = {	\
892c505aa   Steven Rostedt (Red Hat)   tracing: Rename f...
358
  	.trace			= trace_raw_output_##call,		\
80decc70a   Steven Rostedt   tracing: Move pri...
359
  };
e5bc97216   Steven Rostedt   tracing: Create n...
360

f42c85e74   Steven Rostedt   tracing/events: m...
361
  #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
43b51ead3   Li Zefan   tracing/filters: ...
362
363
  #undef __field_ext
  #define __field_ext(type, item, filter_type)				\
f42c85e74   Steven Rostedt   tracing/events: m...
364
365
  	ret = trace_define_field(event_call, #type, #item,		\
  				 offsetof(typeof(field), item),		\
43b51ead3   Li Zefan   tracing/filters: ...
366
367
  				 sizeof(field.item),			\
  				 is_signed_type(type), filter_type);	\
f42c85e74   Steven Rostedt   tracing/events: m...
368
369
  	if (ret)							\
  		return ret;
4d4c9cc83   Steven Rostedt   tracing: Add __fi...
370
371
372
373
374
375
376
377
  #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: ...
378
379
  #undef __field
  #define __field(type, item)	__field_ext(type, item, FILTER_OTHER)
4d4c9cc83   Steven Rostedt   tracing: Add __fi...
380
381
  #undef __field_struct
  #define __field_struct(type, item) __field_struct_ext(type, item, FILTER_OTHER)
f42c85e74   Steven Rostedt   tracing/events: m...
382
383
  #undef __array
  #define __array(type, item, len)					\
042957801   Steven Rostedt   tracing/events: S...
384
  	do {								\
87291347c   Vaibhav Nagarnaik   tracing: Fix arra...
385
  		char *type_str = #type"["__stringify(len)"]";		\
042957801   Steven Rostedt   tracing/events: S...
386
  		BUILD_BUG_ON(len > MAX_FILTER_STR_VAL);			\
4a0772cf0   Steven Rostedt (VMware)   tracing: Prevent ...
387
  		BUILD_BUG_ON(len <= 0);					\
87291347c   Vaibhav Nagarnaik   tracing: Fix arra...
388
  		ret = trace_define_field(event_call, type_str, #item,	\
f42c85e74   Steven Rostedt   tracing/events: m...
389
  				 offsetof(typeof(field), item),		\
fb7ae981c   Lai Jiangshan   tracing: Fix sign...
390
391
  				 sizeof(field.item),			\
  				 is_signed_type(type), FILTER_OTHER);	\
042957801   Steven Rostedt   tracing/events: S...
392
393
394
  		if (ret)						\
  			return ret;					\
  	} while (0);
f42c85e74   Steven Rostedt   tracing/events: m...
395

7fcb7c472   Li Zefan   tracing/events: i...
396
397
  #undef __dynamic_array
  #define __dynamic_array(type, item, len)				       \
68fd60a8c   Lai Jiangshan   tracing/events: a...
398
  	ret = trace_define_field(event_call, "__data_loc " #type "[]", #item,  \
43b51ead3   Li Zefan   tracing/filters: ...
399
  				 offsetof(typeof(field), __data_loc_##item),   \
fb7ae981c   Lai Jiangshan   tracing: Fix sign...
400
401
  				 sizeof(field.__data_loc_##item),	       \
  				 is_signed_type(type), FILTER_OTHER);
7fcb7c472   Li Zefan   tracing/events: i...
402

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

4449bf927   Steven Rostedt (Red Hat)   tracing: Add __bi...
406
407
  #undef __bitmask
  #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1)
091ad3658   Ingo Molnar   events: Rename TR...
408
409
  #undef DECLARE_EVENT_CLASS
  #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, func, print)	\
7e4f44b15   Li Zefan   tracing: Annotate...
410
  static int notrace __init						\
33d0f35ee   Steven Rostedt (Red Hat)   tracing: Rename f...
411
  trace_event_define_fields_##call(struct trace_event_call *event_call)	\
f42c85e74   Steven Rostedt   tracing/events: m...
412
  {									\
a72377657   Steven Rostedt (Red Hat)   tracing: Rename f...
413
  	struct trace_event_raw_##call field;				\
f42c85e74   Steven Rostedt   tracing/events: m...
414
415
  	int ret;							\
  									\
f42c85e74   Steven Rostedt   tracing/events: m...
416
417
418
419
  	tstruct;							\
  									\
  	return ret;							\
  }
ff038f5c3   Steven Rostedt   tracing: Create n...
420
421
  #undef DEFINE_EVENT
  #define DEFINE_EVENT(template, name, proto, args)
e5bc97216   Steven Rostedt   tracing: Create n...
422
423
424
  #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...
425
426
427
  #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
  
  /*
7fcb7c472   Li Zefan   tracing/events: i...
428
429
430
431
432
433
434
435
   * 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: ...
436
437
  #undef __field_ext
  #define __field_ext(type, item, filter_type)
4d4c9cc83   Steven Rostedt   tracing: Add __fi...
438
439
440
441
442
  #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...
443
444
445
446
447
  #undef __array
  #define __array(type, item, len)
  
  #undef __dynamic_array
  #define __dynamic_array(type, item, len)				\
114e7b52d   Filipe Brandenburger   tracing: Evaluate...
448
  	__item_length = (len) * sizeof(type);				\
7fcb7c472   Li Zefan   tracing/events: i...
449
450
  	__data_offsets->item = __data_size +				\
  			       offsetof(typeof(*entry), __data);	\
114e7b52d   Filipe Brandenburger   tracing: Evaluate...
451
452
  	__data_offsets->item |= __item_length << 16;			\
  	__data_size += __item_length;
7fcb7c472   Li Zefan   tracing/events: i...
453
454
  
  #undef __string
4e58e5475   Steven Rostedt (Red Hat)   tracing: Allow ev...
455
456
  #define __string(item, src) __dynamic_array(char, item,			\
  		    strlen((src) ? (const char *)(src) : "(null)") + 1)
7fcb7c472   Li Zefan   tracing/events: i...
457

4449bf927   Steven Rostedt (Red Hat)   tracing: Add __bi...
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
  /*
   * __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...
480
481
  #undef DECLARE_EVENT_CLASS
  #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print)	\
d0ee8f4a1   Steven Rostedt (Red Hat)   tracing: Rename f...
482
  static inline notrace int trace_event_get_offsets_##call(		\
62323a148   Steven Rostedt (Red Hat)   tracing: Rename f...
483
  	struct trace_event_data_offsets_##call *__data_offsets, proto)	\
7fcb7c472   Li Zefan   tracing/events: i...
484
485
  {									\
  	int __data_size = 0;						\
114e7b52d   Filipe Brandenburger   tracing: Evaluate...
486
  	int __maybe_unused __item_length;				\
a72377657   Steven Rostedt (Red Hat)   tracing: Rename f...
487
  	struct trace_event_raw_##call __maybe_unused *entry;		\
7fcb7c472   Li Zefan   tracing/events: i...
488
489
490
491
492
  									\
  	tstruct;							\
  									\
  	return __data_size;						\
  }
ff038f5c3   Steven Rostedt   tracing: Create n...
493
494
  #undef DEFINE_EVENT
  #define DEFINE_EVENT(template, name, proto, args)
e5bc97216   Steven Rostedt   tracing: Create n...
495
496
497
  #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...
498
  #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
46ac51822   Steven Rostedt (Red Hat)   tracing: Move non...
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
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
  /*
   * 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...
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
  #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
2acae0d5b   Daniel Borkmann   trace: add varian...
697
  #undef __print_hex_str
46ac51822   Steven Rostedt (Red Hat)   tracing: Move non...
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
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
  #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)