Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v4.8 769 lines 22 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_FN_COND 127#define TRACE_EVENT_FN_COND(name, proto, args, cond, tstruct, \ 128 assign, print, reg, unreg) \ 129 TRACE_EVENT_CONDITION(name, PARAMS(proto), PARAMS(args), PARAMS(cond), \ 130 PARAMS(tstruct), PARAMS(assign), PARAMS(print)) \ 131 132#undef TRACE_EVENT_FLAGS 133#define TRACE_EVENT_FLAGS(name, value) \ 134 __TRACE_EVENT_FLAGS(name, value) 135 136#undef TRACE_EVENT_PERF_PERM 137#define TRACE_EVENT_PERF_PERM(name, expr...) \ 138 __TRACE_EVENT_PERF_PERM(name, expr) 139 140#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 141 142/* 143 * Stage 2 of the trace events. 144 * 145 * Include the following: 146 * 147 * struct trace_event_data_offsets_<call> { 148 * u32 <item1>; 149 * u32 <item2>; 150 * [...] 151 * }; 152 * 153 * The __dynamic_array() macro will create each u32 <item>, this is 154 * to keep the offset of each array from the beginning of the event. 155 * The size of an array is also encoded, in the higher 16 bits of <item>. 156 */ 157 158#undef TRACE_DEFINE_ENUM 159#define TRACE_DEFINE_ENUM(a) 160 161#undef __field 162#define __field(type, item) 163 164#undef __field_ext 165#define __field_ext(type, item, filter_type) 166 167#undef __field_struct 168#define __field_struct(type, item) 169 170#undef __field_struct_ext 171#define __field_struct_ext(type, item, filter_type) 172 173#undef __array 174#define __array(type, item, len) 175 176#undef __dynamic_array 177#define __dynamic_array(type, item, len) u32 item; 178 179#undef __string 180#define __string(item, src) __dynamic_array(char, item, -1) 181 182#undef __bitmask 183#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1) 184 185#undef DECLARE_EVENT_CLASS 186#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 187 struct trace_event_data_offsets_##call { \ 188 tstruct; \ 189 }; 190 191#undef DEFINE_EVENT 192#define DEFINE_EVENT(template, name, proto, args) 193 194#undef DEFINE_EVENT_PRINT 195#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 196 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 197 198#undef TRACE_EVENT_FLAGS 199#define TRACE_EVENT_FLAGS(event, flag) 200 201#undef TRACE_EVENT_PERF_PERM 202#define TRACE_EVENT_PERF_PERM(event, expr...) 203 204#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 205 206/* 207 * Stage 3 of the trace events. 208 * 209 * Override the macros in <trace/trace_events.h> to include the following: 210 * 211 * enum print_line_t 212 * trace_raw_output_<call>(struct trace_iterator *iter, int flags) 213 * { 214 * struct trace_seq *s = &iter->seq; 215 * struct trace_event_raw_<call> *field; <-- defined in stage 1 216 * struct trace_entry *entry; 217 * struct trace_seq *p = &iter->tmp_seq; 218 * int ret; 219 * 220 * entry = iter->ent; 221 * 222 * if (entry->type != event_<call>->event.type) { 223 * WARN_ON_ONCE(1); 224 * return TRACE_TYPE_UNHANDLED; 225 * } 226 * 227 * field = (typeof(field))entry; 228 * 229 * trace_seq_init(p); 230 * ret = trace_seq_printf(s, "%s: ", <call>); 231 * if (ret) 232 * ret = trace_seq_printf(s, <TP_printk> "\n"); 233 * if (!ret) 234 * return TRACE_TYPE_PARTIAL_LINE; 235 * 236 * return TRACE_TYPE_HANDLED; 237 * } 238 * 239 * This is the method used to print the raw event to the trace 240 * output format. Note, this is not needed if the data is read 241 * in binary. 242 */ 243 244#undef __entry 245#define __entry field 246 247#undef TP_printk 248#define TP_printk(fmt, args...) fmt "\n", args 249 250#undef __get_dynamic_array 251#define __get_dynamic_array(field) \ 252 ((void *)__entry + (__entry->__data_loc_##field & 0xffff)) 253 254#undef __get_dynamic_array_len 255#define __get_dynamic_array_len(field) \ 256 ((__entry->__data_loc_##field >> 16) & 0xffff) 257 258#undef __get_str 259#define __get_str(field) ((char *)__get_dynamic_array(field)) 260 261#undef __get_bitmask 262#define __get_bitmask(field) \ 263 ({ \ 264 void *__bitmask = __get_dynamic_array(field); \ 265 unsigned int __bitmask_size; \ 266 __bitmask_size = __get_dynamic_array_len(field); \ 267 trace_print_bitmask_seq(p, __bitmask, __bitmask_size); \ 268 }) 269 270#undef __print_flags 271#define __print_flags(flag, delim, flag_array...) \ 272 ({ \ 273 static const struct trace_print_flags __flags[] = \ 274 { flag_array, { -1, NULL }}; \ 275 trace_print_flags_seq(p, delim, flag, __flags); \ 276 }) 277 278#undef __print_symbolic 279#define __print_symbolic(value, symbol_array...) \ 280 ({ \ 281 static const struct trace_print_flags symbols[] = \ 282 { symbol_array, { -1, NULL }}; \ 283 trace_print_symbols_seq(p, value, symbols); \ 284 }) 285 286#undef __print_symbolic_u64 287#if BITS_PER_LONG == 32 288#define __print_symbolic_u64(value, symbol_array...) \ 289 ({ \ 290 static const struct trace_print_flags_u64 symbols[] = \ 291 { symbol_array, { -1, NULL } }; \ 292 trace_print_symbols_seq_u64(p, value, symbols); \ 293 }) 294#else 295#define __print_symbolic_u64(value, symbol_array...) \ 296 __print_symbolic(value, symbol_array) 297#endif 298 299#undef __print_hex 300#define __print_hex(buf, buf_len) trace_print_hex_seq(p, buf, buf_len) 301 302#undef __print_array 303#define __print_array(array, count, el_size) \ 304 ({ \ 305 BUILD_BUG_ON(el_size != 1 && el_size != 2 && \ 306 el_size != 4 && el_size != 8); \ 307 trace_print_array_seq(p, array, count, el_size); \ 308 }) 309 310#undef DECLARE_EVENT_CLASS 311#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 312static notrace enum print_line_t \ 313trace_raw_output_##call(struct trace_iterator *iter, int flags, \ 314 struct trace_event *trace_event) \ 315{ \ 316 struct trace_seq *s = &iter->seq; \ 317 struct trace_seq __maybe_unused *p = &iter->tmp_seq; \ 318 struct trace_event_raw_##call *field; \ 319 int ret; \ 320 \ 321 field = (typeof(field))iter->ent; \ 322 \ 323 ret = trace_raw_output_prep(iter, trace_event); \ 324 if (ret != TRACE_TYPE_HANDLED) \ 325 return ret; \ 326 \ 327 trace_seq_printf(s, print); \ 328 \ 329 return trace_handle_return(s); \ 330} \ 331static struct trace_event_functions trace_event_type_funcs_##call = { \ 332 .trace = trace_raw_output_##call, \ 333}; 334 335#undef DEFINE_EVENT_PRINT 336#define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ 337static notrace enum print_line_t \ 338trace_raw_output_##call(struct trace_iterator *iter, int flags, \ 339 struct trace_event *event) \ 340{ \ 341 struct trace_event_raw_##template *field; \ 342 struct trace_entry *entry; \ 343 struct trace_seq *p = &iter->tmp_seq; \ 344 \ 345 entry = iter->ent; \ 346 \ 347 if (entry->type != event_##call.event.type) { \ 348 WARN_ON_ONCE(1); \ 349 return TRACE_TYPE_UNHANDLED; \ 350 } \ 351 \ 352 field = (typeof(field))entry; \ 353 \ 354 trace_seq_init(p); \ 355 return trace_output_call(iter, #call, print); \ 356} \ 357static struct trace_event_functions trace_event_type_funcs_##call = { \ 358 .trace = trace_raw_output_##call, \ 359}; 360 361#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 362 363#undef __field_ext 364#define __field_ext(type, item, filter_type) \ 365 ret = trace_define_field(event_call, #type, #item, \ 366 offsetof(typeof(field), item), \ 367 sizeof(field.item), \ 368 is_signed_type(type), filter_type); \ 369 if (ret) \ 370 return ret; 371 372#undef __field_struct_ext 373#define __field_struct_ext(type, item, filter_type) \ 374 ret = trace_define_field(event_call, #type, #item, \ 375 offsetof(typeof(field), item), \ 376 sizeof(field.item), \ 377 0, filter_type); \ 378 if (ret) \ 379 return ret; 380 381#undef __field 382#define __field(type, item) __field_ext(type, item, FILTER_OTHER) 383 384#undef __field_struct 385#define __field_struct(type, item) __field_struct_ext(type, item, FILTER_OTHER) 386 387#undef __array 388#define __array(type, item, len) \ 389 do { \ 390 char *type_str = #type"["__stringify(len)"]"; \ 391 BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ 392 ret = trace_define_field(event_call, type_str, #item, \ 393 offsetof(typeof(field), item), \ 394 sizeof(field.item), \ 395 is_signed_type(type), FILTER_OTHER); \ 396 if (ret) \ 397 return ret; \ 398 } while (0); 399 400#undef __dynamic_array 401#define __dynamic_array(type, item, len) \ 402 ret = trace_define_field(event_call, "__data_loc " #type "[]", #item, \ 403 offsetof(typeof(field), __data_loc_##item), \ 404 sizeof(field.__data_loc_##item), \ 405 is_signed_type(type), FILTER_OTHER); 406 407#undef __string 408#define __string(item, src) __dynamic_array(char, item, -1) 409 410#undef __bitmask 411#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1) 412 413#undef DECLARE_EVENT_CLASS 414#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, func, print) \ 415static int notrace __init \ 416trace_event_define_fields_##call(struct trace_event_call *event_call) \ 417{ \ 418 struct trace_event_raw_##call field; \ 419 int ret; \ 420 \ 421 tstruct; \ 422 \ 423 return ret; \ 424} 425 426#undef DEFINE_EVENT 427#define DEFINE_EVENT(template, name, proto, args) 428 429#undef DEFINE_EVENT_PRINT 430#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 431 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 432 433#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 434 435/* 436 * remember the offset of each array from the beginning of the event. 437 */ 438 439#undef __entry 440#define __entry entry 441 442#undef __field 443#define __field(type, item) 444 445#undef __field_ext 446#define __field_ext(type, item, filter_type) 447 448#undef __field_struct 449#define __field_struct(type, item) 450 451#undef __field_struct_ext 452#define __field_struct_ext(type, item, filter_type) 453 454#undef __array 455#define __array(type, item, len) 456 457#undef __dynamic_array 458#define __dynamic_array(type, item, len) \ 459 __item_length = (len) * sizeof(type); \ 460 __data_offsets->item = __data_size + \ 461 offsetof(typeof(*entry), __data); \ 462 __data_offsets->item |= __item_length << 16; \ 463 __data_size += __item_length; 464 465#undef __string 466#define __string(item, src) __dynamic_array(char, item, \ 467 strlen((src) ? (const char *)(src) : "(null)") + 1) 468 469/* 470 * __bitmask_size_in_bytes_raw is the number of bytes needed to hold 471 * num_possible_cpus(). 472 */ 473#define __bitmask_size_in_bytes_raw(nr_bits) \ 474 (((nr_bits) + 7) / 8) 475 476#define __bitmask_size_in_longs(nr_bits) \ 477 ((__bitmask_size_in_bytes_raw(nr_bits) + \ 478 ((BITS_PER_LONG / 8) - 1)) / (BITS_PER_LONG / 8)) 479 480/* 481 * __bitmask_size_in_bytes is the number of bytes needed to hold 482 * num_possible_cpus() padded out to the nearest long. This is what 483 * is saved in the buffer, just to be consistent. 484 */ 485#define __bitmask_size_in_bytes(nr_bits) \ 486 (__bitmask_size_in_longs(nr_bits) * (BITS_PER_LONG / 8)) 487 488#undef __bitmask 489#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, \ 490 __bitmask_size_in_longs(nr_bits)) 491 492#undef DECLARE_EVENT_CLASS 493#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 494static inline notrace int trace_event_get_offsets_##call( \ 495 struct trace_event_data_offsets_##call *__data_offsets, proto) \ 496{ \ 497 int __data_size = 0; \ 498 int __maybe_unused __item_length; \ 499 struct trace_event_raw_##call __maybe_unused *entry; \ 500 \ 501 tstruct; \ 502 \ 503 return __data_size; \ 504} 505 506#undef DEFINE_EVENT 507#define DEFINE_EVENT(template, name, proto, args) 508 509#undef DEFINE_EVENT_PRINT 510#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 511 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 512 513#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 514 515/* 516 * Stage 4 of the trace events. 517 * 518 * Override the macros in <trace/trace_events.h> to include the following: 519 * 520 * For those macros defined with TRACE_EVENT: 521 * 522 * static struct trace_event_call event_<call>; 523 * 524 * static void trace_event_raw_event_<call>(void *__data, proto) 525 * { 526 * struct trace_event_file *trace_file = __data; 527 * struct trace_event_call *event_call = trace_file->event_call; 528 * struct trace_event_data_offsets_<call> __maybe_unused __data_offsets; 529 * unsigned long eflags = trace_file->flags; 530 * enum event_trigger_type __tt = ETT_NONE; 531 * struct ring_buffer_event *event; 532 * struct trace_event_raw_<call> *entry; <-- defined in stage 1 533 * struct ring_buffer *buffer; 534 * unsigned long irq_flags; 535 * int __data_size; 536 * int pc; 537 * 538 * if (!(eflags & EVENT_FILE_FL_TRIGGER_COND)) { 539 * if (eflags & EVENT_FILE_FL_TRIGGER_MODE) 540 * event_triggers_call(trace_file, NULL); 541 * if (eflags & EVENT_FILE_FL_SOFT_DISABLED) 542 * return; 543 * } 544 * 545 * local_save_flags(irq_flags); 546 * pc = preempt_count(); 547 * 548 * __data_size = trace_event_get_offsets_<call>(&__data_offsets, args); 549 * 550 * event = trace_event_buffer_lock_reserve(&buffer, trace_file, 551 * event_<call>->event.type, 552 * sizeof(*entry) + __data_size, 553 * irq_flags, pc); 554 * if (!event) 555 * return; 556 * entry = ring_buffer_event_data(event); 557 * 558 * { <assign>; } <-- Here we assign the entries by the __field and 559 * __array macros. 560 * 561 * if (eflags & EVENT_FILE_FL_TRIGGER_COND) 562 * __tt = event_triggers_call(trace_file, entry); 563 * 564 * if (test_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, 565 * &trace_file->flags)) 566 * ring_buffer_discard_commit(buffer, event); 567 * else if (!filter_check_discard(trace_file, entry, buffer, event)) 568 * trace_buffer_unlock_commit(buffer, event, irq_flags, pc); 569 * 570 * if (__tt) 571 * event_triggers_post_call(trace_file, __tt); 572 * } 573 * 574 * static struct trace_event ftrace_event_type_<call> = { 575 * .trace = trace_raw_output_<call>, <-- stage 2 576 * }; 577 * 578 * static char print_fmt_<call>[] = <TP_printk>; 579 * 580 * static struct trace_event_class __used event_class_<template> = { 581 * .system = "<system>", 582 * .define_fields = trace_event_define_fields_<call>, 583 * .fields = LIST_HEAD_INIT(event_class_##call.fields), 584 * .raw_init = trace_event_raw_init, 585 * .probe = trace_event_raw_event_##call, 586 * .reg = trace_event_reg, 587 * }; 588 * 589 * static struct trace_event_call event_<call> = { 590 * .class = event_class_<template>, 591 * { 592 * .tp = &__tracepoint_<call>, 593 * }, 594 * .event = &ftrace_event_type_<call>, 595 * .print_fmt = print_fmt_<call>, 596 * .flags = TRACE_EVENT_FL_TRACEPOINT, 597 * }; 598 * // its only safe to use pointers when doing linker tricks to 599 * // create an array. 600 * static struct trace_event_call __used 601 * __attribute__((section("_ftrace_events"))) *__event_<call> = &event_<call>; 602 * 603 */ 604 605#ifdef CONFIG_PERF_EVENTS 606 607#define _TRACE_PERF_PROTO(call, proto) \ 608 static notrace void \ 609 perf_trace_##call(void *__data, proto); 610 611#define _TRACE_PERF_INIT(call) \ 612 .perf_probe = perf_trace_##call, 613 614#else 615#define _TRACE_PERF_PROTO(call, proto) 616#define _TRACE_PERF_INIT(call) 617#endif /* CONFIG_PERF_EVENTS */ 618 619#undef __entry 620#define __entry entry 621 622#undef __field 623#define __field(type, item) 624 625#undef __field_struct 626#define __field_struct(type, item) 627 628#undef __array 629#define __array(type, item, len) 630 631#undef __dynamic_array 632#define __dynamic_array(type, item, len) \ 633 __entry->__data_loc_##item = __data_offsets.item; 634 635#undef __string 636#define __string(item, src) __dynamic_array(char, item, -1) 637 638#undef __assign_str 639#define __assign_str(dst, src) \ 640 strcpy(__get_str(dst), (src) ? (const char *)(src) : "(null)"); 641 642#undef __bitmask 643#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1) 644 645#undef __get_bitmask 646#define __get_bitmask(field) (char *)__get_dynamic_array(field) 647 648#undef __assign_bitmask 649#define __assign_bitmask(dst, src, nr_bits) \ 650 memcpy(__get_bitmask(dst), (src), __bitmask_size_in_bytes(nr_bits)) 651 652#undef TP_fast_assign 653#define TP_fast_assign(args...) args 654 655#undef __perf_count 656#define __perf_count(c) (c) 657 658#undef __perf_task 659#define __perf_task(t) (t) 660 661#undef DECLARE_EVENT_CLASS 662#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 663 \ 664static notrace void \ 665trace_event_raw_event_##call(void *__data, proto) \ 666{ \ 667 struct trace_event_file *trace_file = __data; \ 668 struct trace_event_data_offsets_##call __maybe_unused __data_offsets;\ 669 struct trace_event_buffer fbuffer; \ 670 struct trace_event_raw_##call *entry; \ 671 int __data_size; \ 672 \ 673 if (trace_trigger_soft_disabled(trace_file)) \ 674 return; \ 675 \ 676 __data_size = trace_event_get_offsets_##call(&__data_offsets, args); \ 677 \ 678 entry = trace_event_buffer_reserve(&fbuffer, trace_file, \ 679 sizeof(*entry) + __data_size); \ 680 \ 681 if (!entry) \ 682 return; \ 683 \ 684 tstruct \ 685 \ 686 { assign; } \ 687 \ 688 trace_event_buffer_commit(&fbuffer); \ 689} 690/* 691 * The ftrace_test_probe is compiled out, it is only here as a build time check 692 * to make sure that if the tracepoint handling changes, the ftrace probe will 693 * fail to compile unless it too is updated. 694 */ 695 696#undef DEFINE_EVENT 697#define DEFINE_EVENT(template, call, proto, args) \ 698static inline void ftrace_test_probe_##call(void) \ 699{ \ 700 check_trace_callback_type_##call(trace_event_raw_event_##template); \ 701} 702 703#undef DEFINE_EVENT_PRINT 704#define DEFINE_EVENT_PRINT(template, name, proto, args, print) 705 706#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 707 708#undef __entry 709#define __entry REC 710 711#undef __print_flags 712#undef __print_symbolic 713#undef __print_hex 714#undef __get_dynamic_array 715#undef __get_dynamic_array_len 716#undef __get_str 717#undef __get_bitmask 718#undef __print_array 719 720#undef TP_printk 721#define TP_printk(fmt, args...) "\"" fmt "\", " __stringify(args) 722 723#undef DECLARE_EVENT_CLASS 724#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 725_TRACE_PERF_PROTO(call, PARAMS(proto)); \ 726static char print_fmt_##call[] = print; \ 727static struct trace_event_class __used __refdata event_class_##call = { \ 728 .system = TRACE_SYSTEM_STRING, \ 729 .define_fields = trace_event_define_fields_##call, \ 730 .fields = LIST_HEAD_INIT(event_class_##call.fields),\ 731 .raw_init = trace_event_raw_init, \ 732 .probe = trace_event_raw_event_##call, \ 733 .reg = trace_event_reg, \ 734 _TRACE_PERF_INIT(call) \ 735}; 736 737#undef DEFINE_EVENT 738#define DEFINE_EVENT(template, call, proto, args) \ 739 \ 740static struct trace_event_call __used event_##call = { \ 741 .class = &event_class_##template, \ 742 { \ 743 .tp = &__tracepoint_##call, \ 744 }, \ 745 .event.funcs = &trace_event_type_funcs_##template, \ 746 .print_fmt = print_fmt_##template, \ 747 .flags = TRACE_EVENT_FL_TRACEPOINT, \ 748}; \ 749static struct trace_event_call __used \ 750__attribute__((section("_ftrace_events"))) *__event_##call = &event_##call 751 752#undef DEFINE_EVENT_PRINT 753#define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ 754 \ 755static char print_fmt_##call[] = print; \ 756 \ 757static struct trace_event_call __used event_##call = { \ 758 .class = &event_class_##template, \ 759 { \ 760 .tp = &__tracepoint_##call, \ 761 }, \ 762 .event.funcs = &trace_event_type_funcs_##call, \ 763 .print_fmt = print_fmt_##call, \ 764 .flags = TRACE_EVENT_FL_TRACEPOINT, \ 765}; \ 766static struct trace_event_call __used \ 767__attribute__((section("_ftrace_events"))) *__event_##call = &event_##call 768 769#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)