Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.2-rc5 508 lines 14 kB view raw
1/* 2 * Stage 1 of the trace events. 3 * 4 * Override the macros in <trace/trace_events.h> to include the following: 5 * 6 * struct trace_event_raw_<call> { 7 * struct trace_entry ent; 8 * <type> <item>; 9 * <type2> <item2>[<len>]; 10 * [...] 11 * }; 12 * 13 * The <type> <item> is created by the __field(type, item) macro or 14 * the __array(type2, item2, len) macro. 15 * We simply do "type item;", and that will create the fields 16 * in the structure. 17 */ 18 19#include <linux/trace_events.h> 20 21#ifndef TRACE_SYSTEM_VAR 22#define TRACE_SYSTEM_VAR TRACE_SYSTEM 23#endif 24 25#define __app__(x, y) str__##x##y 26#define __app(x, y) __app__(x, y) 27 28#define TRACE_SYSTEM_STRING __app(TRACE_SYSTEM_VAR,__trace_system_name) 29 30#define TRACE_MAKE_SYSTEM_STR() \ 31 static const char TRACE_SYSTEM_STRING[] = \ 32 __stringify(TRACE_SYSTEM) 33 34TRACE_MAKE_SYSTEM_STR(); 35 36#undef TRACE_DEFINE_ENUM 37#define TRACE_DEFINE_ENUM(a) \ 38 static struct trace_enum_map __used __initdata \ 39 __##TRACE_SYSTEM##_##a = \ 40 { \ 41 .system = TRACE_SYSTEM_STRING, \ 42 .enum_string = #a, \ 43 .enum_value = a \ 44 }; \ 45 static struct trace_enum_map __used \ 46 __attribute__((section("_ftrace_enum_map"))) \ 47 *TRACE_SYSTEM##_##a = &__##TRACE_SYSTEM##_##a 48 49/* 50 * DECLARE_EVENT_CLASS can be used to add a generic function 51 * handlers for events. That is, if all events have the same 52 * parameters and just have distinct trace points. 53 * Each tracepoint can be defined with DEFINE_EVENT and that 54 * will map the DECLARE_EVENT_CLASS to the tracepoint. 55 * 56 * TRACE_EVENT is a one to one mapping between tracepoint and template. 57 */ 58#undef TRACE_EVENT 59#define TRACE_EVENT(name, proto, args, tstruct, assign, print) \ 60 DECLARE_EVENT_CLASS(name, \ 61 PARAMS(proto), \ 62 PARAMS(args), \ 63 PARAMS(tstruct), \ 64 PARAMS(assign), \ 65 PARAMS(print)); \ 66 DEFINE_EVENT(name, name, PARAMS(proto), PARAMS(args)); 67 68 69#undef __field 70#define __field(type, item) type item; 71 72#undef __field_ext 73#define __field_ext(type, item, filter_type) type item; 74 75#undef __field_struct 76#define __field_struct(type, item) type item; 77 78#undef __field_struct_ext 79#define __field_struct_ext(type, item, filter_type) type item; 80 81#undef __array 82#define __array(type, item, len) type item[len]; 83 84#undef __dynamic_array 85#define __dynamic_array(type, item, len) u32 __data_loc_##item; 86 87#undef __string 88#define __string(item, src) __dynamic_array(char, item, -1) 89 90#undef __bitmask 91#define __bitmask(item, nr_bits) __dynamic_array(char, item, -1) 92 93#undef TP_STRUCT__entry 94#define TP_STRUCT__entry(args...) args 95 96#undef DECLARE_EVENT_CLASS 97#define DECLARE_EVENT_CLASS(name, proto, args, tstruct, assign, print) \ 98 struct trace_event_raw_##name { \ 99 struct trace_entry ent; \ 100 tstruct \ 101 char __data[0]; \ 102 }; \ 103 \ 104 static struct trace_event_class event_class_##name; 105 106#undef DEFINE_EVENT 107#define DEFINE_EVENT(template, name, proto, args) \ 108 static struct trace_event_call __used \ 109 __attribute__((__aligned__(4))) event_##name 110 111#undef DEFINE_EVENT_FN 112#define DEFINE_EVENT_FN(template, name, proto, args, reg, unreg) \ 113 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 114 115#undef DEFINE_EVENT_PRINT 116#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 117 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 118 119/* Callbacks are meaningless to ftrace. */ 120#undef TRACE_EVENT_FN 121#define TRACE_EVENT_FN(name, proto, args, tstruct, \ 122 assign, print, reg, unreg) \ 123 TRACE_EVENT(name, PARAMS(proto), PARAMS(args), \ 124 PARAMS(tstruct), PARAMS(assign), PARAMS(print)) \ 125 126#undef TRACE_EVENT_FLAGS 127#define TRACE_EVENT_FLAGS(name, value) \ 128 __TRACE_EVENT_FLAGS(name, value) 129 130#undef TRACE_EVENT_PERF_PERM 131#define TRACE_EVENT_PERF_PERM(name, expr...) \ 132 __TRACE_EVENT_PERF_PERM(name, expr) 133 134#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 135 136/* 137 * Stage 2 of the trace events. 138 * 139 * Include the following: 140 * 141 * struct trace_event_data_offsets_<call> { 142 * u32 <item1>; 143 * u32 <item2>; 144 * [...] 145 * }; 146 * 147 * The __dynamic_array() macro will create each u32 <item>, this is 148 * to keep the offset of each array from the beginning of the event. 149 * The size of an array is also encoded, in the higher 16 bits of <item>. 150 */ 151 152#undef TRACE_DEFINE_ENUM 153#define TRACE_DEFINE_ENUM(a) 154 155#undef __field 156#define __field(type, item) 157 158#undef __field_ext 159#define __field_ext(type, item, filter_type) 160 161#undef __field_struct 162#define __field_struct(type, item) 163 164#undef __field_struct_ext 165#define __field_struct_ext(type, item, filter_type) 166 167#undef __array 168#define __array(type, item, len) 169 170#undef __dynamic_array 171#define __dynamic_array(type, item, len) u32 item; 172 173#undef __string 174#define __string(item, src) __dynamic_array(char, item, -1) 175 176#undef __bitmask 177#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1) 178 179#undef DECLARE_EVENT_CLASS 180#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 181 struct trace_event_data_offsets_##call { \ 182 tstruct; \ 183 }; 184 185#undef DEFINE_EVENT 186#define DEFINE_EVENT(template, name, proto, args) 187 188#undef DEFINE_EVENT_PRINT 189#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 190 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 191 192#undef TRACE_EVENT_FLAGS 193#define TRACE_EVENT_FLAGS(event, flag) 194 195#undef TRACE_EVENT_PERF_PERM 196#define TRACE_EVENT_PERF_PERM(event, expr...) 197 198#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 199 200/* 201 * Stage 3 of the trace events. 202 * 203 * Override the macros in <trace/trace_events.h> to include the following: 204 * 205 * enum print_line_t 206 * trace_raw_output_<call>(struct trace_iterator *iter, int flags) 207 * { 208 * struct trace_seq *s = &iter->seq; 209 * struct trace_event_raw_<call> *field; <-- defined in stage 1 210 * struct trace_entry *entry; 211 * struct trace_seq *p = &iter->tmp_seq; 212 * int ret; 213 * 214 * entry = iter->ent; 215 * 216 * if (entry->type != event_<call>->event.type) { 217 * WARN_ON_ONCE(1); 218 * return TRACE_TYPE_UNHANDLED; 219 * } 220 * 221 * field = (typeof(field))entry; 222 * 223 * trace_seq_init(p); 224 * ret = trace_seq_printf(s, "%s: ", <call>); 225 * if (ret) 226 * ret = trace_seq_printf(s, <TP_printk> "\n"); 227 * if (!ret) 228 * return TRACE_TYPE_PARTIAL_LINE; 229 * 230 * return TRACE_TYPE_HANDLED; 231 * } 232 * 233 * This is the method used to print the raw event to the trace 234 * output format. Note, this is not needed if the data is read 235 * in binary. 236 */ 237 238#undef __entry 239#define __entry field 240 241#undef TP_printk 242#define TP_printk(fmt, args...) fmt "\n", args 243 244#undef __get_dynamic_array 245#define __get_dynamic_array(field) \ 246 ((void *)__entry + (__entry->__data_loc_##field & 0xffff)) 247 248#undef __get_dynamic_array_len 249#define __get_dynamic_array_len(field) \ 250 ((__entry->__data_loc_##field >> 16) & 0xffff) 251 252#undef __get_str 253#define __get_str(field) (char *)__get_dynamic_array(field) 254 255#undef __get_bitmask 256#define __get_bitmask(field) \ 257 ({ \ 258 void *__bitmask = __get_dynamic_array(field); \ 259 unsigned int __bitmask_size; \ 260 __bitmask_size = __get_dynamic_array_len(field); \ 261 trace_print_bitmask_seq(p, __bitmask, __bitmask_size); \ 262 }) 263 264#undef __print_flags 265#define __print_flags(flag, delim, flag_array...) \ 266 ({ \ 267 static const struct trace_print_flags __flags[] = \ 268 { flag_array, { -1, NULL }}; \ 269 trace_print_flags_seq(p, delim, flag, __flags); \ 270 }) 271 272#undef __print_symbolic 273#define __print_symbolic(value, symbol_array...) \ 274 ({ \ 275 static const struct trace_print_flags symbols[] = \ 276 { symbol_array, { -1, NULL }}; \ 277 trace_print_symbols_seq(p, value, symbols); \ 278 }) 279 280#undef __print_symbolic_u64 281#if BITS_PER_LONG == 32 282#define __print_symbolic_u64(value, symbol_array...) \ 283 ({ \ 284 static const struct trace_print_flags_u64 symbols[] = \ 285 { symbol_array, { -1, NULL } }; \ 286 trace_print_symbols_seq_u64(p, value, symbols); \ 287 }) 288#else 289#define __print_symbolic_u64(value, symbol_array...) \ 290 __print_symbolic(value, symbol_array) 291#endif 292 293#undef __print_hex 294#define __print_hex(buf, buf_len) trace_print_hex_seq(p, buf, buf_len) 295 296#undef __print_array 297#define __print_array(array, count, el_size) \ 298 ({ \ 299 BUILD_BUG_ON(el_size != 1 && el_size != 2 && \ 300 el_size != 4 && el_size != 8); \ 301 trace_print_array_seq(p, array, count, el_size); \ 302 }) 303 304#undef DECLARE_EVENT_CLASS 305#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 306static notrace enum print_line_t \ 307trace_raw_output_##call(struct trace_iterator *iter, int flags, \ 308 struct trace_event *trace_event) \ 309{ \ 310 struct trace_seq *s = &iter->seq; \ 311 struct trace_seq __maybe_unused *p = &iter->tmp_seq; \ 312 struct trace_event_raw_##call *field; \ 313 int ret; \ 314 \ 315 field = (typeof(field))iter->ent; \ 316 \ 317 ret = trace_raw_output_prep(iter, trace_event); \ 318 if (ret != TRACE_TYPE_HANDLED) \ 319 return ret; \ 320 \ 321 trace_seq_printf(s, print); \ 322 \ 323 return trace_handle_return(s); \ 324} \ 325static struct trace_event_functions trace_event_type_funcs_##call = { \ 326 .trace = trace_raw_output_##call, \ 327}; 328 329#undef DEFINE_EVENT_PRINT 330#define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ 331static notrace enum print_line_t \ 332trace_raw_output_##call(struct trace_iterator *iter, int flags, \ 333 struct trace_event *event) \ 334{ \ 335 struct trace_event_raw_##template *field; \ 336 struct trace_entry *entry; \ 337 struct trace_seq *p = &iter->tmp_seq; \ 338 \ 339 entry = iter->ent; \ 340 \ 341 if (entry->type != event_##call.event.type) { \ 342 WARN_ON_ONCE(1); \ 343 return TRACE_TYPE_UNHANDLED; \ 344 } \ 345 \ 346 field = (typeof(field))entry; \ 347 \ 348 trace_seq_init(p); \ 349 return trace_output_call(iter, #call, print); \ 350} \ 351static struct trace_event_functions trace_event_type_funcs_##call = { \ 352 .trace = trace_raw_output_##call, \ 353}; 354 355#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 356 357#undef __field_ext 358#define __field_ext(type, item, filter_type) \ 359 ret = trace_define_field(event_call, #type, #item, \ 360 offsetof(typeof(field), item), \ 361 sizeof(field.item), \ 362 is_signed_type(type), filter_type); \ 363 if (ret) \ 364 return ret; 365 366#undef __field_struct_ext 367#define __field_struct_ext(type, item, filter_type) \ 368 ret = trace_define_field(event_call, #type, #item, \ 369 offsetof(typeof(field), item), \ 370 sizeof(field.item), \ 371 0, filter_type); \ 372 if (ret) \ 373 return ret; 374 375#undef __field 376#define __field(type, item) __field_ext(type, item, FILTER_OTHER) 377 378#undef __field_struct 379#define __field_struct(type, item) __field_struct_ext(type, item, FILTER_OTHER) 380 381#undef __array 382#define __array(type, item, len) \ 383 do { \ 384 char *type_str = #type"["__stringify(len)"]"; \ 385 BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ 386 ret = trace_define_field(event_call, type_str, #item, \ 387 offsetof(typeof(field), item), \ 388 sizeof(field.item), \ 389 is_signed_type(type), FILTER_OTHER); \ 390 if (ret) \ 391 return ret; \ 392 } while (0); 393 394#undef __dynamic_array 395#define __dynamic_array(type, item, len) \ 396 ret = trace_define_field(event_call, "__data_loc " #type "[]", #item, \ 397 offsetof(typeof(field), __data_loc_##item), \ 398 sizeof(field.__data_loc_##item), \ 399 is_signed_type(type), FILTER_OTHER); 400 401#undef __string 402#define __string(item, src) __dynamic_array(char, item, -1) 403 404#undef __bitmask 405#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1) 406 407#undef DECLARE_EVENT_CLASS 408#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, func, print) \ 409static int notrace __init \ 410trace_event_define_fields_##call(struct trace_event_call *event_call) \ 411{ \ 412 struct trace_event_raw_##call field; \ 413 int ret; \ 414 \ 415 tstruct; \ 416 \ 417 return ret; \ 418} 419 420#undef DEFINE_EVENT 421#define DEFINE_EVENT(template, name, proto, args) 422 423#undef DEFINE_EVENT_PRINT 424#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 425 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 426 427#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 428 429/* 430 * remember the offset of each array from the beginning of the event. 431 */ 432 433#undef __entry 434#define __entry entry 435 436#undef __field 437#define __field(type, item) 438 439#undef __field_ext 440#define __field_ext(type, item, filter_type) 441 442#undef __field_struct 443#define __field_struct(type, item) 444 445#undef __field_struct_ext 446#define __field_struct_ext(type, item, filter_type) 447 448#undef __array 449#define __array(type, item, len) 450 451#undef __dynamic_array 452#define __dynamic_array(type, item, len) \ 453 __item_length = (len) * sizeof(type); \ 454 __data_offsets->item = __data_size + \ 455 offsetof(typeof(*entry), __data); \ 456 __data_offsets->item |= __item_length << 16; \ 457 __data_size += __item_length; 458 459#undef __string 460#define __string(item, src) __dynamic_array(char, item, \ 461 strlen((src) ? (const char *)(src) : "(null)") + 1) 462 463/* 464 * __bitmask_size_in_bytes_raw is the number of bytes needed to hold 465 * num_possible_cpus(). 466 */ 467#define __bitmask_size_in_bytes_raw(nr_bits) \ 468 (((nr_bits) + 7) / 8) 469 470#define __bitmask_size_in_longs(nr_bits) \ 471 ((__bitmask_size_in_bytes_raw(nr_bits) + \ 472 ((BITS_PER_LONG / 8) - 1)) / (BITS_PER_LONG / 8)) 473 474/* 475 * __bitmask_size_in_bytes is the number of bytes needed to hold 476 * num_possible_cpus() padded out to the nearest long. This is what 477 * is saved in the buffer, just to be consistent. 478 */ 479#define __bitmask_size_in_bytes(nr_bits) \ 480 (__bitmask_size_in_longs(nr_bits) * (BITS_PER_LONG / 8)) 481 482#undef __bitmask 483#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, \ 484 __bitmask_size_in_longs(nr_bits)) 485 486#undef DECLARE_EVENT_CLASS 487#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 488static inline notrace int trace_event_get_offsets_##call( \ 489 struct trace_event_data_offsets_##call *__data_offsets, proto) \ 490{ \ 491 int __data_size = 0; \ 492 int __maybe_unused __item_length; \ 493 struct trace_event_raw_##call __maybe_unused *entry; \ 494 \ 495 tstruct; \ 496 \ 497 return __data_size; \ 498} 499 500#undef DEFINE_EVENT 501#define DEFINE_EVENT(template, name, proto, args) 502 503#undef DEFINE_EVENT_PRINT 504#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 505 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 506 507#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 508