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.0-rc2 828 lines 24 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 ftrace_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/ftrace_event.h> 20 21/* 22 * DECLARE_EVENT_CLASS can be used to add a generic function 23 * handlers for events. That is, if all events have the same 24 * parameters and just have distinct trace points. 25 * Each tracepoint can be defined with DEFINE_EVENT and that 26 * will map the DECLARE_EVENT_CLASS to the tracepoint. 27 * 28 * TRACE_EVENT is a one to one mapping between tracepoint and template. 29 */ 30#undef TRACE_EVENT 31#define TRACE_EVENT(name, proto, args, tstruct, assign, print) \ 32 DECLARE_EVENT_CLASS(name, \ 33 PARAMS(proto), \ 34 PARAMS(args), \ 35 PARAMS(tstruct), \ 36 PARAMS(assign), \ 37 PARAMS(print)); \ 38 DEFINE_EVENT(name, name, PARAMS(proto), PARAMS(args)); 39 40 41#undef __field 42#define __field(type, item) type item; 43 44#undef __field_ext 45#define __field_ext(type, item, filter_type) type item; 46 47#undef __field_struct 48#define __field_struct(type, item) type item; 49 50#undef __field_struct_ext 51#define __field_struct_ext(type, item, filter_type) type item; 52 53#undef __array 54#define __array(type, item, len) type item[len]; 55 56#undef __dynamic_array 57#define __dynamic_array(type, item, len) u32 __data_loc_##item; 58 59#undef __string 60#define __string(item, src) __dynamic_array(char, item, -1) 61 62#undef __bitmask 63#define __bitmask(item, nr_bits) __dynamic_array(char, item, -1) 64 65#undef TP_STRUCT__entry 66#define TP_STRUCT__entry(args...) args 67 68#undef DECLARE_EVENT_CLASS 69#define DECLARE_EVENT_CLASS(name, proto, args, tstruct, assign, print) \ 70 struct ftrace_raw_##name { \ 71 struct trace_entry ent; \ 72 tstruct \ 73 char __data[0]; \ 74 }; \ 75 \ 76 static struct ftrace_event_class event_class_##name; 77 78#undef DEFINE_EVENT 79#define DEFINE_EVENT(template, name, proto, args) \ 80 static struct ftrace_event_call __used \ 81 __attribute__((__aligned__(4))) event_##name 82 83#undef DEFINE_EVENT_FN 84#define DEFINE_EVENT_FN(template, name, proto, args, reg, unreg) \ 85 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 86 87#undef DEFINE_EVENT_PRINT 88#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 89 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 90 91/* Callbacks are meaningless to ftrace. */ 92#undef TRACE_EVENT_FN 93#define TRACE_EVENT_FN(name, proto, args, tstruct, \ 94 assign, print, reg, unreg) \ 95 TRACE_EVENT(name, PARAMS(proto), PARAMS(args), \ 96 PARAMS(tstruct), PARAMS(assign), PARAMS(print)) \ 97 98#undef TRACE_EVENT_FLAGS 99#define TRACE_EVENT_FLAGS(name, value) \ 100 __TRACE_EVENT_FLAGS(name, value) 101 102#undef TRACE_EVENT_PERF_PERM 103#define TRACE_EVENT_PERF_PERM(name, expr...) \ 104 __TRACE_EVENT_PERF_PERM(name, expr) 105 106#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 107 108 109/* 110 * Stage 2 of the trace events. 111 * 112 * Include the following: 113 * 114 * struct ftrace_data_offsets_<call> { 115 * u32 <item1>; 116 * u32 <item2>; 117 * [...] 118 * }; 119 * 120 * The __dynamic_array() macro will create each u32 <item>, this is 121 * to keep the offset of each array from the beginning of the event. 122 * The size of an array is also encoded, in the higher 16 bits of <item>. 123 */ 124 125#undef __field 126#define __field(type, item) 127 128#undef __field_ext 129#define __field_ext(type, item, filter_type) 130 131#undef __field_struct 132#define __field_struct(type, item) 133 134#undef __field_struct_ext 135#define __field_struct_ext(type, item, filter_type) 136 137#undef __array 138#define __array(type, item, len) 139 140#undef __dynamic_array 141#define __dynamic_array(type, item, len) u32 item; 142 143#undef __string 144#define __string(item, src) __dynamic_array(char, item, -1) 145 146#undef __bitmask 147#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1) 148 149#undef DECLARE_EVENT_CLASS 150#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 151 struct ftrace_data_offsets_##call { \ 152 tstruct; \ 153 }; 154 155#undef DEFINE_EVENT 156#define DEFINE_EVENT(template, name, proto, args) 157 158#undef DEFINE_EVENT_PRINT 159#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 160 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 161 162#undef TRACE_EVENT_FLAGS 163#define TRACE_EVENT_FLAGS(event, flag) 164 165#undef TRACE_EVENT_PERF_PERM 166#define TRACE_EVENT_PERF_PERM(event, expr...) 167 168#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 169 170/* 171 * Stage 3 of the trace events. 172 * 173 * Override the macros in <trace/trace_events.h> to include the following: 174 * 175 * enum print_line_t 176 * ftrace_raw_output_<call>(struct trace_iterator *iter, int flags) 177 * { 178 * struct trace_seq *s = &iter->seq; 179 * struct ftrace_raw_<call> *field; <-- defined in stage 1 180 * struct trace_entry *entry; 181 * struct trace_seq *p = &iter->tmp_seq; 182 * int ret; 183 * 184 * entry = iter->ent; 185 * 186 * if (entry->type != event_<call>->event.type) { 187 * WARN_ON_ONCE(1); 188 * return TRACE_TYPE_UNHANDLED; 189 * } 190 * 191 * field = (typeof(field))entry; 192 * 193 * trace_seq_init(p); 194 * ret = trace_seq_printf(s, "%s: ", <call>); 195 * if (ret) 196 * ret = trace_seq_printf(s, <TP_printk> "\n"); 197 * if (!ret) 198 * return TRACE_TYPE_PARTIAL_LINE; 199 * 200 * return TRACE_TYPE_HANDLED; 201 * } 202 * 203 * This is the method used to print the raw event to the trace 204 * output format. Note, this is not needed if the data is read 205 * in binary. 206 */ 207 208#undef __entry 209#define __entry field 210 211#undef TP_printk 212#define TP_printk(fmt, args...) fmt "\n", args 213 214#undef __get_dynamic_array 215#define __get_dynamic_array(field) \ 216 ((void *)__entry + (__entry->__data_loc_##field & 0xffff)) 217 218#undef __get_dynamic_array_len 219#define __get_dynamic_array_len(field) \ 220 ((__entry->__data_loc_##field >> 16) & 0xffff) 221 222#undef __get_str 223#define __get_str(field) (char *)__get_dynamic_array(field) 224 225#undef __get_bitmask 226#define __get_bitmask(field) \ 227 ({ \ 228 void *__bitmask = __get_dynamic_array(field); \ 229 unsigned int __bitmask_size; \ 230 __bitmask_size = __get_dynamic_array_len(field); \ 231 ftrace_print_bitmask_seq(p, __bitmask, __bitmask_size); \ 232 }) 233 234#undef __print_flags 235#define __print_flags(flag, delim, flag_array...) \ 236 ({ \ 237 static const struct trace_print_flags __flags[] = \ 238 { flag_array, { -1, NULL }}; \ 239 ftrace_print_flags_seq(p, delim, flag, __flags); \ 240 }) 241 242#undef __print_symbolic 243#define __print_symbolic(value, symbol_array...) \ 244 ({ \ 245 static const struct trace_print_flags symbols[] = \ 246 { symbol_array, { -1, NULL }}; \ 247 ftrace_print_symbols_seq(p, value, symbols); \ 248 }) 249 250#undef __print_symbolic_u64 251#if BITS_PER_LONG == 32 252#define __print_symbolic_u64(value, symbol_array...) \ 253 ({ \ 254 static const struct trace_print_flags_u64 symbols[] = \ 255 { symbol_array, { -1, NULL } }; \ 256 ftrace_print_symbols_seq_u64(p, value, symbols); \ 257 }) 258#else 259#define __print_symbolic_u64(value, symbol_array...) \ 260 __print_symbolic(value, symbol_array) 261#endif 262 263#undef __print_hex 264#define __print_hex(buf, buf_len) ftrace_print_hex_seq(p, buf, buf_len) 265 266#undef __print_array 267#define __print_array(array, count, el_size) \ 268 ({ \ 269 BUILD_BUG_ON(el_size != 1 && el_size != 2 && \ 270 el_size != 4 && el_size != 8); \ 271 ftrace_print_array_seq(p, array, count, el_size); \ 272 }) 273 274#undef DECLARE_EVENT_CLASS 275#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 276static notrace enum print_line_t \ 277ftrace_raw_output_##call(struct trace_iterator *iter, int flags, \ 278 struct trace_event *trace_event) \ 279{ \ 280 struct trace_seq *s = &iter->seq; \ 281 struct trace_seq __maybe_unused *p = &iter->tmp_seq; \ 282 struct ftrace_raw_##call *field; \ 283 int ret; \ 284 \ 285 field = (typeof(field))iter->ent; \ 286 \ 287 ret = ftrace_raw_output_prep(iter, trace_event); \ 288 if (ret != TRACE_TYPE_HANDLED) \ 289 return ret; \ 290 \ 291 trace_seq_printf(s, print); \ 292 \ 293 return trace_handle_return(s); \ 294} \ 295static struct trace_event_functions ftrace_event_type_funcs_##call = { \ 296 .trace = ftrace_raw_output_##call, \ 297}; 298 299#undef DEFINE_EVENT_PRINT 300#define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ 301static notrace enum print_line_t \ 302ftrace_raw_output_##call(struct trace_iterator *iter, int flags, \ 303 struct trace_event *event) \ 304{ \ 305 struct ftrace_raw_##template *field; \ 306 struct trace_entry *entry; \ 307 struct trace_seq *p = &iter->tmp_seq; \ 308 \ 309 entry = iter->ent; \ 310 \ 311 if (entry->type != event_##call.event.type) { \ 312 WARN_ON_ONCE(1); \ 313 return TRACE_TYPE_UNHANDLED; \ 314 } \ 315 \ 316 field = (typeof(field))entry; \ 317 \ 318 trace_seq_init(p); \ 319 return ftrace_output_call(iter, #call, print); \ 320} \ 321static struct trace_event_functions ftrace_event_type_funcs_##call = { \ 322 .trace = ftrace_raw_output_##call, \ 323}; 324 325#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 326 327#undef __field_ext 328#define __field_ext(type, item, filter_type) \ 329 ret = trace_define_field(event_call, #type, #item, \ 330 offsetof(typeof(field), item), \ 331 sizeof(field.item), \ 332 is_signed_type(type), filter_type); \ 333 if (ret) \ 334 return ret; 335 336#undef __field_struct_ext 337#define __field_struct_ext(type, item, filter_type) \ 338 ret = trace_define_field(event_call, #type, #item, \ 339 offsetof(typeof(field), item), \ 340 sizeof(field.item), \ 341 0, filter_type); \ 342 if (ret) \ 343 return ret; 344 345#undef __field 346#define __field(type, item) __field_ext(type, item, FILTER_OTHER) 347 348#undef __field_struct 349#define __field_struct(type, item) __field_struct_ext(type, item, FILTER_OTHER) 350 351#undef __array 352#define __array(type, item, len) \ 353 do { \ 354 char *type_str = #type"["__stringify(len)"]"; \ 355 BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ 356 ret = trace_define_field(event_call, type_str, #item, \ 357 offsetof(typeof(field), item), \ 358 sizeof(field.item), \ 359 is_signed_type(type), FILTER_OTHER); \ 360 if (ret) \ 361 return ret; \ 362 } while (0); 363 364#undef __dynamic_array 365#define __dynamic_array(type, item, len) \ 366 ret = trace_define_field(event_call, "__data_loc " #type "[]", #item, \ 367 offsetof(typeof(field), __data_loc_##item), \ 368 sizeof(field.__data_loc_##item), \ 369 is_signed_type(type), FILTER_OTHER); 370 371#undef __string 372#define __string(item, src) __dynamic_array(char, item, -1) 373 374#undef __bitmask 375#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1) 376 377#undef DECLARE_EVENT_CLASS 378#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, func, print) \ 379static int notrace __init \ 380ftrace_define_fields_##call(struct ftrace_event_call *event_call) \ 381{ \ 382 struct ftrace_raw_##call field; \ 383 int ret; \ 384 \ 385 tstruct; \ 386 \ 387 return ret; \ 388} 389 390#undef DEFINE_EVENT 391#define DEFINE_EVENT(template, name, proto, args) 392 393#undef DEFINE_EVENT_PRINT 394#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 395 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 396 397#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 398 399/* 400 * remember the offset of each array from the beginning of the event. 401 */ 402 403#undef __entry 404#define __entry entry 405 406#undef __field 407#define __field(type, item) 408 409#undef __field_ext 410#define __field_ext(type, item, filter_type) 411 412#undef __field_struct 413#define __field_struct(type, item) 414 415#undef __field_struct_ext 416#define __field_struct_ext(type, item, filter_type) 417 418#undef __array 419#define __array(type, item, len) 420 421#undef __dynamic_array 422#define __dynamic_array(type, item, len) \ 423 __item_length = (len) * sizeof(type); \ 424 __data_offsets->item = __data_size + \ 425 offsetof(typeof(*entry), __data); \ 426 __data_offsets->item |= __item_length << 16; \ 427 __data_size += __item_length; 428 429#undef __string 430#define __string(item, src) __dynamic_array(char, item, \ 431 strlen((src) ? (const char *)(src) : "(null)") + 1) 432 433/* 434 * __bitmask_size_in_bytes_raw is the number of bytes needed to hold 435 * num_possible_cpus(). 436 */ 437#define __bitmask_size_in_bytes_raw(nr_bits) \ 438 (((nr_bits) + 7) / 8) 439 440#define __bitmask_size_in_longs(nr_bits) \ 441 ((__bitmask_size_in_bytes_raw(nr_bits) + \ 442 ((BITS_PER_LONG / 8) - 1)) / (BITS_PER_LONG / 8)) 443 444/* 445 * __bitmask_size_in_bytes is the number of bytes needed to hold 446 * num_possible_cpus() padded out to the nearest long. This is what 447 * is saved in the buffer, just to be consistent. 448 */ 449#define __bitmask_size_in_bytes(nr_bits) \ 450 (__bitmask_size_in_longs(nr_bits) * (BITS_PER_LONG / 8)) 451 452#undef __bitmask 453#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, \ 454 __bitmask_size_in_longs(nr_bits)) 455 456#undef DECLARE_EVENT_CLASS 457#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 458static inline notrace int ftrace_get_offsets_##call( \ 459 struct ftrace_data_offsets_##call *__data_offsets, proto) \ 460{ \ 461 int __data_size = 0; \ 462 int __maybe_unused __item_length; \ 463 struct ftrace_raw_##call __maybe_unused *entry; \ 464 \ 465 tstruct; \ 466 \ 467 return __data_size; \ 468} 469 470#undef DEFINE_EVENT 471#define DEFINE_EVENT(template, name, proto, args) 472 473#undef DEFINE_EVENT_PRINT 474#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 475 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 476 477#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 478 479/* 480 * Stage 4 of the trace events. 481 * 482 * Override the macros in <trace/trace_events.h> to include the following: 483 * 484 * For those macros defined with TRACE_EVENT: 485 * 486 * static struct ftrace_event_call event_<call>; 487 * 488 * static void ftrace_raw_event_<call>(void *__data, proto) 489 * { 490 * struct ftrace_event_file *ftrace_file = __data; 491 * struct ftrace_event_call *event_call = ftrace_file->event_call; 492 * struct ftrace_data_offsets_<call> __maybe_unused __data_offsets; 493 * unsigned long eflags = ftrace_file->flags; 494 * enum event_trigger_type __tt = ETT_NONE; 495 * struct ring_buffer_event *event; 496 * struct ftrace_raw_<call> *entry; <-- defined in stage 1 497 * struct ring_buffer *buffer; 498 * unsigned long irq_flags; 499 * int __data_size; 500 * int pc; 501 * 502 * if (!(eflags & FTRACE_EVENT_FL_TRIGGER_COND)) { 503 * if (eflags & FTRACE_EVENT_FL_TRIGGER_MODE) 504 * event_triggers_call(ftrace_file, NULL); 505 * if (eflags & FTRACE_EVENT_FL_SOFT_DISABLED) 506 * return; 507 * } 508 * 509 * local_save_flags(irq_flags); 510 * pc = preempt_count(); 511 * 512 * __data_size = ftrace_get_offsets_<call>(&__data_offsets, args); 513 * 514 * event = trace_event_buffer_lock_reserve(&buffer, ftrace_file, 515 * event_<call>->event.type, 516 * sizeof(*entry) + __data_size, 517 * irq_flags, pc); 518 * if (!event) 519 * return; 520 * entry = ring_buffer_event_data(event); 521 * 522 * { <assign>; } <-- Here we assign the entries by the __field and 523 * __array macros. 524 * 525 * if (eflags & FTRACE_EVENT_FL_TRIGGER_COND) 526 * __tt = event_triggers_call(ftrace_file, entry); 527 * 528 * if (test_bit(FTRACE_EVENT_FL_SOFT_DISABLED_BIT, 529 * &ftrace_file->flags)) 530 * ring_buffer_discard_commit(buffer, event); 531 * else if (!filter_check_discard(ftrace_file, entry, buffer, event)) 532 * trace_buffer_unlock_commit(buffer, event, irq_flags, pc); 533 * 534 * if (__tt) 535 * event_triggers_post_call(ftrace_file, __tt); 536 * } 537 * 538 * static struct trace_event ftrace_event_type_<call> = { 539 * .trace = ftrace_raw_output_<call>, <-- stage 2 540 * }; 541 * 542 * static const char print_fmt_<call>[] = <TP_printk>; 543 * 544 * static struct ftrace_event_class __used event_class_<template> = { 545 * .system = "<system>", 546 * .define_fields = ftrace_define_fields_<call>, 547 * .fields = LIST_HEAD_INIT(event_class_##call.fields), 548 * .raw_init = trace_event_raw_init, 549 * .probe = ftrace_raw_event_##call, 550 * .reg = ftrace_event_reg, 551 * }; 552 * 553 * static struct ftrace_event_call event_<call> = { 554 * .class = event_class_<template>, 555 * { 556 * .tp = &__tracepoint_<call>, 557 * }, 558 * .event = &ftrace_event_type_<call>, 559 * .print_fmt = print_fmt_<call>, 560 * .flags = TRACE_EVENT_FL_TRACEPOINT, 561 * }; 562 * // its only safe to use pointers when doing linker tricks to 563 * // create an array. 564 * static struct ftrace_event_call __used 565 * __attribute__((section("_ftrace_events"))) *__event_<call> = &event_<call>; 566 * 567 */ 568 569#ifdef CONFIG_PERF_EVENTS 570 571#define _TRACE_PERF_PROTO(call, proto) \ 572 static notrace void \ 573 perf_trace_##call(void *__data, proto); 574 575#define _TRACE_PERF_INIT(call) \ 576 .perf_probe = perf_trace_##call, 577 578#else 579#define _TRACE_PERF_PROTO(call, proto) 580#define _TRACE_PERF_INIT(call) 581#endif /* CONFIG_PERF_EVENTS */ 582 583#undef __entry 584#define __entry entry 585 586#undef __field 587#define __field(type, item) 588 589#undef __field_struct 590#define __field_struct(type, item) 591 592#undef __array 593#define __array(type, item, len) 594 595#undef __dynamic_array 596#define __dynamic_array(type, item, len) \ 597 __entry->__data_loc_##item = __data_offsets.item; 598 599#undef __string 600#define __string(item, src) __dynamic_array(char, item, -1) 601 602#undef __assign_str 603#define __assign_str(dst, src) \ 604 strcpy(__get_str(dst), (src) ? (const char *)(src) : "(null)"); 605 606#undef __bitmask 607#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1) 608 609#undef __get_bitmask 610#define __get_bitmask(field) (char *)__get_dynamic_array(field) 611 612#undef __assign_bitmask 613#define __assign_bitmask(dst, src, nr_bits) \ 614 memcpy(__get_bitmask(dst), (src), __bitmask_size_in_bytes(nr_bits)) 615 616#undef TP_fast_assign 617#define TP_fast_assign(args...) args 618 619#undef __perf_addr 620#define __perf_addr(a) (a) 621 622#undef __perf_count 623#define __perf_count(c) (c) 624 625#undef __perf_task 626#define __perf_task(t) (t) 627 628#undef DECLARE_EVENT_CLASS 629#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 630 \ 631static notrace void \ 632ftrace_raw_event_##call(void *__data, proto) \ 633{ \ 634 struct ftrace_event_file *ftrace_file = __data; \ 635 struct ftrace_data_offsets_##call __maybe_unused __data_offsets;\ 636 struct ftrace_event_buffer fbuffer; \ 637 struct ftrace_raw_##call *entry; \ 638 int __data_size; \ 639 \ 640 if (ftrace_trigger_soft_disabled(ftrace_file)) \ 641 return; \ 642 \ 643 __data_size = ftrace_get_offsets_##call(&__data_offsets, args); \ 644 \ 645 entry = ftrace_event_buffer_reserve(&fbuffer, ftrace_file, \ 646 sizeof(*entry) + __data_size); \ 647 \ 648 if (!entry) \ 649 return; \ 650 \ 651 tstruct \ 652 \ 653 { assign; } \ 654 \ 655 ftrace_event_buffer_commit(&fbuffer); \ 656} 657/* 658 * The ftrace_test_probe is compiled out, it is only here as a build time check 659 * to make sure that if the tracepoint handling changes, the ftrace probe will 660 * fail to compile unless it too is updated. 661 */ 662 663#undef DEFINE_EVENT 664#define DEFINE_EVENT(template, call, proto, args) \ 665static inline void ftrace_test_probe_##call(void) \ 666{ \ 667 check_trace_callback_type_##call(ftrace_raw_event_##template); \ 668} 669 670#undef DEFINE_EVENT_PRINT 671#define DEFINE_EVENT_PRINT(template, name, proto, args, print) 672 673#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 674 675#undef __entry 676#define __entry REC 677 678#undef __print_flags 679#undef __print_symbolic 680#undef __print_hex 681#undef __get_dynamic_array 682#undef __get_dynamic_array_len 683#undef __get_str 684#undef __get_bitmask 685#undef __print_array 686 687#undef TP_printk 688#define TP_printk(fmt, args...) "\"" fmt "\", " __stringify(args) 689 690#undef DECLARE_EVENT_CLASS 691#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 692_TRACE_PERF_PROTO(call, PARAMS(proto)); \ 693static const char print_fmt_##call[] = print; \ 694static struct ftrace_event_class __used __refdata event_class_##call = { \ 695 .system = __stringify(TRACE_SYSTEM), \ 696 .define_fields = ftrace_define_fields_##call, \ 697 .fields = LIST_HEAD_INIT(event_class_##call.fields),\ 698 .raw_init = trace_event_raw_init, \ 699 .probe = ftrace_raw_event_##call, \ 700 .reg = ftrace_event_reg, \ 701 _TRACE_PERF_INIT(call) \ 702}; 703 704#undef DEFINE_EVENT 705#define DEFINE_EVENT(template, call, proto, args) \ 706 \ 707static struct ftrace_event_call __used event_##call = { \ 708 .class = &event_class_##template, \ 709 { \ 710 .tp = &__tracepoint_##call, \ 711 }, \ 712 .event.funcs = &ftrace_event_type_funcs_##template, \ 713 .print_fmt = print_fmt_##template, \ 714 .flags = TRACE_EVENT_FL_TRACEPOINT, \ 715}; \ 716static struct ftrace_event_call __used \ 717__attribute__((section("_ftrace_events"))) *__event_##call = &event_##call 718 719#undef DEFINE_EVENT_PRINT 720#define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ 721 \ 722static const char print_fmt_##call[] = print; \ 723 \ 724static struct ftrace_event_call __used event_##call = { \ 725 .class = &event_class_##template, \ 726 { \ 727 .tp = &__tracepoint_##call, \ 728 }, \ 729 .event.funcs = &ftrace_event_type_funcs_##call, \ 730 .print_fmt = print_fmt_##call, \ 731 .flags = TRACE_EVENT_FL_TRACEPOINT, \ 732}; \ 733static struct ftrace_event_call __used \ 734__attribute__((section("_ftrace_events"))) *__event_##call = &event_##call 735 736#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 737 738 739#ifdef CONFIG_PERF_EVENTS 740 741#undef __entry 742#define __entry entry 743 744#undef __get_dynamic_array 745#define __get_dynamic_array(field) \ 746 ((void *)__entry + (__entry->__data_loc_##field & 0xffff)) 747 748#undef __get_dynamic_array_len 749#define __get_dynamic_array_len(field) \ 750 ((__entry->__data_loc_##field >> 16) & 0xffff) 751 752#undef __get_str 753#define __get_str(field) (char *)__get_dynamic_array(field) 754 755#undef __get_bitmask 756#define __get_bitmask(field) (char *)__get_dynamic_array(field) 757 758#undef __perf_addr 759#define __perf_addr(a) (__addr = (a)) 760 761#undef __perf_count 762#define __perf_count(c) (__count = (c)) 763 764#undef __perf_task 765#define __perf_task(t) (__task = (t)) 766 767#undef DECLARE_EVENT_CLASS 768#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 769static notrace void \ 770perf_trace_##call(void *__data, proto) \ 771{ \ 772 struct ftrace_event_call *event_call = __data; \ 773 struct ftrace_data_offsets_##call __maybe_unused __data_offsets;\ 774 struct ftrace_raw_##call *entry; \ 775 struct pt_regs *__regs; \ 776 u64 __addr = 0, __count = 1; \ 777 struct task_struct *__task = NULL; \ 778 struct hlist_head *head; \ 779 int __entry_size; \ 780 int __data_size; \ 781 int rctx; \ 782 \ 783 __data_size = ftrace_get_offsets_##call(&__data_offsets, args); \ 784 \ 785 head = this_cpu_ptr(event_call->perf_events); \ 786 if (__builtin_constant_p(!__task) && !__task && \ 787 hlist_empty(head)) \ 788 return; \ 789 \ 790 __entry_size = ALIGN(__data_size + sizeof(*entry) + sizeof(u32),\ 791 sizeof(u64)); \ 792 __entry_size -= sizeof(u32); \ 793 \ 794 entry = perf_trace_buf_prepare(__entry_size, \ 795 event_call->event.type, &__regs, &rctx); \ 796 if (!entry) \ 797 return; \ 798 \ 799 perf_fetch_caller_regs(__regs); \ 800 \ 801 tstruct \ 802 \ 803 { assign; } \ 804 \ 805 perf_trace_buf_submit(entry, __entry_size, rctx, __addr, \ 806 __count, __regs, head, __task); \ 807} 808 809/* 810 * This part is compiled out, it is only here as a build time check 811 * to make sure that if the tracepoint handling changes, the 812 * perf probe will fail to compile unless it too is updated. 813 */ 814#undef DEFINE_EVENT 815#define DEFINE_EVENT(template, call, proto, args) \ 816static inline void perf_test_probe_##call(void) \ 817{ \ 818 check_trace_callback_type_##call(perf_trace_##template); \ 819} 820 821 822#undef DEFINE_EVENT_PRINT 823#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 824 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 825 826#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 827#endif /* CONFIG_PERF_EVENTS */ 828