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-rc4 613 lines 19 kB view raw
1 2#ifndef _LINUX_FTRACE_EVENT_H 3#define _LINUX_FTRACE_EVENT_H 4 5#include <linux/ring_buffer.h> 6#include <linux/trace_seq.h> 7#include <linux/percpu.h> 8#include <linux/hardirq.h> 9#include <linux/perf_event.h> 10#include <linux/tracepoint.h> 11 12struct trace_array; 13struct trace_buffer; 14struct tracer; 15struct dentry; 16 17struct trace_print_flags { 18 unsigned long mask; 19 const char *name; 20}; 21 22struct trace_print_flags_u64 { 23 unsigned long long mask; 24 const char *name; 25}; 26 27const char *ftrace_print_flags_seq(struct trace_seq *p, const char *delim, 28 unsigned long flags, 29 const struct trace_print_flags *flag_array); 30 31const char *ftrace_print_symbols_seq(struct trace_seq *p, unsigned long val, 32 const struct trace_print_flags *symbol_array); 33 34#if BITS_PER_LONG == 32 35const char *ftrace_print_symbols_seq_u64(struct trace_seq *p, 36 unsigned long long val, 37 const struct trace_print_flags_u64 38 *symbol_array); 39#endif 40 41const char *ftrace_print_bitmask_seq(struct trace_seq *p, void *bitmask_ptr, 42 unsigned int bitmask_size); 43 44const char *ftrace_print_hex_seq(struct trace_seq *p, 45 const unsigned char *buf, int len); 46 47const char *ftrace_print_array_seq(struct trace_seq *p, 48 const void *buf, int buf_len, 49 size_t el_size); 50 51struct trace_iterator; 52struct trace_event; 53 54int ftrace_raw_output_prep(struct trace_iterator *iter, 55 struct trace_event *event); 56 57/* 58 * The trace entry - the most basic unit of tracing. This is what 59 * is printed in the end as a single line in the trace output, such as: 60 * 61 * bash-15816 [01] 235.197585: idle_cpu <- irq_enter 62 */ 63struct trace_entry { 64 unsigned short type; 65 unsigned char flags; 66 unsigned char preempt_count; 67 int pid; 68}; 69 70#define FTRACE_MAX_EVENT \ 71 ((1 << (sizeof(((struct trace_entry *)0)->type) * 8)) - 1) 72 73/* 74 * Trace iterator - used by printout routines who present trace 75 * results to users and which routines might sleep, etc: 76 */ 77struct trace_iterator { 78 struct trace_array *tr; 79 struct tracer *trace; 80 struct trace_buffer *trace_buffer; 81 void *private; 82 int cpu_file; 83 struct mutex mutex; 84 struct ring_buffer_iter **buffer_iter; 85 unsigned long iter_flags; 86 87 /* trace_seq for __print_flags() and __print_symbolic() etc. */ 88 struct trace_seq tmp_seq; 89 90 cpumask_var_t started; 91 92 /* it's true when current open file is snapshot */ 93 bool snapshot; 94 95 /* The below is zeroed out in pipe_read */ 96 struct trace_seq seq; 97 struct trace_entry *ent; 98 unsigned long lost_events; 99 int leftover; 100 int ent_size; 101 int cpu; 102 u64 ts; 103 104 loff_t pos; 105 long idx; 106 107 /* All new field here will be zeroed out in pipe_read */ 108}; 109 110enum trace_iter_flags { 111 TRACE_FILE_LAT_FMT = 1, 112 TRACE_FILE_ANNOTATE = 2, 113 TRACE_FILE_TIME_IN_NS = 4, 114}; 115 116 117typedef enum print_line_t (*trace_print_func)(struct trace_iterator *iter, 118 int flags, struct trace_event *event); 119 120struct trace_event_functions { 121 trace_print_func trace; 122 trace_print_func raw; 123 trace_print_func hex; 124 trace_print_func binary; 125}; 126 127struct trace_event { 128 struct hlist_node node; 129 struct list_head list; 130 int type; 131 struct trace_event_functions *funcs; 132}; 133 134extern int register_ftrace_event(struct trace_event *event); 135extern int unregister_ftrace_event(struct trace_event *event); 136 137/* Return values for print_line callback */ 138enum print_line_t { 139 TRACE_TYPE_PARTIAL_LINE = 0, /* Retry after flushing the seq */ 140 TRACE_TYPE_HANDLED = 1, 141 TRACE_TYPE_UNHANDLED = 2, /* Relay to other output functions */ 142 TRACE_TYPE_NO_CONSUME = 3 /* Handled but ask to not consume */ 143}; 144 145/* 146 * Several functions return TRACE_TYPE_PARTIAL_LINE if the trace_seq 147 * overflowed, and TRACE_TYPE_HANDLED otherwise. This helper function 148 * simplifies those functions and keeps them in sync. 149 */ 150static inline enum print_line_t trace_handle_return(struct trace_seq *s) 151{ 152 return trace_seq_has_overflowed(s) ? 153 TRACE_TYPE_PARTIAL_LINE : TRACE_TYPE_HANDLED; 154} 155 156void tracing_generic_entry_update(struct trace_entry *entry, 157 unsigned long flags, 158 int pc); 159struct ftrace_event_file; 160 161struct ring_buffer_event * 162trace_event_buffer_lock_reserve(struct ring_buffer **current_buffer, 163 struct ftrace_event_file *ftrace_file, 164 int type, unsigned long len, 165 unsigned long flags, int pc); 166struct ring_buffer_event * 167trace_current_buffer_lock_reserve(struct ring_buffer **current_buffer, 168 int type, unsigned long len, 169 unsigned long flags, int pc); 170void trace_current_buffer_unlock_commit(struct ring_buffer *buffer, 171 struct ring_buffer_event *event, 172 unsigned long flags, int pc); 173void trace_buffer_unlock_commit(struct ring_buffer *buffer, 174 struct ring_buffer_event *event, 175 unsigned long flags, int pc); 176void trace_buffer_unlock_commit_regs(struct ring_buffer *buffer, 177 struct ring_buffer_event *event, 178 unsigned long flags, int pc, 179 struct pt_regs *regs); 180void trace_current_buffer_discard_commit(struct ring_buffer *buffer, 181 struct ring_buffer_event *event); 182 183void tracing_record_cmdline(struct task_struct *tsk); 184 185int ftrace_output_call(struct trace_iterator *iter, char *name, char *fmt, ...); 186 187struct event_filter; 188 189enum trace_reg { 190 TRACE_REG_REGISTER, 191 TRACE_REG_UNREGISTER, 192#ifdef CONFIG_PERF_EVENTS 193 TRACE_REG_PERF_REGISTER, 194 TRACE_REG_PERF_UNREGISTER, 195 TRACE_REG_PERF_OPEN, 196 TRACE_REG_PERF_CLOSE, 197 TRACE_REG_PERF_ADD, 198 TRACE_REG_PERF_DEL, 199#endif 200}; 201 202struct ftrace_event_call; 203 204struct ftrace_event_class { 205 char *system; 206 void *probe; 207#ifdef CONFIG_PERF_EVENTS 208 void *perf_probe; 209#endif 210 int (*reg)(struct ftrace_event_call *event, 211 enum trace_reg type, void *data); 212 int (*define_fields)(struct ftrace_event_call *); 213 struct list_head *(*get_fields)(struct ftrace_event_call *); 214 struct list_head fields; 215 int (*raw_init)(struct ftrace_event_call *); 216}; 217 218extern int ftrace_event_reg(struct ftrace_event_call *event, 219 enum trace_reg type, void *data); 220 221int ftrace_output_event(struct trace_iterator *iter, struct ftrace_event_call *event, 222 char *fmt, ...); 223 224int ftrace_event_define_field(struct ftrace_event_call *call, 225 char *type, int len, char *item, int offset, 226 int field_size, int sign, int filter); 227 228struct ftrace_event_buffer { 229 struct ring_buffer *buffer; 230 struct ring_buffer_event *event; 231 struct ftrace_event_file *ftrace_file; 232 void *entry; 233 unsigned long flags; 234 int pc; 235}; 236 237void *ftrace_event_buffer_reserve(struct ftrace_event_buffer *fbuffer, 238 struct ftrace_event_file *ftrace_file, 239 unsigned long len); 240 241void ftrace_event_buffer_commit(struct ftrace_event_buffer *fbuffer); 242 243int ftrace_event_define_field(struct ftrace_event_call *call, 244 char *type, int len, char *item, int offset, 245 int field_size, int sign, int filter); 246 247enum { 248 TRACE_EVENT_FL_FILTERED_BIT, 249 TRACE_EVENT_FL_CAP_ANY_BIT, 250 TRACE_EVENT_FL_NO_SET_FILTER_BIT, 251 TRACE_EVENT_FL_IGNORE_ENABLE_BIT, 252 TRACE_EVENT_FL_WAS_ENABLED_BIT, 253 TRACE_EVENT_FL_USE_CALL_FILTER_BIT, 254 TRACE_EVENT_FL_TRACEPOINT_BIT, 255}; 256 257/* 258 * Event flags: 259 * FILTERED - The event has a filter attached 260 * CAP_ANY - Any user can enable for perf 261 * NO_SET_FILTER - Set when filter has error and is to be ignored 262 * IGNORE_ENABLE - For ftrace internal events, do not enable with debugfs file 263 * WAS_ENABLED - Set and stays set when an event was ever enabled 264 * (used for module unloading, if a module event is enabled, 265 * it is best to clear the buffers that used it). 266 * USE_CALL_FILTER - For ftrace internal events, don't use file filter 267 * TRACEPOINT - Event is a tracepoint 268 */ 269enum { 270 TRACE_EVENT_FL_FILTERED = (1 << TRACE_EVENT_FL_FILTERED_BIT), 271 TRACE_EVENT_FL_CAP_ANY = (1 << TRACE_EVENT_FL_CAP_ANY_BIT), 272 TRACE_EVENT_FL_NO_SET_FILTER = (1 << TRACE_EVENT_FL_NO_SET_FILTER_BIT), 273 TRACE_EVENT_FL_IGNORE_ENABLE = (1 << TRACE_EVENT_FL_IGNORE_ENABLE_BIT), 274 TRACE_EVENT_FL_WAS_ENABLED = (1 << TRACE_EVENT_FL_WAS_ENABLED_BIT), 275 TRACE_EVENT_FL_USE_CALL_FILTER = (1 << TRACE_EVENT_FL_USE_CALL_FILTER_BIT), 276 TRACE_EVENT_FL_TRACEPOINT = (1 << TRACE_EVENT_FL_TRACEPOINT_BIT), 277}; 278 279struct ftrace_event_call { 280 struct list_head list; 281 struct ftrace_event_class *class; 282 union { 283 char *name; 284 /* Set TRACE_EVENT_FL_TRACEPOINT flag when using "tp" */ 285 struct tracepoint *tp; 286 }; 287 struct trace_event event; 288 const char *print_fmt; 289 struct event_filter *filter; 290 void *mod; 291 void *data; 292 /* 293 * bit 0: filter_active 294 * bit 1: allow trace by non root (cap any) 295 * bit 2: failed to apply filter 296 * bit 3: ftrace internal event (do not enable) 297 * bit 4: Event was enabled by module 298 * bit 5: use call filter rather than file filter 299 * bit 6: Event is a tracepoint 300 */ 301 int flags; /* static flags of different events */ 302 303#ifdef CONFIG_PERF_EVENTS 304 int perf_refcount; 305 struct hlist_head __percpu *perf_events; 306 307 int (*perf_perm)(struct ftrace_event_call *, 308 struct perf_event *); 309#endif 310}; 311 312static inline const char * 313ftrace_event_name(struct ftrace_event_call *call) 314{ 315 if (call->flags & TRACE_EVENT_FL_TRACEPOINT) 316 return call->tp ? call->tp->name : NULL; 317 else 318 return call->name; 319} 320 321struct trace_array; 322struct ftrace_subsystem_dir; 323 324enum { 325 FTRACE_EVENT_FL_ENABLED_BIT, 326 FTRACE_EVENT_FL_RECORDED_CMD_BIT, 327 FTRACE_EVENT_FL_FILTERED_BIT, 328 FTRACE_EVENT_FL_NO_SET_FILTER_BIT, 329 FTRACE_EVENT_FL_SOFT_MODE_BIT, 330 FTRACE_EVENT_FL_SOFT_DISABLED_BIT, 331 FTRACE_EVENT_FL_TRIGGER_MODE_BIT, 332 FTRACE_EVENT_FL_TRIGGER_COND_BIT, 333}; 334 335/* 336 * Ftrace event file flags: 337 * ENABLED - The event is enabled 338 * RECORDED_CMD - The comms should be recorded at sched_switch 339 * FILTERED - The event has a filter attached 340 * NO_SET_FILTER - Set when filter has error and is to be ignored 341 * SOFT_MODE - The event is enabled/disabled by SOFT_DISABLED 342 * SOFT_DISABLED - When set, do not trace the event (even though its 343 * tracepoint may be enabled) 344 * TRIGGER_MODE - When set, invoke the triggers associated with the event 345 * TRIGGER_COND - When set, one or more triggers has an associated filter 346 */ 347enum { 348 FTRACE_EVENT_FL_ENABLED = (1 << FTRACE_EVENT_FL_ENABLED_BIT), 349 FTRACE_EVENT_FL_RECORDED_CMD = (1 << FTRACE_EVENT_FL_RECORDED_CMD_BIT), 350 FTRACE_EVENT_FL_FILTERED = (1 << FTRACE_EVENT_FL_FILTERED_BIT), 351 FTRACE_EVENT_FL_NO_SET_FILTER = (1 << FTRACE_EVENT_FL_NO_SET_FILTER_BIT), 352 FTRACE_EVENT_FL_SOFT_MODE = (1 << FTRACE_EVENT_FL_SOFT_MODE_BIT), 353 FTRACE_EVENT_FL_SOFT_DISABLED = (1 << FTRACE_EVENT_FL_SOFT_DISABLED_BIT), 354 FTRACE_EVENT_FL_TRIGGER_MODE = (1 << FTRACE_EVENT_FL_TRIGGER_MODE_BIT), 355 FTRACE_EVENT_FL_TRIGGER_COND = (1 << FTRACE_EVENT_FL_TRIGGER_COND_BIT), 356}; 357 358struct ftrace_event_file { 359 struct list_head list; 360 struct ftrace_event_call *event_call; 361 struct event_filter *filter; 362 struct dentry *dir; 363 struct trace_array *tr; 364 struct ftrace_subsystem_dir *system; 365 struct list_head triggers; 366 367 /* 368 * 32 bit flags: 369 * bit 0: enabled 370 * bit 1: enabled cmd record 371 * bit 2: enable/disable with the soft disable bit 372 * bit 3: soft disabled 373 * bit 4: trigger enabled 374 * 375 * Note: The bits must be set atomically to prevent races 376 * from other writers. Reads of flags do not need to be in 377 * sync as they occur in critical sections. But the way flags 378 * is currently used, these changes do not affect the code 379 * except that when a change is made, it may have a slight 380 * delay in propagating the changes to other CPUs due to 381 * caching and such. Which is mostly OK ;-) 382 */ 383 unsigned long flags; 384 atomic_t sm_ref; /* soft-mode reference counter */ 385 atomic_t tm_ref; /* trigger-mode reference counter */ 386}; 387 388#define __TRACE_EVENT_FLAGS(name, value) \ 389 static int __init trace_init_flags_##name(void) \ 390 { \ 391 event_##name.flags |= value; \ 392 return 0; \ 393 } \ 394 early_initcall(trace_init_flags_##name); 395 396#define __TRACE_EVENT_PERF_PERM(name, expr...) \ 397 static int perf_perm_##name(struct ftrace_event_call *tp_event, \ 398 struct perf_event *p_event) \ 399 { \ 400 return ({ expr; }); \ 401 } \ 402 static int __init trace_init_perf_perm_##name(void) \ 403 { \ 404 event_##name.perf_perm = &perf_perm_##name; \ 405 return 0; \ 406 } \ 407 early_initcall(trace_init_perf_perm_##name); 408 409#define PERF_MAX_TRACE_SIZE 2048 410 411#define MAX_FILTER_STR_VAL 256 /* Should handle KSYM_SYMBOL_LEN */ 412 413enum event_trigger_type { 414 ETT_NONE = (0), 415 ETT_TRACE_ONOFF = (1 << 0), 416 ETT_SNAPSHOT = (1 << 1), 417 ETT_STACKTRACE = (1 << 2), 418 ETT_EVENT_ENABLE = (1 << 3), 419}; 420 421extern int filter_match_preds(struct event_filter *filter, void *rec); 422 423extern int filter_check_discard(struct ftrace_event_file *file, void *rec, 424 struct ring_buffer *buffer, 425 struct ring_buffer_event *event); 426extern int call_filter_check_discard(struct ftrace_event_call *call, void *rec, 427 struct ring_buffer *buffer, 428 struct ring_buffer_event *event); 429extern enum event_trigger_type event_triggers_call(struct ftrace_event_file *file, 430 void *rec); 431extern void event_triggers_post_call(struct ftrace_event_file *file, 432 enum event_trigger_type tt); 433 434/** 435 * ftrace_trigger_soft_disabled - do triggers and test if soft disabled 436 * @file: The file pointer of the event to test 437 * 438 * If any triggers without filters are attached to this event, they 439 * will be called here. If the event is soft disabled and has no 440 * triggers that require testing the fields, it will return true, 441 * otherwise false. 442 */ 443static inline bool 444ftrace_trigger_soft_disabled(struct ftrace_event_file *file) 445{ 446 unsigned long eflags = file->flags; 447 448 if (!(eflags & FTRACE_EVENT_FL_TRIGGER_COND)) { 449 if (eflags & FTRACE_EVENT_FL_TRIGGER_MODE) 450 event_triggers_call(file, NULL); 451 if (eflags & FTRACE_EVENT_FL_SOFT_DISABLED) 452 return true; 453 } 454 return false; 455} 456 457/* 458 * Helper function for event_trigger_unlock_commit{_regs}(). 459 * If there are event triggers attached to this event that requires 460 * filtering against its fields, then they wil be called as the 461 * entry already holds the field information of the current event. 462 * 463 * It also checks if the event should be discarded or not. 464 * It is to be discarded if the event is soft disabled and the 465 * event was only recorded to process triggers, or if the event 466 * filter is active and this event did not match the filters. 467 * 468 * Returns true if the event is discarded, false otherwise. 469 */ 470static inline bool 471__event_trigger_test_discard(struct ftrace_event_file *file, 472 struct ring_buffer *buffer, 473 struct ring_buffer_event *event, 474 void *entry, 475 enum event_trigger_type *tt) 476{ 477 unsigned long eflags = file->flags; 478 479 if (eflags & FTRACE_EVENT_FL_TRIGGER_COND) 480 *tt = event_triggers_call(file, entry); 481 482 if (test_bit(FTRACE_EVENT_FL_SOFT_DISABLED_BIT, &file->flags)) 483 ring_buffer_discard_commit(buffer, event); 484 else if (!filter_check_discard(file, entry, buffer, event)) 485 return false; 486 487 return true; 488} 489 490/** 491 * event_trigger_unlock_commit - handle triggers and finish event commit 492 * @file: The file pointer assoctiated to the event 493 * @buffer: The ring buffer that the event is being written to 494 * @event: The event meta data in the ring buffer 495 * @entry: The event itself 496 * @irq_flags: The state of the interrupts at the start of the event 497 * @pc: The state of the preempt count at the start of the event. 498 * 499 * This is a helper function to handle triggers that require data 500 * from the event itself. It also tests the event against filters and 501 * if the event is soft disabled and should be discarded. 502 */ 503static inline void 504event_trigger_unlock_commit(struct ftrace_event_file *file, 505 struct ring_buffer *buffer, 506 struct ring_buffer_event *event, 507 void *entry, unsigned long irq_flags, int pc) 508{ 509 enum event_trigger_type tt = ETT_NONE; 510 511 if (!__event_trigger_test_discard(file, buffer, event, entry, &tt)) 512 trace_buffer_unlock_commit(buffer, event, irq_flags, pc); 513 514 if (tt) 515 event_triggers_post_call(file, tt); 516} 517 518/** 519 * event_trigger_unlock_commit_regs - handle triggers and finish event commit 520 * @file: The file pointer assoctiated to the event 521 * @buffer: The ring buffer that the event is being written to 522 * @event: The event meta data in the ring buffer 523 * @entry: The event itself 524 * @irq_flags: The state of the interrupts at the start of the event 525 * @pc: The state of the preempt count at the start of the event. 526 * 527 * This is a helper function to handle triggers that require data 528 * from the event itself. It also tests the event against filters and 529 * if the event is soft disabled and should be discarded. 530 * 531 * Same as event_trigger_unlock_commit() but calls 532 * trace_buffer_unlock_commit_regs() instead of trace_buffer_unlock_commit(). 533 */ 534static inline void 535event_trigger_unlock_commit_regs(struct ftrace_event_file *file, 536 struct ring_buffer *buffer, 537 struct ring_buffer_event *event, 538 void *entry, unsigned long irq_flags, int pc, 539 struct pt_regs *regs) 540{ 541 enum event_trigger_type tt = ETT_NONE; 542 543 if (!__event_trigger_test_discard(file, buffer, event, entry, &tt)) 544 trace_buffer_unlock_commit_regs(buffer, event, 545 irq_flags, pc, regs); 546 547 if (tt) 548 event_triggers_post_call(file, tt); 549} 550 551enum { 552 FILTER_OTHER = 0, 553 FILTER_STATIC_STRING, 554 FILTER_DYN_STRING, 555 FILTER_PTR_STRING, 556 FILTER_TRACE_FN, 557}; 558 559extern int trace_event_raw_init(struct ftrace_event_call *call); 560extern int trace_define_field(struct ftrace_event_call *call, const char *type, 561 const char *name, int offset, int size, 562 int is_signed, int filter_type); 563extern int trace_add_event_call(struct ftrace_event_call *call); 564extern int trace_remove_event_call(struct ftrace_event_call *call); 565 566#define is_signed_type(type) (((type)(-1)) < (type)1) 567 568int trace_set_clr_event(const char *system, const char *event, int set); 569 570/* 571 * The double __builtin_constant_p is because gcc will give us an error 572 * if we try to allocate the static variable to fmt if it is not a 573 * constant. Even with the outer if statement optimizing out. 574 */ 575#define event_trace_printk(ip, fmt, args...) \ 576do { \ 577 __trace_printk_check_format(fmt, ##args); \ 578 tracing_record_cmdline(current); \ 579 if (__builtin_constant_p(fmt)) { \ 580 static const char *trace_printk_fmt \ 581 __attribute__((section("__trace_printk_fmt"))) = \ 582 __builtin_constant_p(fmt) ? fmt : NULL; \ 583 \ 584 __trace_bprintk(ip, trace_printk_fmt, ##args); \ 585 } else \ 586 __trace_printk(ip, fmt, ##args); \ 587} while (0) 588 589#ifdef CONFIG_PERF_EVENTS 590struct perf_event; 591 592DECLARE_PER_CPU(struct pt_regs, perf_trace_regs); 593 594extern int perf_trace_init(struct perf_event *event); 595extern void perf_trace_destroy(struct perf_event *event); 596extern int perf_trace_add(struct perf_event *event, int flags); 597extern void perf_trace_del(struct perf_event *event, int flags); 598extern int ftrace_profile_set_filter(struct perf_event *event, int event_id, 599 char *filter_str); 600extern void ftrace_profile_free_filter(struct perf_event *event); 601extern void *perf_trace_buf_prepare(int size, unsigned short type, 602 struct pt_regs **regs, int *rctxp); 603 604static inline void 605perf_trace_buf_submit(void *raw_data, int size, int rctx, u64 addr, 606 u64 count, struct pt_regs *regs, void *head, 607 struct task_struct *task) 608{ 609 perf_tp_event(addr, count, raw_data, size, regs, head, rctx, task); 610} 611#endif 612 613#endif /* _LINUX_FTRACE_EVENT_H */