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 v3.11-rc4 706 lines 20 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 __array 48#define __array(type, item, len) type item[len]; 49 50#undef __dynamic_array 51#define __dynamic_array(type, item, len) u32 __data_loc_##item; 52 53#undef __string 54#define __string(item, src) __dynamic_array(char, item, -1) 55 56#undef TP_STRUCT__entry 57#define TP_STRUCT__entry(args...) args 58 59#undef DECLARE_EVENT_CLASS 60#define DECLARE_EVENT_CLASS(name, proto, args, tstruct, assign, print) \ 61 struct ftrace_raw_##name { \ 62 struct trace_entry ent; \ 63 tstruct \ 64 char __data[0]; \ 65 }; \ 66 \ 67 static struct ftrace_event_class event_class_##name; 68 69#undef DEFINE_EVENT 70#define DEFINE_EVENT(template, name, proto, args) \ 71 static struct ftrace_event_call __used \ 72 __attribute__((__aligned__(4))) event_##name 73 74#undef DEFINE_EVENT_FN 75#define DEFINE_EVENT_FN(template, name, proto, args, reg, unreg) \ 76 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 77 78#undef DEFINE_EVENT_PRINT 79#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 80 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 81 82/* Callbacks are meaningless to ftrace. */ 83#undef TRACE_EVENT_FN 84#define TRACE_EVENT_FN(name, proto, args, tstruct, \ 85 assign, print, reg, unreg) \ 86 TRACE_EVENT(name, PARAMS(proto), PARAMS(args), \ 87 PARAMS(tstruct), PARAMS(assign), PARAMS(print)) \ 88 89#undef TRACE_EVENT_FLAGS 90#define TRACE_EVENT_FLAGS(name, value) \ 91 __TRACE_EVENT_FLAGS(name, value) 92 93#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 94 95 96/* 97 * Stage 2 of the trace events. 98 * 99 * Include the following: 100 * 101 * struct ftrace_data_offsets_<call> { 102 * u32 <item1>; 103 * u32 <item2>; 104 * [...] 105 * }; 106 * 107 * The __dynamic_array() macro will create each u32 <item>, this is 108 * to keep the offset of each array from the beginning of the event. 109 * The size of an array is also encoded, in the higher 16 bits of <item>. 110 */ 111 112#undef __field 113#define __field(type, item) 114 115#undef __field_ext 116#define __field_ext(type, item, filter_type) 117 118#undef __array 119#define __array(type, item, len) 120 121#undef __dynamic_array 122#define __dynamic_array(type, item, len) u32 item; 123 124#undef __string 125#define __string(item, src) __dynamic_array(char, item, -1) 126 127#undef DECLARE_EVENT_CLASS 128#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 129 struct ftrace_data_offsets_##call { \ 130 tstruct; \ 131 }; 132 133#undef DEFINE_EVENT 134#define DEFINE_EVENT(template, name, proto, args) 135 136#undef DEFINE_EVENT_PRINT 137#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 138 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 139 140#undef TRACE_EVENT_FLAGS 141#define TRACE_EVENT_FLAGS(event, flag) 142 143#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 144 145/* 146 * Stage 3 of the trace events. 147 * 148 * Override the macros in <trace/trace_events.h> to include the following: 149 * 150 * enum print_line_t 151 * ftrace_raw_output_<call>(struct trace_iterator *iter, int flags) 152 * { 153 * struct trace_seq *s = &iter->seq; 154 * struct ftrace_raw_<call> *field; <-- defined in stage 1 155 * struct trace_entry *entry; 156 * struct trace_seq *p = &iter->tmp_seq; 157 * int ret; 158 * 159 * entry = iter->ent; 160 * 161 * if (entry->type != event_<call>->event.type) { 162 * WARN_ON_ONCE(1); 163 * return TRACE_TYPE_UNHANDLED; 164 * } 165 * 166 * field = (typeof(field))entry; 167 * 168 * trace_seq_init(p); 169 * ret = trace_seq_printf(s, "%s: ", <call>); 170 * if (ret) 171 * ret = trace_seq_printf(s, <TP_printk> "\n"); 172 * if (!ret) 173 * return TRACE_TYPE_PARTIAL_LINE; 174 * 175 * return TRACE_TYPE_HANDLED; 176 * } 177 * 178 * This is the method used to print the raw event to the trace 179 * output format. Note, this is not needed if the data is read 180 * in binary. 181 */ 182 183#undef __entry 184#define __entry field 185 186#undef TP_printk 187#define TP_printk(fmt, args...) fmt "\n", args 188 189#undef __get_dynamic_array 190#define __get_dynamic_array(field) \ 191 ((void *)__entry + (__entry->__data_loc_##field & 0xffff)) 192 193#undef __get_str 194#define __get_str(field) (char *)__get_dynamic_array(field) 195 196#undef __print_flags 197#define __print_flags(flag, delim, flag_array...) \ 198 ({ \ 199 static const struct trace_print_flags __flags[] = \ 200 { flag_array, { -1, NULL }}; \ 201 ftrace_print_flags_seq(p, delim, flag, __flags); \ 202 }) 203 204#undef __print_symbolic 205#define __print_symbolic(value, symbol_array...) \ 206 ({ \ 207 static const struct trace_print_flags symbols[] = \ 208 { symbol_array, { -1, NULL }}; \ 209 ftrace_print_symbols_seq(p, value, symbols); \ 210 }) 211 212#undef __print_symbolic_u64 213#if BITS_PER_LONG == 32 214#define __print_symbolic_u64(value, symbol_array...) \ 215 ({ \ 216 static const struct trace_print_flags_u64 symbols[] = \ 217 { symbol_array, { -1, NULL } }; \ 218 ftrace_print_symbols_seq_u64(p, value, symbols); \ 219 }) 220#else 221#define __print_symbolic_u64(value, symbol_array...) \ 222 __print_symbolic(value, symbol_array) 223#endif 224 225#undef __print_hex 226#define __print_hex(buf, buf_len) ftrace_print_hex_seq(p, buf, buf_len) 227 228#undef DECLARE_EVENT_CLASS 229#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 230static notrace enum print_line_t \ 231ftrace_raw_output_##call(struct trace_iterator *iter, int flags, \ 232 struct trace_event *trace_event) \ 233{ \ 234 struct trace_seq *s = &iter->seq; \ 235 struct trace_seq __maybe_unused *p = &iter->tmp_seq; \ 236 struct ftrace_raw_##call *field; \ 237 int ret; \ 238 \ 239 field = (typeof(field))iter->ent; \ 240 \ 241 ret = ftrace_raw_output_prep(iter, trace_event); \ 242 if (ret) \ 243 return ret; \ 244 \ 245 ret = trace_seq_printf(s, print); \ 246 if (!ret) \ 247 return TRACE_TYPE_PARTIAL_LINE; \ 248 \ 249 return TRACE_TYPE_HANDLED; \ 250} \ 251static struct trace_event_functions ftrace_event_type_funcs_##call = { \ 252 .trace = ftrace_raw_output_##call, \ 253}; 254 255#undef DEFINE_EVENT_PRINT 256#define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ 257static notrace enum print_line_t \ 258ftrace_raw_output_##call(struct trace_iterator *iter, int flags, \ 259 struct trace_event *event) \ 260{ \ 261 struct trace_seq *s = &iter->seq; \ 262 struct ftrace_raw_##template *field; \ 263 struct trace_entry *entry; \ 264 struct trace_seq *p = &iter->tmp_seq; \ 265 int ret; \ 266 \ 267 entry = iter->ent; \ 268 \ 269 if (entry->type != event_##call.event.type) { \ 270 WARN_ON_ONCE(1); \ 271 return TRACE_TYPE_UNHANDLED; \ 272 } \ 273 \ 274 field = (typeof(field))entry; \ 275 \ 276 trace_seq_init(p); \ 277 ret = trace_seq_printf(s, "%s: ", #call); \ 278 if (ret) \ 279 ret = trace_seq_printf(s, print); \ 280 if (!ret) \ 281 return TRACE_TYPE_PARTIAL_LINE; \ 282 \ 283 return TRACE_TYPE_HANDLED; \ 284} \ 285static struct trace_event_functions ftrace_event_type_funcs_##call = { \ 286 .trace = ftrace_raw_output_##call, \ 287}; 288 289#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 290 291#undef __field_ext 292#define __field_ext(type, item, filter_type) \ 293 ret = trace_define_field(event_call, #type, #item, \ 294 offsetof(typeof(field), item), \ 295 sizeof(field.item), \ 296 is_signed_type(type), filter_type); \ 297 if (ret) \ 298 return ret; 299 300#undef __field 301#define __field(type, item) __field_ext(type, item, FILTER_OTHER) 302 303#undef __array 304#define __array(type, item, len) \ 305 do { \ 306 mutex_lock(&event_storage_mutex); \ 307 BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ 308 snprintf(event_storage, sizeof(event_storage), \ 309 "%s[%d]", #type, len); \ 310 ret = trace_define_field(event_call, event_storage, #item, \ 311 offsetof(typeof(field), item), \ 312 sizeof(field.item), \ 313 is_signed_type(type), FILTER_OTHER); \ 314 mutex_unlock(&event_storage_mutex); \ 315 if (ret) \ 316 return ret; \ 317 } while (0); 318 319#undef __dynamic_array 320#define __dynamic_array(type, item, len) \ 321 ret = trace_define_field(event_call, "__data_loc " #type "[]", #item, \ 322 offsetof(typeof(field), __data_loc_##item), \ 323 sizeof(field.__data_loc_##item), \ 324 is_signed_type(type), FILTER_OTHER); 325 326#undef __string 327#define __string(item, src) __dynamic_array(char, item, -1) 328 329#undef DECLARE_EVENT_CLASS 330#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, func, print) \ 331static int notrace __init \ 332ftrace_define_fields_##call(struct ftrace_event_call *event_call) \ 333{ \ 334 struct ftrace_raw_##call field; \ 335 int ret; \ 336 \ 337 tstruct; \ 338 \ 339 return ret; \ 340} 341 342#undef DEFINE_EVENT 343#define DEFINE_EVENT(template, name, proto, args) 344 345#undef DEFINE_EVENT_PRINT 346#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 347 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 348 349#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 350 351/* 352 * remember the offset of each array from the beginning of the event. 353 */ 354 355#undef __entry 356#define __entry entry 357 358#undef __field 359#define __field(type, item) 360 361#undef __field_ext 362#define __field_ext(type, item, filter_type) 363 364#undef __array 365#define __array(type, item, len) 366 367#undef __dynamic_array 368#define __dynamic_array(type, item, len) \ 369 __data_offsets->item = __data_size + \ 370 offsetof(typeof(*entry), __data); \ 371 __data_offsets->item |= (len * sizeof(type)) << 16; \ 372 __data_size += (len) * sizeof(type); 373 374#undef __string 375#define __string(item, src) __dynamic_array(char, item, strlen(src) + 1) 376 377#undef DECLARE_EVENT_CLASS 378#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 379static inline notrace int ftrace_get_offsets_##call( \ 380 struct ftrace_data_offsets_##call *__data_offsets, proto) \ 381{ \ 382 int __data_size = 0; \ 383 struct ftrace_raw_##call __maybe_unused *entry; \ 384 \ 385 tstruct; \ 386 \ 387 return __data_size; \ 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 * Stage 4 of the trace events. 401 * 402 * Override the macros in <trace/trace_events.h> to include the following: 403 * 404 * For those macros defined with TRACE_EVENT: 405 * 406 * static struct ftrace_event_call event_<call>; 407 * 408 * static void ftrace_raw_event_<call>(void *__data, proto) 409 * { 410 * struct ftrace_event_file *ftrace_file = __data; 411 * struct ftrace_event_call *event_call = ftrace_file->event_call; 412 * struct ftrace_data_offsets_<call> __maybe_unused __data_offsets; 413 * struct ring_buffer_event *event; 414 * struct ftrace_raw_<call> *entry; <-- defined in stage 1 415 * struct ring_buffer *buffer; 416 * unsigned long irq_flags; 417 * int __data_size; 418 * int pc; 419 * 420 * if (test_bit(FTRACE_EVENT_FL_SOFT_DISABLED_BIT, 421 * &ftrace_file->flags)) 422 * return; 423 * 424 * local_save_flags(irq_flags); 425 * pc = preempt_count(); 426 * 427 * __data_size = ftrace_get_offsets_<call>(&__data_offsets, args); 428 * 429 * event = trace_event_buffer_lock_reserve(&buffer, ftrace_file, 430 * event_<call>->event.type, 431 * sizeof(*entry) + __data_size, 432 * irq_flags, pc); 433 * if (!event) 434 * return; 435 * entry = ring_buffer_event_data(event); 436 * 437 * { <assign>; } <-- Here we assign the entries by the __field and 438 * __array macros. 439 * 440 * if (!filter_current_check_discard(buffer, event_call, entry, event)) 441 * trace_nowake_buffer_unlock_commit(buffer, 442 * event, irq_flags, pc); 443 * } 444 * 445 * static struct trace_event ftrace_event_type_<call> = { 446 * .trace = ftrace_raw_output_<call>, <-- stage 2 447 * }; 448 * 449 * static const char print_fmt_<call>[] = <TP_printk>; 450 * 451 * static struct ftrace_event_class __used event_class_<template> = { 452 * .system = "<system>", 453 * .define_fields = ftrace_define_fields_<call>, 454 * .fields = LIST_HEAD_INIT(event_class_##call.fields), 455 * .raw_init = trace_event_raw_init, 456 * .probe = ftrace_raw_event_##call, 457 * .reg = ftrace_event_reg, 458 * }; 459 * 460 * static struct ftrace_event_call event_<call> = { 461 * .name = "<call>", 462 * .class = event_class_<template>, 463 * .event = &ftrace_event_type_<call>, 464 * .print_fmt = print_fmt_<call>, 465 * }; 466 * // its only safe to use pointers when doing linker tricks to 467 * // create an array. 468 * static struct ftrace_event_call __used 469 * __attribute__((section("_ftrace_events"))) *__event_<call> = &event_<call>; 470 * 471 */ 472 473#ifdef CONFIG_PERF_EVENTS 474 475#define _TRACE_PERF_PROTO(call, proto) \ 476 static notrace void \ 477 perf_trace_##call(void *__data, proto); 478 479#define _TRACE_PERF_INIT(call) \ 480 .perf_probe = perf_trace_##call, 481 482#else 483#define _TRACE_PERF_PROTO(call, proto) 484#define _TRACE_PERF_INIT(call) 485#endif /* CONFIG_PERF_EVENTS */ 486 487#undef __entry 488#define __entry entry 489 490#undef __field 491#define __field(type, item) 492 493#undef __array 494#define __array(type, item, len) 495 496#undef __dynamic_array 497#define __dynamic_array(type, item, len) \ 498 __entry->__data_loc_##item = __data_offsets.item; 499 500#undef __string 501#define __string(item, src) __dynamic_array(char, item, -1) \ 502 503#undef __assign_str 504#define __assign_str(dst, src) \ 505 strcpy(__get_str(dst), src); 506 507#undef TP_fast_assign 508#define TP_fast_assign(args...) args 509 510#undef TP_perf_assign 511#define TP_perf_assign(args...) 512 513#undef DECLARE_EVENT_CLASS 514#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 515 \ 516static notrace void \ 517ftrace_raw_event_##call(void *__data, proto) \ 518{ \ 519 struct ftrace_event_file *ftrace_file = __data; \ 520 struct ftrace_event_call *event_call = ftrace_file->event_call; \ 521 struct ftrace_data_offsets_##call __maybe_unused __data_offsets;\ 522 struct ring_buffer_event *event; \ 523 struct ftrace_raw_##call *entry; \ 524 struct ring_buffer *buffer; \ 525 unsigned long irq_flags; \ 526 int __data_size; \ 527 int pc; \ 528 \ 529 if (test_bit(FTRACE_EVENT_FL_SOFT_DISABLED_BIT, \ 530 &ftrace_file->flags)) \ 531 return; \ 532 \ 533 local_save_flags(irq_flags); \ 534 pc = preempt_count(); \ 535 \ 536 __data_size = ftrace_get_offsets_##call(&__data_offsets, args); \ 537 \ 538 event = trace_event_buffer_lock_reserve(&buffer, ftrace_file, \ 539 event_call->event.type, \ 540 sizeof(*entry) + __data_size, \ 541 irq_flags, pc); \ 542 if (!event) \ 543 return; \ 544 entry = ring_buffer_event_data(event); \ 545 \ 546 tstruct \ 547 \ 548 { assign; } \ 549 \ 550 if (!filter_current_check_discard(buffer, event_call, entry, event)) \ 551 trace_buffer_unlock_commit(buffer, event, irq_flags, pc); \ 552} 553/* 554 * The ftrace_test_probe is compiled out, it is only here as a build time check 555 * to make sure that if the tracepoint handling changes, the ftrace probe will 556 * fail to compile unless it too is updated. 557 */ 558 559#undef DEFINE_EVENT 560#define DEFINE_EVENT(template, call, proto, args) \ 561static inline void ftrace_test_probe_##call(void) \ 562{ \ 563 check_trace_callback_type_##call(ftrace_raw_event_##template); \ 564} 565 566#undef DEFINE_EVENT_PRINT 567#define DEFINE_EVENT_PRINT(template, name, proto, args, print) 568 569#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 570 571#undef __entry 572#define __entry REC 573 574#undef __print_flags 575#undef __print_symbolic 576#undef __print_hex 577#undef __get_dynamic_array 578#undef __get_str 579 580#undef TP_printk 581#define TP_printk(fmt, args...) "\"" fmt "\", " __stringify(args) 582 583#undef DECLARE_EVENT_CLASS 584#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 585_TRACE_PERF_PROTO(call, PARAMS(proto)); \ 586static const char print_fmt_##call[] = print; \ 587static struct ftrace_event_class __used __refdata event_class_##call = { \ 588 .system = __stringify(TRACE_SYSTEM), \ 589 .define_fields = ftrace_define_fields_##call, \ 590 .fields = LIST_HEAD_INIT(event_class_##call.fields),\ 591 .raw_init = trace_event_raw_init, \ 592 .probe = ftrace_raw_event_##call, \ 593 .reg = ftrace_event_reg, \ 594 _TRACE_PERF_INIT(call) \ 595}; 596 597#undef DEFINE_EVENT 598#define DEFINE_EVENT(template, call, proto, args) \ 599 \ 600static struct ftrace_event_call __used event_##call = { \ 601 .name = #call, \ 602 .class = &event_class_##template, \ 603 .event.funcs = &ftrace_event_type_funcs_##template, \ 604 .print_fmt = print_fmt_##template, \ 605}; \ 606static struct ftrace_event_call __used \ 607__attribute__((section("_ftrace_events"))) *__event_##call = &event_##call 608 609#undef DEFINE_EVENT_PRINT 610#define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ 611 \ 612static const char print_fmt_##call[] = print; \ 613 \ 614static struct ftrace_event_call __used event_##call = { \ 615 .name = #call, \ 616 .class = &event_class_##template, \ 617 .event.funcs = &ftrace_event_type_funcs_##call, \ 618 .print_fmt = print_fmt_##call, \ 619}; \ 620static struct ftrace_event_call __used \ 621__attribute__((section("_ftrace_events"))) *__event_##call = &event_##call 622 623#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 624 625 626#ifdef CONFIG_PERF_EVENTS 627 628#undef __entry 629#define __entry entry 630 631#undef __get_dynamic_array 632#define __get_dynamic_array(field) \ 633 ((void *)__entry + (__entry->__data_loc_##field & 0xffff)) 634 635#undef __get_str 636#define __get_str(field) (char *)__get_dynamic_array(field) 637 638#undef __perf_addr 639#define __perf_addr(a) __addr = (a) 640 641#undef __perf_count 642#define __perf_count(c) __count = (c) 643 644#undef __perf_task 645#define __perf_task(t) __task = (t) 646 647#undef TP_perf_assign 648#define TP_perf_assign(args...) args 649 650#undef DECLARE_EVENT_CLASS 651#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 652static notrace void \ 653perf_trace_##call(void *__data, proto) \ 654{ \ 655 struct ftrace_event_call *event_call = __data; \ 656 struct ftrace_data_offsets_##call __maybe_unused __data_offsets;\ 657 struct ftrace_raw_##call *entry; \ 658 struct pt_regs __regs; \ 659 u64 __addr = 0, __count = 1; \ 660 struct task_struct *__task = NULL; \ 661 struct hlist_head *head; \ 662 int __entry_size; \ 663 int __data_size; \ 664 int rctx; \ 665 \ 666 perf_fetch_caller_regs(&__regs); \ 667 \ 668 __data_size = ftrace_get_offsets_##call(&__data_offsets, args); \ 669 __entry_size = ALIGN(__data_size + sizeof(*entry) + sizeof(u32),\ 670 sizeof(u64)); \ 671 __entry_size -= sizeof(u32); \ 672 \ 673 entry = (struct ftrace_raw_##call *)perf_trace_buf_prepare( \ 674 __entry_size, event_call->event.type, &__regs, &rctx); \ 675 if (!entry) \ 676 return; \ 677 \ 678 tstruct \ 679 \ 680 { assign; } \ 681 \ 682 head = this_cpu_ptr(event_call->perf_events); \ 683 perf_trace_buf_submit(entry, __entry_size, rctx, __addr, \ 684 __count, &__regs, head, __task); \ 685} 686 687/* 688 * This part is compiled out, it is only here as a build time check 689 * to make sure that if the tracepoint handling changes, the 690 * perf probe will fail to compile unless it too is updated. 691 */ 692#undef DEFINE_EVENT 693#define DEFINE_EVENT(template, call, proto, args) \ 694static inline void perf_test_probe_##call(void) \ 695{ \ 696 check_trace_callback_type_##call(perf_trace_##template); \ 697} 698 699 700#undef DEFINE_EVENT_PRINT 701#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 702 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 703 704#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 705#endif /* CONFIG_PERF_EVENTS */ 706