0001
0002
0003 #ifndef _LINUX_KERNEL_TRACE_H
0004 #define _LINUX_KERNEL_TRACE_H
0005
0006 #include <linux/fs.h>
0007 #include <linux/atomic.h>
0008 #include <linux/sched.h>
0009 #include <linux/clocksource.h>
0010 #include <linux/ring_buffer.h>
0011 #include <linux/mmiotrace.h>
0012 #include <linux/tracepoint.h>
0013 #include <linux/ftrace.h>
0014 #include <linux/trace.h>
0015 #include <linux/hw_breakpoint.h>
0016 #include <linux/trace_seq.h>
0017 #include <linux/trace_events.h>
0018 #include <linux/compiler.h>
0019 #include <linux/glob.h>
0020 #include <linux/irq_work.h>
0021 #include <linux/workqueue.h>
0022 #include <linux/ctype.h>
0023 #include <linux/once_lite.h>
0024
0025 #include "pid_list.h"
0026
0027 #ifdef CONFIG_FTRACE_SYSCALLS
0028 #include <asm/unistd.h> /* For NR_SYSCALLS */
0029 #include <asm/syscall.h> /* some archs define it here */
0030 #endif
0031
0032 #define TRACE_MODE_WRITE 0640
0033 #define TRACE_MODE_READ 0440
0034
0035 enum trace_type {
0036 __TRACE_FIRST_TYPE = 0,
0037
0038 TRACE_FN,
0039 TRACE_CTX,
0040 TRACE_WAKE,
0041 TRACE_STACK,
0042 TRACE_PRINT,
0043 TRACE_BPRINT,
0044 TRACE_MMIO_RW,
0045 TRACE_MMIO_MAP,
0046 TRACE_BRANCH,
0047 TRACE_GRAPH_RET,
0048 TRACE_GRAPH_ENT,
0049 TRACE_USER_STACK,
0050 TRACE_BLK,
0051 TRACE_BPUTS,
0052 TRACE_HWLAT,
0053 TRACE_OSNOISE,
0054 TRACE_TIMERLAT,
0055 TRACE_RAW_DATA,
0056 TRACE_FUNC_REPEATS,
0057
0058 __TRACE_LAST_TYPE,
0059 };
0060
0061
0062 #undef __field
0063 #define __field(type, item) type item;
0064
0065 #undef __field_fn
0066 #define __field_fn(type, item) type item;
0067
0068 #undef __field_struct
0069 #define __field_struct(type, item) __field(type, item)
0070
0071 #undef __field_desc
0072 #define __field_desc(type, container, item)
0073
0074 #undef __field_packed
0075 #define __field_packed(type, container, item)
0076
0077 #undef __array
0078 #define __array(type, item, size) type item[size];
0079
0080 #undef __array_desc
0081 #define __array_desc(type, container, item, size)
0082
0083 #undef __dynamic_array
0084 #define __dynamic_array(type, item) type item[];
0085
0086 #undef __rel_dynamic_array
0087 #define __rel_dynamic_array(type, item) type item[];
0088
0089 #undef F_STRUCT
0090 #define F_STRUCT(args...) args
0091
0092 #undef FTRACE_ENTRY
0093 #define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \
0094 struct struct_name { \
0095 struct trace_entry ent; \
0096 tstruct \
0097 }
0098
0099 #undef FTRACE_ENTRY_DUP
0100 #define FTRACE_ENTRY_DUP(name, name_struct, id, tstruct, printk)
0101
0102 #undef FTRACE_ENTRY_REG
0103 #define FTRACE_ENTRY_REG(name, struct_name, id, tstruct, print, regfn) \
0104 FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print))
0105
0106 #undef FTRACE_ENTRY_PACKED
0107 #define FTRACE_ENTRY_PACKED(name, struct_name, id, tstruct, print) \
0108 FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print)) __packed
0109
0110 #include "trace_entries.h"
0111
0112
0113 #define MEM_FAIL(condition, fmt, ...) \
0114 DO_ONCE_LITE_IF(condition, pr_err, "ERROR: " fmt, ##__VA_ARGS__)
0115
0116
0117
0118
0119
0120 struct syscall_trace_enter {
0121 struct trace_entry ent;
0122 int nr;
0123 unsigned long args[];
0124 };
0125
0126 struct syscall_trace_exit {
0127 struct trace_entry ent;
0128 int nr;
0129 long ret;
0130 };
0131
0132 struct kprobe_trace_entry_head {
0133 struct trace_entry ent;
0134 unsigned long ip;
0135 };
0136
0137 struct eprobe_trace_entry_head {
0138 struct trace_entry ent;
0139 };
0140
0141 struct kretprobe_trace_entry_head {
0142 struct trace_entry ent;
0143 unsigned long func;
0144 unsigned long ret_ip;
0145 };
0146
0147 #define TRACE_BUF_SIZE 1024
0148
0149 struct trace_array;
0150
0151
0152
0153
0154
0155
0156 struct trace_array_cpu {
0157 atomic_t disabled;
0158 void *buffer_page;
0159
0160 unsigned long entries;
0161 unsigned long saved_latency;
0162 unsigned long critical_start;
0163 unsigned long critical_end;
0164 unsigned long critical_sequence;
0165 unsigned long nice;
0166 unsigned long policy;
0167 unsigned long rt_priority;
0168 unsigned long skipped_entries;
0169 u64 preempt_timestamp;
0170 pid_t pid;
0171 kuid_t uid;
0172 char comm[TASK_COMM_LEN];
0173
0174 #ifdef CONFIG_FUNCTION_TRACER
0175 int ftrace_ignore_pid;
0176 #endif
0177 bool ignore_pid;
0178 };
0179
0180 struct tracer;
0181 struct trace_option_dentry;
0182
0183 struct array_buffer {
0184 struct trace_array *tr;
0185 struct trace_buffer *buffer;
0186 struct trace_array_cpu __percpu *data;
0187 u64 time_start;
0188 int cpu;
0189 };
0190
0191 #define TRACE_FLAGS_MAX_SIZE 32
0192
0193 struct trace_options {
0194 struct tracer *tracer;
0195 struct trace_option_dentry *topts;
0196 };
0197
0198 struct trace_pid_list *trace_pid_list_alloc(void);
0199 void trace_pid_list_free(struct trace_pid_list *pid_list);
0200 bool trace_pid_list_is_set(struct trace_pid_list *pid_list, unsigned int pid);
0201 int trace_pid_list_set(struct trace_pid_list *pid_list, unsigned int pid);
0202 int trace_pid_list_clear(struct trace_pid_list *pid_list, unsigned int pid);
0203 int trace_pid_list_first(struct trace_pid_list *pid_list, unsigned int *pid);
0204 int trace_pid_list_next(struct trace_pid_list *pid_list, unsigned int pid,
0205 unsigned int *next);
0206
0207 enum {
0208 TRACE_PIDS = BIT(0),
0209 TRACE_NO_PIDS = BIT(1),
0210 };
0211
0212 static inline bool pid_type_enabled(int type, struct trace_pid_list *pid_list,
0213 struct trace_pid_list *no_pid_list)
0214 {
0215
0216 return ((type & TRACE_PIDS) && pid_list) ||
0217 ((type & TRACE_NO_PIDS) && no_pid_list);
0218 }
0219
0220 static inline bool still_need_pid_events(int type, struct trace_pid_list *pid_list,
0221 struct trace_pid_list *no_pid_list)
0222 {
0223
0224
0225
0226
0227 return (!(type & TRACE_PIDS) && pid_list) ||
0228 (!(type & TRACE_NO_PIDS) && no_pid_list);
0229 }
0230
0231 typedef bool (*cond_update_fn_t)(struct trace_array *tr, void *cond_data);
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271 struct cond_snapshot {
0272 void *cond_data;
0273 cond_update_fn_t update;
0274 };
0275
0276
0277
0278
0279
0280 struct trace_func_repeats {
0281 unsigned long ip;
0282 unsigned long parent_ip;
0283 unsigned long count;
0284 u64 ts_last_call;
0285 };
0286
0287
0288
0289
0290
0291
0292 struct trace_array {
0293 struct list_head list;
0294 char *name;
0295 struct array_buffer array_buffer;
0296 #ifdef CONFIG_TRACER_MAX_TRACE
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308 struct array_buffer max_buffer;
0309 bool allocated_snapshot;
0310 #endif
0311 #if defined(CONFIG_TRACER_MAX_TRACE) || defined(CONFIG_HWLAT_TRACER) \
0312 || defined(CONFIG_OSNOISE_TRACER)
0313 unsigned long max_latency;
0314 #ifdef CONFIG_FSNOTIFY
0315 struct dentry *d_max_latency;
0316 struct work_struct fsnotify_work;
0317 struct irq_work fsnotify_irqwork;
0318 #endif
0319 #endif
0320 struct trace_pid_list __rcu *filtered_pids;
0321 struct trace_pid_list __rcu *filtered_no_pids;
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335 arch_spinlock_t max_lock;
0336 int buffer_disabled;
0337 #ifdef CONFIG_FTRACE_SYSCALLS
0338 int sys_refcount_enter;
0339 int sys_refcount_exit;
0340 struct trace_event_file __rcu *enter_syscall_files[NR_syscalls];
0341 struct trace_event_file __rcu *exit_syscall_files[NR_syscalls];
0342 #endif
0343 int stop_count;
0344 int clock_id;
0345 int nr_topts;
0346 bool clear_trace;
0347 int buffer_percent;
0348 unsigned int n_err_log_entries;
0349 struct tracer *current_trace;
0350 unsigned int trace_flags;
0351 unsigned char trace_flags_index[TRACE_FLAGS_MAX_SIZE];
0352 unsigned int flags;
0353 raw_spinlock_t start_lock;
0354 struct list_head err_log;
0355 struct dentry *dir;
0356 struct dentry *options;
0357 struct dentry *percpu_dir;
0358 struct dentry *event_dir;
0359 struct trace_options *topts;
0360 struct list_head systems;
0361 struct list_head events;
0362 struct trace_event_file *trace_marker_file;
0363 cpumask_var_t tracing_cpumask;
0364 int ref;
0365 int trace_ref;
0366 #ifdef CONFIG_FUNCTION_TRACER
0367 struct ftrace_ops *ops;
0368 struct trace_pid_list __rcu *function_pids;
0369 struct trace_pid_list __rcu *function_no_pids;
0370 #ifdef CONFIG_DYNAMIC_FTRACE
0371
0372 struct list_head func_probes;
0373 struct list_head mod_trace;
0374 struct list_head mod_notrace;
0375 #endif
0376
0377 int function_enabled;
0378 #endif
0379 int no_filter_buffering_ref;
0380 struct list_head hist_vars;
0381 #ifdef CONFIG_TRACER_SNAPSHOT
0382 struct cond_snapshot *cond_snapshot;
0383 #endif
0384 struct trace_func_repeats __percpu *last_func_repeats;
0385 };
0386
0387 enum {
0388 TRACE_ARRAY_FL_GLOBAL = (1 << 0)
0389 };
0390
0391 extern struct list_head ftrace_trace_arrays;
0392
0393 extern struct mutex trace_types_lock;
0394
0395 extern int trace_array_get(struct trace_array *tr);
0396 extern int tracing_check_open_get_tr(struct trace_array *tr);
0397 extern struct trace_array *trace_array_find(const char *instance);
0398 extern struct trace_array *trace_array_find_get(const char *instance);
0399
0400 extern u64 tracing_event_time_stamp(struct trace_buffer *buffer, struct ring_buffer_event *rbe);
0401 extern int tracing_set_filter_buffering(struct trace_array *tr, bool set);
0402 extern int tracing_set_clock(struct trace_array *tr, const char *clockstr);
0403
0404 extern bool trace_clock_in_ns(struct trace_array *tr);
0405
0406
0407
0408
0409
0410 static inline struct trace_array *top_trace_array(void)
0411 {
0412 struct trace_array *tr;
0413
0414 if (list_empty(&ftrace_trace_arrays))
0415 return NULL;
0416
0417 tr = list_entry(ftrace_trace_arrays.prev,
0418 typeof(*tr), list);
0419 WARN_ON(!(tr->flags & TRACE_ARRAY_FL_GLOBAL));
0420 return tr;
0421 }
0422
0423 #define FTRACE_CMP_TYPE(var, type) \
0424 __builtin_types_compatible_p(typeof(var), type *)
0425
0426 #undef IF_ASSIGN
0427 #define IF_ASSIGN(var, entry, etype, id) \
0428 if (FTRACE_CMP_TYPE(var, etype)) { \
0429 var = (typeof(var))(entry); \
0430 WARN_ON(id != 0 && (entry)->type != id); \
0431 break; \
0432 }
0433
0434
0435 extern void __ftrace_bad_type(void);
0436
0437
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
0450 #define trace_assign_type(var, ent) \
0451 do { \
0452 IF_ASSIGN(var, ent, struct ftrace_entry, TRACE_FN); \
0453 IF_ASSIGN(var, ent, struct ctx_switch_entry, 0); \
0454 IF_ASSIGN(var, ent, struct stack_entry, TRACE_STACK); \
0455 IF_ASSIGN(var, ent, struct userstack_entry, TRACE_USER_STACK);\
0456 IF_ASSIGN(var, ent, struct print_entry, TRACE_PRINT); \
0457 IF_ASSIGN(var, ent, struct bprint_entry, TRACE_BPRINT); \
0458 IF_ASSIGN(var, ent, struct bputs_entry, TRACE_BPUTS); \
0459 IF_ASSIGN(var, ent, struct hwlat_entry, TRACE_HWLAT); \
0460 IF_ASSIGN(var, ent, struct osnoise_entry, TRACE_OSNOISE);\
0461 IF_ASSIGN(var, ent, struct timerlat_entry, TRACE_TIMERLAT);\
0462 IF_ASSIGN(var, ent, struct raw_data_entry, TRACE_RAW_DATA);\
0463 IF_ASSIGN(var, ent, struct trace_mmiotrace_rw, \
0464 TRACE_MMIO_RW); \
0465 IF_ASSIGN(var, ent, struct trace_mmiotrace_map, \
0466 TRACE_MMIO_MAP); \
0467 IF_ASSIGN(var, ent, struct trace_branch, TRACE_BRANCH); \
0468 IF_ASSIGN(var, ent, struct ftrace_graph_ent_entry, \
0469 TRACE_GRAPH_ENT); \
0470 IF_ASSIGN(var, ent, struct ftrace_graph_ret_entry, \
0471 TRACE_GRAPH_RET); \
0472 IF_ASSIGN(var, ent, struct func_repeats_entry, \
0473 TRACE_FUNC_REPEATS); \
0474 __ftrace_bad_type(); \
0475 } while (0)
0476
0477
0478
0479
0480
0481
0482 struct tracer_opt {
0483 const char *name;
0484 u32 bit;
0485 };
0486
0487
0488
0489
0490
0491 struct tracer_flags {
0492 u32 val;
0493 struct tracer_opt *opts;
0494 struct tracer *trace;
0495 };
0496
0497
0498 #define TRACER_OPT(s, b) .name = #s, .bit = b
0499
0500
0501 struct trace_option_dentry {
0502 struct tracer_opt *opt;
0503 struct tracer_flags *flags;
0504 struct trace_array *tr;
0505 struct dentry *entry;
0506 };
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528 struct tracer {
0529 const char *name;
0530 int (*init)(struct trace_array *tr);
0531 void (*reset)(struct trace_array *tr);
0532 void (*start)(struct trace_array *tr);
0533 void (*stop)(struct trace_array *tr);
0534 int (*update_thresh)(struct trace_array *tr);
0535 void (*open)(struct trace_iterator *iter);
0536 void (*pipe_open)(struct trace_iterator *iter);
0537 void (*close)(struct trace_iterator *iter);
0538 void (*pipe_close)(struct trace_iterator *iter);
0539 ssize_t (*read)(struct trace_iterator *iter,
0540 struct file *filp, char __user *ubuf,
0541 size_t cnt, loff_t *ppos);
0542 ssize_t (*splice_read)(struct trace_iterator *iter,
0543 struct file *filp,
0544 loff_t *ppos,
0545 struct pipe_inode_info *pipe,
0546 size_t len,
0547 unsigned int flags);
0548 #ifdef CONFIG_FTRACE_STARTUP_TEST
0549 int (*selftest)(struct tracer *trace,
0550 struct trace_array *tr);
0551 #endif
0552 void (*print_header)(struct seq_file *m);
0553 enum print_line_t (*print_line)(struct trace_iterator *iter);
0554
0555 int (*set_flag)(struct trace_array *tr,
0556 u32 old_flags, u32 bit, int set);
0557
0558 int (*flag_changed)(struct trace_array *tr,
0559 u32 mask, int set);
0560 struct tracer *next;
0561 struct tracer_flags *flags;
0562 int enabled;
0563 bool print_max;
0564 bool allow_instances;
0565 #ifdef CONFIG_TRACER_MAX_TRACE
0566 bool use_max_tr;
0567 #endif
0568
0569 bool noboot;
0570 };
0571
0572 static inline struct ring_buffer_iter *
0573 trace_buffer_iter(struct trace_iterator *iter, int cpu)
0574 {
0575 return iter->buffer_iter ? iter->buffer_iter[cpu] : NULL;
0576 }
0577
0578 int tracer_init(struct tracer *t, struct trace_array *tr);
0579 int tracing_is_enabled(void);
0580 void tracing_reset_online_cpus(struct array_buffer *buf);
0581 void tracing_reset_current(int cpu);
0582 void tracing_reset_all_online_cpus(void);
0583 int tracing_open_generic(struct inode *inode, struct file *filp);
0584 int tracing_open_generic_tr(struct inode *inode, struct file *filp);
0585 bool tracing_is_disabled(void);
0586 bool tracer_tracing_is_on(struct trace_array *tr);
0587 void tracer_tracing_on(struct trace_array *tr);
0588 void tracer_tracing_off(struct trace_array *tr);
0589 struct dentry *trace_create_file(const char *name,
0590 umode_t mode,
0591 struct dentry *parent,
0592 void *data,
0593 const struct file_operations *fops);
0594
0595 int tracing_init_dentry(void);
0596
0597 struct ring_buffer_event;
0598
0599 struct ring_buffer_event *
0600 trace_buffer_lock_reserve(struct trace_buffer *buffer,
0601 int type,
0602 unsigned long len,
0603 unsigned int trace_ctx);
0604
0605 struct trace_entry *tracing_get_trace_entry(struct trace_array *tr,
0606 struct trace_array_cpu *data);
0607
0608 struct trace_entry *trace_find_next_entry(struct trace_iterator *iter,
0609 int *ent_cpu, u64 *ent_ts);
0610
0611 void trace_buffer_unlock_commit_nostack(struct trace_buffer *buffer,
0612 struct ring_buffer_event *event);
0613
0614 bool trace_is_tracepoint_string(const char *str);
0615 const char *trace_event_format(struct trace_iterator *iter, const char *fmt);
0616 void trace_check_vprintf(struct trace_iterator *iter, const char *fmt,
0617 va_list ap);
0618
0619 int trace_empty(struct trace_iterator *iter);
0620
0621 void *trace_find_next_entry_inc(struct trace_iterator *iter);
0622
0623 void trace_init_global_iter(struct trace_iterator *iter);
0624
0625 void tracing_iter_reset(struct trace_iterator *iter, int cpu);
0626
0627 unsigned long trace_total_entries_cpu(struct trace_array *tr, int cpu);
0628 unsigned long trace_total_entries(struct trace_array *tr);
0629
0630 void trace_function(struct trace_array *tr,
0631 unsigned long ip,
0632 unsigned long parent_ip,
0633 unsigned int trace_ctx);
0634 void trace_graph_function(struct trace_array *tr,
0635 unsigned long ip,
0636 unsigned long parent_ip,
0637 unsigned int trace_ctx);
0638 void trace_latency_header(struct seq_file *m);
0639 void trace_default_header(struct seq_file *m);
0640 void print_trace_header(struct seq_file *m, struct trace_iterator *iter);
0641
0642 void trace_graph_return(struct ftrace_graph_ret *trace);
0643 int trace_graph_entry(struct ftrace_graph_ent *trace);
0644 void set_graph_array(struct trace_array *tr);
0645
0646 void tracing_start_cmdline_record(void);
0647 void tracing_stop_cmdline_record(void);
0648 void tracing_start_tgid_record(void);
0649 void tracing_stop_tgid_record(void);
0650
0651 int register_tracer(struct tracer *type);
0652 int is_tracing_stopped(void);
0653
0654 loff_t tracing_lseek(struct file *file, loff_t offset, int whence);
0655
0656 extern cpumask_var_t __read_mostly tracing_buffer_mask;
0657
0658 #define for_each_tracing_cpu(cpu) \
0659 for_each_cpu(cpu, tracing_buffer_mask)
0660
0661 extern unsigned long nsecs_to_usecs(unsigned long nsecs);
0662
0663 extern unsigned long tracing_thresh;
0664
0665
0666
0667 extern int pid_max;
0668
0669 bool trace_find_filtered_pid(struct trace_pid_list *filtered_pids,
0670 pid_t search_pid);
0671 bool trace_ignore_this_task(struct trace_pid_list *filtered_pids,
0672 struct trace_pid_list *filtered_no_pids,
0673 struct task_struct *task);
0674 void trace_filter_add_remove_task(struct trace_pid_list *pid_list,
0675 struct task_struct *self,
0676 struct task_struct *task);
0677 void *trace_pid_next(struct trace_pid_list *pid_list, void *v, loff_t *pos);
0678 void *trace_pid_start(struct trace_pid_list *pid_list, loff_t *pos);
0679 int trace_pid_show(struct seq_file *m, void *v);
0680 void trace_free_pid_list(struct trace_pid_list *pid_list);
0681 int trace_pid_write(struct trace_pid_list *filtered_pids,
0682 struct trace_pid_list **new_pid_list,
0683 const char __user *ubuf, size_t cnt);
0684
0685 #ifdef CONFIG_TRACER_MAX_TRACE
0686 void update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu,
0687 void *cond_data);
0688 void update_max_tr_single(struct trace_array *tr,
0689 struct task_struct *tsk, int cpu);
0690 #endif
0691
0692 #if (defined(CONFIG_TRACER_MAX_TRACE) || defined(CONFIG_HWLAT_TRACER) \
0693 || defined(CONFIG_OSNOISE_TRACER)) && defined(CONFIG_FSNOTIFY)
0694 #define LATENCY_FS_NOTIFY
0695 #endif
0696
0697 #ifdef LATENCY_FS_NOTIFY
0698 void latency_fsnotify(struct trace_array *tr);
0699 #else
0700 static inline void latency_fsnotify(struct trace_array *tr) { }
0701 #endif
0702
0703 #ifdef CONFIG_STACKTRACE
0704 void __trace_stack(struct trace_array *tr, unsigned int trace_ctx, int skip);
0705 #else
0706 static inline void __trace_stack(struct trace_array *tr, unsigned int trace_ctx,
0707 int skip)
0708 {
0709 }
0710 #endif
0711
0712 void trace_last_func_repeats(struct trace_array *tr,
0713 struct trace_func_repeats *last_info,
0714 unsigned int trace_ctx);
0715
0716 extern u64 ftrace_now(int cpu);
0717
0718 extern void trace_find_cmdline(int pid, char comm[]);
0719 extern int trace_find_tgid(int pid);
0720 extern void trace_event_follow_fork(struct trace_array *tr, bool enable);
0721
0722 #ifdef CONFIG_DYNAMIC_FTRACE
0723 extern unsigned long ftrace_update_tot_cnt;
0724 extern unsigned long ftrace_number_of_pages;
0725 extern unsigned long ftrace_number_of_groups;
0726 void ftrace_init_trace_array(struct trace_array *tr);
0727 #else
0728 static inline void ftrace_init_trace_array(struct trace_array *tr) { }
0729 #endif
0730 #define DYN_FTRACE_TEST_NAME trace_selftest_dynamic_test_func
0731 extern int DYN_FTRACE_TEST_NAME(void);
0732 #define DYN_FTRACE_TEST_NAME2 trace_selftest_dynamic_test_func2
0733 extern int DYN_FTRACE_TEST_NAME2(void);
0734
0735 extern bool ring_buffer_expanded;
0736 extern bool tracing_selftest_disabled;
0737
0738 #ifdef CONFIG_FTRACE_STARTUP_TEST
0739 extern void __init disable_tracing_selftest(const char *reason);
0740
0741 extern int trace_selftest_startup_function(struct tracer *trace,
0742 struct trace_array *tr);
0743 extern int trace_selftest_startup_function_graph(struct tracer *trace,
0744 struct trace_array *tr);
0745 extern int trace_selftest_startup_irqsoff(struct tracer *trace,
0746 struct trace_array *tr);
0747 extern int trace_selftest_startup_preemptoff(struct tracer *trace,
0748 struct trace_array *tr);
0749 extern int trace_selftest_startup_preemptirqsoff(struct tracer *trace,
0750 struct trace_array *tr);
0751 extern int trace_selftest_startup_wakeup(struct tracer *trace,
0752 struct trace_array *tr);
0753 extern int trace_selftest_startup_nop(struct tracer *trace,
0754 struct trace_array *tr);
0755 extern int trace_selftest_startup_branch(struct tracer *trace,
0756 struct trace_array *tr);
0757
0758
0759
0760
0761
0762 #define __tracer_data __refdata
0763 #else
0764 static inline void __init disable_tracing_selftest(const char *reason)
0765 {
0766 }
0767
0768 #define __tracer_data __read_mostly
0769 #endif
0770
0771 extern void *head_page(struct trace_array_cpu *data);
0772 extern unsigned long long ns2usecs(u64 nsec);
0773 extern int
0774 trace_vbprintk(unsigned long ip, const char *fmt, va_list args);
0775 extern int
0776 trace_vprintk(unsigned long ip, const char *fmt, va_list args);
0777 extern int
0778 trace_array_vprintk(struct trace_array *tr,
0779 unsigned long ip, const char *fmt, va_list args);
0780 int trace_array_printk_buf(struct trace_buffer *buffer,
0781 unsigned long ip, const char *fmt, ...);
0782 void trace_printk_seq(struct trace_seq *s);
0783 enum print_line_t print_trace_line(struct trace_iterator *iter);
0784
0785 extern char trace_find_mark(unsigned long long duration);
0786
0787 struct ftrace_hash;
0788
0789 struct ftrace_mod_load {
0790 struct list_head list;
0791 char *func;
0792 char *module;
0793 int enable;
0794 };
0795
0796 enum {
0797 FTRACE_HASH_FL_MOD = (1 << 0),
0798 };
0799
0800 struct ftrace_hash {
0801 unsigned long size_bits;
0802 struct hlist_head *buckets;
0803 unsigned long count;
0804 unsigned long flags;
0805 struct rcu_head rcu;
0806 };
0807
0808 struct ftrace_func_entry *
0809 ftrace_lookup_ip(struct ftrace_hash *hash, unsigned long ip);
0810
0811 static __always_inline bool ftrace_hash_empty(struct ftrace_hash *hash)
0812 {
0813 return !hash || !(hash->count || (hash->flags & FTRACE_HASH_FL_MOD));
0814 }
0815
0816
0817 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
0818
0819
0820 #define TRACE_GRAPH_PRINT_OVERRUN 0x1
0821 #define TRACE_GRAPH_PRINT_CPU 0x2
0822 #define TRACE_GRAPH_PRINT_OVERHEAD 0x4
0823 #define TRACE_GRAPH_PRINT_PROC 0x8
0824 #define TRACE_GRAPH_PRINT_DURATION 0x10
0825 #define TRACE_GRAPH_PRINT_ABS_TIME 0x20
0826 #define TRACE_GRAPH_PRINT_REL_TIME 0x40
0827 #define TRACE_GRAPH_PRINT_IRQS 0x80
0828 #define TRACE_GRAPH_PRINT_TAIL 0x100
0829 #define TRACE_GRAPH_SLEEP_TIME 0x200
0830 #define TRACE_GRAPH_GRAPH_TIME 0x400
0831 #define TRACE_GRAPH_PRINT_FILL_SHIFT 28
0832 #define TRACE_GRAPH_PRINT_FILL_MASK (0x3 << TRACE_GRAPH_PRINT_FILL_SHIFT)
0833
0834 extern void ftrace_graph_sleep_time_control(bool enable);
0835
0836 #ifdef CONFIG_FUNCTION_PROFILER
0837 extern void ftrace_graph_graph_time_control(bool enable);
0838 #else
0839 static inline void ftrace_graph_graph_time_control(bool enable) { }
0840 #endif
0841
0842 extern enum print_line_t
0843 print_graph_function_flags(struct trace_iterator *iter, u32 flags);
0844 extern void print_graph_headers_flags(struct seq_file *s, u32 flags);
0845 extern void
0846 trace_print_graph_duration(unsigned long long duration, struct trace_seq *s);
0847 extern void graph_trace_open(struct trace_iterator *iter);
0848 extern void graph_trace_close(struct trace_iterator *iter);
0849 extern int __trace_graph_entry(struct trace_array *tr,
0850 struct ftrace_graph_ent *trace,
0851 unsigned int trace_ctx);
0852 extern void __trace_graph_return(struct trace_array *tr,
0853 struct ftrace_graph_ret *trace,
0854 unsigned int trace_ctx);
0855
0856 #ifdef CONFIG_DYNAMIC_FTRACE
0857 extern struct ftrace_hash __rcu *ftrace_graph_hash;
0858 extern struct ftrace_hash __rcu *ftrace_graph_notrace_hash;
0859
0860 static inline int ftrace_graph_addr(struct ftrace_graph_ent *trace)
0861 {
0862 unsigned long addr = trace->func;
0863 int ret = 0;
0864 struct ftrace_hash *hash;
0865
0866 preempt_disable_notrace();
0867
0868
0869
0870
0871
0872
0873
0874 hash = rcu_dereference_protected(ftrace_graph_hash, !preemptible());
0875
0876 if (ftrace_hash_empty(hash)) {
0877 ret = 1;
0878 goto out;
0879 }
0880
0881 if (ftrace_lookup_ip(hash, addr)) {
0882
0883
0884
0885
0886
0887 trace_recursion_set(TRACE_GRAPH_BIT);
0888 trace_recursion_set_depth(trace->depth);
0889
0890
0891
0892
0893
0894
0895 if (in_hardirq())
0896 trace_recursion_set(TRACE_IRQ_BIT);
0897 else
0898 trace_recursion_clear(TRACE_IRQ_BIT);
0899 ret = 1;
0900 }
0901
0902 out:
0903 preempt_enable_notrace();
0904 return ret;
0905 }
0906
0907 static inline void ftrace_graph_addr_finish(struct ftrace_graph_ret *trace)
0908 {
0909 if (trace_recursion_test(TRACE_GRAPH_BIT) &&
0910 trace->depth == trace_recursion_depth())
0911 trace_recursion_clear(TRACE_GRAPH_BIT);
0912 }
0913
0914 static inline int ftrace_graph_notrace_addr(unsigned long addr)
0915 {
0916 int ret = 0;
0917 struct ftrace_hash *notrace_hash;
0918
0919 preempt_disable_notrace();
0920
0921
0922
0923
0924
0925
0926
0927 notrace_hash = rcu_dereference_protected(ftrace_graph_notrace_hash,
0928 !preemptible());
0929
0930 if (ftrace_lookup_ip(notrace_hash, addr))
0931 ret = 1;
0932
0933 preempt_enable_notrace();
0934 return ret;
0935 }
0936 #else
0937 static inline int ftrace_graph_addr(struct ftrace_graph_ent *trace)
0938 {
0939 return 1;
0940 }
0941
0942 static inline int ftrace_graph_notrace_addr(unsigned long addr)
0943 {
0944 return 0;
0945 }
0946 static inline void ftrace_graph_addr_finish(struct ftrace_graph_ret *trace)
0947 { }
0948 #endif
0949
0950 extern unsigned int fgraph_max_depth;
0951
0952 static inline bool ftrace_graph_ignore_func(struct ftrace_graph_ent *trace)
0953 {
0954
0955 return !(trace_recursion_test(TRACE_GRAPH_BIT) ||
0956 ftrace_graph_addr(trace)) ||
0957 (trace->depth < 0) ||
0958 (fgraph_max_depth && trace->depth >= fgraph_max_depth);
0959 }
0960
0961 #else
0962 static inline enum print_line_t
0963 print_graph_function_flags(struct trace_iterator *iter, u32 flags)
0964 {
0965 return TRACE_TYPE_UNHANDLED;
0966 }
0967 #endif
0968
0969 extern struct list_head ftrace_pids;
0970
0971 #ifdef CONFIG_FUNCTION_TRACER
0972
0973 #define FTRACE_PID_IGNORE -1
0974 #define FTRACE_PID_TRACE -2
0975
0976 struct ftrace_func_command {
0977 struct list_head list;
0978 char *name;
0979 int (*func)(struct trace_array *tr,
0980 struct ftrace_hash *hash,
0981 char *func, char *cmd,
0982 char *params, int enable);
0983 };
0984 extern bool ftrace_filter_param __initdata;
0985 static inline int ftrace_trace_task(struct trace_array *tr)
0986 {
0987 return this_cpu_read(tr->array_buffer.data->ftrace_ignore_pid) !=
0988 FTRACE_PID_IGNORE;
0989 }
0990 extern int ftrace_is_dead(void);
0991 int ftrace_create_function_files(struct trace_array *tr,
0992 struct dentry *parent);
0993 void ftrace_destroy_function_files(struct trace_array *tr);
0994 int ftrace_allocate_ftrace_ops(struct trace_array *tr);
0995 void ftrace_free_ftrace_ops(struct trace_array *tr);
0996 void ftrace_init_global_array_ops(struct trace_array *tr);
0997 void ftrace_init_array_ops(struct trace_array *tr, ftrace_func_t func);
0998 void ftrace_reset_array_ops(struct trace_array *tr);
0999 void ftrace_init_tracefs(struct trace_array *tr, struct dentry *d_tracer);
1000 void ftrace_init_tracefs_toplevel(struct trace_array *tr,
1001 struct dentry *d_tracer);
1002 void ftrace_clear_pids(struct trace_array *tr);
1003 int init_function_trace(void);
1004 void ftrace_pid_follow_fork(struct trace_array *tr, bool enable);
1005 #else
1006 static inline int ftrace_trace_task(struct trace_array *tr)
1007 {
1008 return 1;
1009 }
1010 static inline int ftrace_is_dead(void) { return 0; }
1011 static inline int
1012 ftrace_create_function_files(struct trace_array *tr,
1013 struct dentry *parent)
1014 {
1015 return 0;
1016 }
1017 static inline int ftrace_allocate_ftrace_ops(struct trace_array *tr)
1018 {
1019 return 0;
1020 }
1021 static inline void ftrace_free_ftrace_ops(struct trace_array *tr) { }
1022 static inline void ftrace_destroy_function_files(struct trace_array *tr) { }
1023 static inline __init void
1024 ftrace_init_global_array_ops(struct trace_array *tr) { }
1025 static inline void ftrace_reset_array_ops(struct trace_array *tr) { }
1026 static inline void ftrace_init_tracefs(struct trace_array *tr, struct dentry *d) { }
1027 static inline void ftrace_init_tracefs_toplevel(struct trace_array *tr, struct dentry *d) { }
1028 static inline void ftrace_clear_pids(struct trace_array *tr) { }
1029 static inline int init_function_trace(void) { return 0; }
1030 static inline void ftrace_pid_follow_fork(struct trace_array *tr, bool enable) { }
1031
1032 #define ftrace_init_array_ops(tr, func) do { } while (0)
1033 #endif
1034
1035 #if defined(CONFIG_FUNCTION_TRACER) && defined(CONFIG_DYNAMIC_FTRACE)
1036
1037 struct ftrace_probe_ops {
1038 void (*func)(unsigned long ip,
1039 unsigned long parent_ip,
1040 struct trace_array *tr,
1041 struct ftrace_probe_ops *ops,
1042 void *data);
1043 int (*init)(struct ftrace_probe_ops *ops,
1044 struct trace_array *tr,
1045 unsigned long ip, void *init_data,
1046 void **data);
1047 void (*free)(struct ftrace_probe_ops *ops,
1048 struct trace_array *tr,
1049 unsigned long ip, void *data);
1050 int (*print)(struct seq_file *m,
1051 unsigned long ip,
1052 struct ftrace_probe_ops *ops,
1053 void *data);
1054 };
1055
1056 struct ftrace_func_mapper;
1057 typedef int (*ftrace_mapper_func)(void *data);
1058
1059 struct ftrace_func_mapper *allocate_ftrace_func_mapper(void);
1060 void **ftrace_func_mapper_find_ip(struct ftrace_func_mapper *mapper,
1061 unsigned long ip);
1062 int ftrace_func_mapper_add_ip(struct ftrace_func_mapper *mapper,
1063 unsigned long ip, void *data);
1064 void *ftrace_func_mapper_remove_ip(struct ftrace_func_mapper *mapper,
1065 unsigned long ip);
1066 void free_ftrace_func_mapper(struct ftrace_func_mapper *mapper,
1067 ftrace_mapper_func free_func);
1068
1069 extern int
1070 register_ftrace_function_probe(char *glob, struct trace_array *tr,
1071 struct ftrace_probe_ops *ops, void *data);
1072 extern int
1073 unregister_ftrace_function_probe_func(char *glob, struct trace_array *tr,
1074 struct ftrace_probe_ops *ops);
1075 extern void clear_ftrace_function_probes(struct trace_array *tr);
1076
1077 int register_ftrace_command(struct ftrace_func_command *cmd);
1078 int unregister_ftrace_command(struct ftrace_func_command *cmd);
1079
1080 void ftrace_create_filter_files(struct ftrace_ops *ops,
1081 struct dentry *parent);
1082 void ftrace_destroy_filter_files(struct ftrace_ops *ops);
1083
1084 extern int ftrace_set_filter(struct ftrace_ops *ops, unsigned char *buf,
1085 int len, int reset);
1086 extern int ftrace_set_notrace(struct ftrace_ops *ops, unsigned char *buf,
1087 int len, int reset);
1088 #else
1089 struct ftrace_func_command;
1090
1091 static inline __init int register_ftrace_command(struct ftrace_func_command *cmd)
1092 {
1093 return -EINVAL;
1094 }
1095 static inline __init int unregister_ftrace_command(char *cmd_name)
1096 {
1097 return -EINVAL;
1098 }
1099 static inline void clear_ftrace_function_probes(struct trace_array *tr)
1100 {
1101 }
1102
1103
1104
1105
1106
1107 #define ftrace_create_filter_files(ops, parent) do { } while (0)
1108 #define ftrace_destroy_filter_files(ops) do { } while (0)
1109 #endif
1110
1111 bool ftrace_event_is_function(struct trace_event_call *call);
1112
1113
1114
1115
1116
1117
1118
1119
1120 struct trace_parser {
1121 bool cont;
1122 char *buffer;
1123 unsigned idx;
1124 unsigned size;
1125 };
1126
1127 static inline bool trace_parser_loaded(struct trace_parser *parser)
1128 {
1129 return (parser->idx != 0);
1130 }
1131
1132 static inline bool trace_parser_cont(struct trace_parser *parser)
1133 {
1134 return parser->cont;
1135 }
1136
1137 static inline void trace_parser_clear(struct trace_parser *parser)
1138 {
1139 parser->cont = false;
1140 parser->idx = 0;
1141 }
1142
1143 extern int trace_parser_get_init(struct trace_parser *parser, int size);
1144 extern void trace_parser_put(struct trace_parser *parser);
1145 extern int trace_get_user(struct trace_parser *parser, const char __user *ubuf,
1146 size_t cnt, loff_t *ppos);
1147
1148
1149
1150
1151 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
1152 # define FGRAPH_FLAGS \
1153 C(DISPLAY_GRAPH, "display-graph"),
1154 #else
1155 # define FGRAPH_FLAGS
1156 #endif
1157
1158 #ifdef CONFIG_BRANCH_TRACER
1159 # define BRANCH_FLAGS \
1160 C(BRANCH, "branch"),
1161 #else
1162 # define BRANCH_FLAGS
1163 #endif
1164
1165 #ifdef CONFIG_FUNCTION_TRACER
1166 # define FUNCTION_FLAGS \
1167 C(FUNCTION, "function-trace"), \
1168 C(FUNC_FORK, "function-fork"),
1169 # define FUNCTION_DEFAULT_FLAGS TRACE_ITER_FUNCTION
1170 #else
1171 # define FUNCTION_FLAGS
1172 # define FUNCTION_DEFAULT_FLAGS 0UL
1173 # define TRACE_ITER_FUNC_FORK 0UL
1174 #endif
1175
1176 #ifdef CONFIG_STACKTRACE
1177 # define STACK_FLAGS \
1178 C(STACKTRACE, "stacktrace"),
1179 #else
1180 # define STACK_FLAGS
1181 #endif
1182
1183
1184
1185
1186
1187
1188
1189
1190 #define TRACE_FLAGS \
1191 C(PRINT_PARENT, "print-parent"), \
1192 C(SYM_OFFSET, "sym-offset"), \
1193 C(SYM_ADDR, "sym-addr"), \
1194 C(VERBOSE, "verbose"), \
1195 C(RAW, "raw"), \
1196 C(HEX, "hex"), \
1197 C(BIN, "bin"), \
1198 C(BLOCK, "block"), \
1199 C(PRINTK, "trace_printk"), \
1200 C(ANNOTATE, "annotate"), \
1201 C(USERSTACKTRACE, "userstacktrace"), \
1202 C(SYM_USEROBJ, "sym-userobj"), \
1203 C(PRINTK_MSGONLY, "printk-msg-only"), \
1204 C(CONTEXT_INFO, "context-info"), \
1205 C(LATENCY_FMT, "latency-format"), \
1206 C(RECORD_CMD, "record-cmd"), \
1207 C(RECORD_TGID, "record-tgid"), \
1208 C(OVERWRITE, "overwrite"), \
1209 C(STOP_ON_FREE, "disable_on_free"), \
1210 C(IRQ_INFO, "irq-info"), \
1211 C(MARKERS, "markers"), \
1212 C(EVENT_FORK, "event-fork"), \
1213 C(PAUSE_ON_TRACE, "pause-on-trace"), \
1214 C(HASH_PTR, "hash-ptr"), \
1215 FUNCTION_FLAGS \
1216 FGRAPH_FLAGS \
1217 STACK_FLAGS \
1218 BRANCH_FLAGS
1219
1220
1221
1222
1223
1224 #undef C
1225 #define C(a, b) TRACE_ITER_##a##_BIT
1226
1227 enum trace_iterator_bits {
1228 TRACE_FLAGS
1229
1230 TRACE_ITER_LAST_BIT
1231 };
1232
1233
1234
1235
1236
1237 #undef C
1238 #define C(a, b) TRACE_ITER_##a = (1 << TRACE_ITER_##a##_BIT)
1239
1240 enum trace_iterator_flags { TRACE_FLAGS };
1241
1242
1243
1244
1245
1246 #define TRACE_ITER_SYM_MASK \
1247 (TRACE_ITER_PRINT_PARENT|TRACE_ITER_SYM_OFFSET|TRACE_ITER_SYM_ADDR)
1248
1249 extern struct tracer nop_trace;
1250
1251 #ifdef CONFIG_BRANCH_TRACER
1252 extern int enable_branch_tracing(struct trace_array *tr);
1253 extern void disable_branch_tracing(void);
1254 static inline int trace_branch_enable(struct trace_array *tr)
1255 {
1256 if (tr->trace_flags & TRACE_ITER_BRANCH)
1257 return enable_branch_tracing(tr);
1258 return 0;
1259 }
1260 static inline void trace_branch_disable(void)
1261 {
1262
1263 disable_branch_tracing();
1264 }
1265 #else
1266 static inline int trace_branch_enable(struct trace_array *tr)
1267 {
1268 return 0;
1269 }
1270 static inline void trace_branch_disable(void)
1271 {
1272 }
1273 #endif
1274
1275
1276 int tracing_update_buffers(void);
1277
1278 struct ftrace_event_field {
1279 struct list_head link;
1280 const char *name;
1281 const char *type;
1282 int filter_type;
1283 int offset;
1284 int size;
1285 int is_signed;
1286 };
1287
1288 struct prog_entry;
1289
1290 struct event_filter {
1291 struct prog_entry __rcu *prog;
1292 char *filter_string;
1293 };
1294
1295 struct event_subsystem {
1296 struct list_head list;
1297 const char *name;
1298 struct event_filter *filter;
1299 int ref_count;
1300 };
1301
1302 struct trace_subsystem_dir {
1303 struct list_head list;
1304 struct event_subsystem *subsystem;
1305 struct trace_array *tr;
1306 struct dentry *entry;
1307 int ref_count;
1308 int nr_events;
1309 };
1310
1311 extern int call_filter_check_discard(struct trace_event_call *call, void *rec,
1312 struct trace_buffer *buffer,
1313 struct ring_buffer_event *event);
1314
1315 void trace_buffer_unlock_commit_regs(struct trace_array *tr,
1316 struct trace_buffer *buffer,
1317 struct ring_buffer_event *event,
1318 unsigned int trcace_ctx,
1319 struct pt_regs *regs);
1320
1321 static inline void trace_buffer_unlock_commit(struct trace_array *tr,
1322 struct trace_buffer *buffer,
1323 struct ring_buffer_event *event,
1324 unsigned int trace_ctx)
1325 {
1326 trace_buffer_unlock_commit_regs(tr, buffer, event, trace_ctx, NULL);
1327 }
1328
1329 DECLARE_PER_CPU(struct ring_buffer_event *, trace_buffered_event);
1330 DECLARE_PER_CPU(int, trace_buffered_event_cnt);
1331 void trace_buffered_event_disable(void);
1332 void trace_buffered_event_enable(void);
1333
1334 static inline void
1335 __trace_event_discard_commit(struct trace_buffer *buffer,
1336 struct ring_buffer_event *event)
1337 {
1338 if (this_cpu_read(trace_buffered_event) == event) {
1339
1340 this_cpu_dec(trace_buffered_event_cnt);
1341 preempt_enable_notrace();
1342 return;
1343 }
1344
1345 ring_buffer_discard_commit(buffer, event);
1346 }
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361 static inline bool
1362 __event_trigger_test_discard(struct trace_event_file *file,
1363 struct trace_buffer *buffer,
1364 struct ring_buffer_event *event,
1365 void *entry,
1366 enum event_trigger_type *tt)
1367 {
1368 unsigned long eflags = file->flags;
1369
1370 if (eflags & EVENT_FILE_FL_TRIGGER_COND)
1371 *tt = event_triggers_call(file, buffer, entry, event);
1372
1373 if (likely(!(file->flags & (EVENT_FILE_FL_SOFT_DISABLED |
1374 EVENT_FILE_FL_FILTERED |
1375 EVENT_FILE_FL_PID_FILTER))))
1376 return false;
1377
1378 if (file->flags & EVENT_FILE_FL_SOFT_DISABLED)
1379 goto discard;
1380
1381 if (file->flags & EVENT_FILE_FL_FILTERED &&
1382 !filter_match_preds(file->filter, entry))
1383 goto discard;
1384
1385 if ((file->flags & EVENT_FILE_FL_PID_FILTER) &&
1386 trace_event_ignore_this_pid(file))
1387 goto discard;
1388
1389 return false;
1390 discard:
1391 __trace_event_discard_commit(buffer, event);
1392 return true;
1393 }
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407 static inline void
1408 event_trigger_unlock_commit(struct trace_event_file *file,
1409 struct trace_buffer *buffer,
1410 struct ring_buffer_event *event,
1411 void *entry, unsigned int trace_ctx)
1412 {
1413 enum event_trigger_type tt = ETT_NONE;
1414
1415 if (!__event_trigger_test_discard(file, buffer, event, entry, &tt))
1416 trace_buffer_unlock_commit(file->tr, buffer, event, trace_ctx);
1417
1418 if (tt)
1419 event_triggers_post_call(file, tt);
1420 }
1421
1422 #define FILTER_PRED_INVALID ((unsigned short)-1)
1423 #define FILTER_PRED_IS_RIGHT (1 << 15)
1424 #define FILTER_PRED_FOLD (1 << 15)
1425
1426
1427
1428
1429
1430
1431
1432
1433 #define MAX_FILTER_PRED 16384
1434
1435 struct filter_pred;
1436 struct regex;
1437
1438 typedef int (*filter_pred_fn_t) (struct filter_pred *pred, void *event);
1439
1440 typedef int (*regex_match_func)(char *str, struct regex *r, int len);
1441
1442 enum regex_type {
1443 MATCH_FULL = 0,
1444 MATCH_FRONT_ONLY,
1445 MATCH_MIDDLE_ONLY,
1446 MATCH_END_ONLY,
1447 MATCH_GLOB,
1448 MATCH_INDEX,
1449 };
1450
1451 struct regex {
1452 char pattern[MAX_FILTER_STR_VAL];
1453 int len;
1454 int field_len;
1455 regex_match_func match;
1456 };
1457
1458 struct filter_pred {
1459 filter_pred_fn_t fn;
1460 u64 val;
1461 struct regex regex;
1462 unsigned short *ops;
1463 struct ftrace_event_field *field;
1464 int offset;
1465 int not;
1466 int op;
1467 };
1468
1469 static inline bool is_string_field(struct ftrace_event_field *field)
1470 {
1471 return field->filter_type == FILTER_DYN_STRING ||
1472 field->filter_type == FILTER_RDYN_STRING ||
1473 field->filter_type == FILTER_STATIC_STRING ||
1474 field->filter_type == FILTER_PTR_STRING ||
1475 field->filter_type == FILTER_COMM;
1476 }
1477
1478 static inline bool is_function_field(struct ftrace_event_field *field)
1479 {
1480 return field->filter_type == FILTER_TRACE_FN;
1481 }
1482
1483 extern enum regex_type
1484 filter_parse_regex(char *buff, int len, char **search, int *not);
1485 extern void print_event_filter(struct trace_event_file *file,
1486 struct trace_seq *s);
1487 extern int apply_event_filter(struct trace_event_file *file,
1488 char *filter_string);
1489 extern int apply_subsystem_event_filter(struct trace_subsystem_dir *dir,
1490 char *filter_string);
1491 extern void print_subsystem_event_filter(struct event_subsystem *system,
1492 struct trace_seq *s);
1493 extern int filter_assign_type(const char *type);
1494 extern int create_event_filter(struct trace_array *tr,
1495 struct trace_event_call *call,
1496 char *filter_str, bool set_str,
1497 struct event_filter **filterp);
1498 extern void free_event_filter(struct event_filter *filter);
1499
1500 struct ftrace_event_field *
1501 trace_find_event_field(struct trace_event_call *call, char *name);
1502
1503 extern void trace_event_enable_cmd_record(bool enable);
1504 extern void trace_event_enable_tgid_record(bool enable);
1505
1506 extern int event_trace_init(void);
1507 extern int event_trace_add_tracer(struct dentry *parent, struct trace_array *tr);
1508 extern int event_trace_del_tracer(struct trace_array *tr);
1509 extern void __trace_early_add_events(struct trace_array *tr);
1510
1511 extern struct trace_event_file *__find_event_file(struct trace_array *tr,
1512 const char *system,
1513 const char *event);
1514 extern struct trace_event_file *find_event_file(struct trace_array *tr,
1515 const char *system,
1516 const char *event);
1517
1518 static inline void *event_file_data(struct file *filp)
1519 {
1520 return READ_ONCE(file_inode(filp)->i_private);
1521 }
1522
1523 extern struct mutex event_mutex;
1524 extern struct list_head ftrace_events;
1525
1526 extern const struct file_operations event_trigger_fops;
1527 extern const struct file_operations event_hist_fops;
1528 extern const struct file_operations event_hist_debug_fops;
1529 extern const struct file_operations event_inject_fops;
1530
1531 #ifdef CONFIG_HIST_TRIGGERS
1532 extern int register_trigger_hist_cmd(void);
1533 extern int register_trigger_hist_enable_disable_cmds(void);
1534 #else
1535 static inline int register_trigger_hist_cmd(void) { return 0; }
1536 static inline int register_trigger_hist_enable_disable_cmds(void) { return 0; }
1537 #endif
1538
1539 extern int register_trigger_cmds(void);
1540 extern void clear_event_triggers(struct trace_array *tr);
1541
1542 enum {
1543 EVENT_TRIGGER_FL_PROBE = BIT(0),
1544 };
1545
1546 struct event_trigger_data {
1547 unsigned long count;
1548 int ref;
1549 int flags;
1550 struct event_trigger_ops *ops;
1551 struct event_command *cmd_ops;
1552 struct event_filter __rcu *filter;
1553 char *filter_str;
1554 void *private_data;
1555 bool paused;
1556 bool paused_tmp;
1557 struct list_head list;
1558 char *name;
1559 struct list_head named_list;
1560 struct event_trigger_data *named_data;
1561 };
1562
1563
1564 #define ENABLE_EVENT_STR "enable_event"
1565 #define DISABLE_EVENT_STR "disable_event"
1566 #define ENABLE_HIST_STR "enable_hist"
1567 #define DISABLE_HIST_STR "disable_hist"
1568
1569 struct enable_trigger_data {
1570 struct trace_event_file *file;
1571 bool enable;
1572 bool hist;
1573 };
1574
1575 extern int event_enable_trigger_print(struct seq_file *m,
1576 struct event_trigger_data *data);
1577 extern void event_enable_trigger_free(struct event_trigger_data *data);
1578 extern int event_enable_trigger_parse(struct event_command *cmd_ops,
1579 struct trace_event_file *file,
1580 char *glob, char *cmd,
1581 char *param_and_filter);
1582 extern int event_enable_register_trigger(char *glob,
1583 struct event_trigger_data *data,
1584 struct trace_event_file *file);
1585 extern void event_enable_unregister_trigger(char *glob,
1586 struct event_trigger_data *test,
1587 struct trace_event_file *file);
1588 extern void trigger_data_free(struct event_trigger_data *data);
1589 extern int event_trigger_init(struct event_trigger_data *data);
1590 extern int trace_event_trigger_enable_disable(struct trace_event_file *file,
1591 int trigger_enable);
1592 extern void update_cond_flag(struct trace_event_file *file);
1593 extern int set_trigger_filter(char *filter_str,
1594 struct event_trigger_data *trigger_data,
1595 struct trace_event_file *file);
1596 extern struct event_trigger_data *find_named_trigger(const char *name);
1597 extern bool is_named_trigger(struct event_trigger_data *test);
1598 extern int save_named_trigger(const char *name,
1599 struct event_trigger_data *data);
1600 extern void del_named_trigger(struct event_trigger_data *data);
1601 extern void pause_named_trigger(struct event_trigger_data *data);
1602 extern void unpause_named_trigger(struct event_trigger_data *data);
1603 extern void set_named_trigger_data(struct event_trigger_data *data,
1604 struct event_trigger_data *named_data);
1605 extern struct event_trigger_data *
1606 get_named_trigger_data(struct event_trigger_data *data);
1607 extern int register_event_command(struct event_command *cmd);
1608 extern int unregister_event_command(struct event_command *cmd);
1609 extern int register_trigger_hist_enable_disable_cmds(void);
1610 extern bool event_trigger_check_remove(const char *glob);
1611 extern bool event_trigger_empty_param(const char *param);
1612 extern int event_trigger_separate_filter(char *param_and_filter, char **param,
1613 char **filter, bool param_required);
1614 extern struct event_trigger_data *
1615 event_trigger_alloc(struct event_command *cmd_ops,
1616 char *cmd,
1617 char *param,
1618 void *private_data);
1619 extern int event_trigger_parse_num(char *trigger,
1620 struct event_trigger_data *trigger_data);
1621 extern int event_trigger_set_filter(struct event_command *cmd_ops,
1622 struct trace_event_file *file,
1623 char *param,
1624 struct event_trigger_data *trigger_data);
1625 extern void event_trigger_reset_filter(struct event_command *cmd_ops,
1626 struct event_trigger_data *trigger_data);
1627 extern int event_trigger_register(struct event_command *cmd_ops,
1628 struct trace_event_file *file,
1629 char *glob,
1630 struct event_trigger_data *trigger_data);
1631 extern void event_trigger_unregister(struct event_command *cmd_ops,
1632 struct trace_event_file *file,
1633 char *glob,
1634 struct event_trigger_data *trigger_data);
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683 struct event_trigger_ops {
1684 void (*trigger)(struct event_trigger_data *data,
1685 struct trace_buffer *buffer,
1686 void *rec,
1687 struct ring_buffer_event *rbe);
1688 int (*init)(struct event_trigger_data *data);
1689 void (*free)(struct event_trigger_data *data);
1690 int (*print)(struct seq_file *m,
1691 struct event_trigger_data *data);
1692 };
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773 struct event_command {
1774 struct list_head list;
1775 char *name;
1776 enum event_trigger_type trigger_type;
1777 int flags;
1778 int (*parse)(struct event_command *cmd_ops,
1779 struct trace_event_file *file,
1780 char *glob, char *cmd,
1781 char *param_and_filter);
1782 int (*reg)(char *glob,
1783 struct event_trigger_data *data,
1784 struct trace_event_file *file);
1785 void (*unreg)(char *glob,
1786 struct event_trigger_data *data,
1787 struct trace_event_file *file);
1788 void (*unreg_all)(struct trace_event_file *file);
1789 int (*set_filter)(char *filter_str,
1790 struct event_trigger_data *data,
1791 struct trace_event_file *file);
1792 struct event_trigger_ops *(*get_trigger_ops)(char *cmd, char *param);
1793 };
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823 enum event_command_flags {
1824 EVENT_CMD_FL_POST_TRIGGER = 1,
1825 EVENT_CMD_FL_NEEDS_REC = 2,
1826 };
1827
1828 static inline bool event_command_post_trigger(struct event_command *cmd_ops)
1829 {
1830 return cmd_ops->flags & EVENT_CMD_FL_POST_TRIGGER;
1831 }
1832
1833 static inline bool event_command_needs_rec(struct event_command *cmd_ops)
1834 {
1835 return cmd_ops->flags & EVENT_CMD_FL_NEEDS_REC;
1836 }
1837
1838 extern int trace_event_enable_disable(struct trace_event_file *file,
1839 int enable, int soft_disable);
1840 extern int tracing_alloc_snapshot(void);
1841 extern void tracing_snapshot_cond(struct trace_array *tr, void *cond_data);
1842 extern int tracing_snapshot_cond_enable(struct trace_array *tr, void *cond_data, cond_update_fn_t update);
1843
1844 extern int tracing_snapshot_cond_disable(struct trace_array *tr);
1845 extern void *tracing_cond_snapshot_data(struct trace_array *tr);
1846
1847 extern const char *__start___trace_bprintk_fmt[];
1848 extern const char *__stop___trace_bprintk_fmt[];
1849
1850 extern const char *__start___tracepoint_str[];
1851 extern const char *__stop___tracepoint_str[];
1852
1853 void trace_printk_control(bool enabled);
1854 void trace_printk_start_comm(void);
1855 int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set);
1856 int set_tracer_flag(struct trace_array *tr, unsigned int mask, int enabled);
1857
1858
1859 extern int trace_set_options(struct trace_array *tr, char *option);
1860 extern int tracing_set_tracer(struct trace_array *tr, const char *buf);
1861 extern ssize_t tracing_resize_ring_buffer(struct trace_array *tr,
1862 unsigned long size, int cpu_id);
1863 extern int tracing_set_cpumask(struct trace_array *tr,
1864 cpumask_var_t tracing_cpumask_new);
1865
1866
1867 #define MAX_EVENT_NAME_LEN 64
1868
1869 extern ssize_t trace_parse_run_command(struct file *file,
1870 const char __user *buffer, size_t count, loff_t *ppos,
1871 int (*createfn)(const char *));
1872
1873 extern unsigned int err_pos(char *cmd, const char *str);
1874 extern void tracing_log_err(struct trace_array *tr,
1875 const char *loc, const char *cmd,
1876 const char **errs, u8 type, u16 pos);
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887 #define internal_trace_puts(str) __trace_puts(_THIS_IP_, str, strlen(str))
1888
1889 #undef FTRACE_ENTRY
1890 #define FTRACE_ENTRY(call, struct_name, id, tstruct, print) \
1891 extern struct trace_event_call \
1892 __aligned(4) event_##call;
1893 #undef FTRACE_ENTRY_DUP
1894 #define FTRACE_ENTRY_DUP(call, struct_name, id, tstruct, print) \
1895 FTRACE_ENTRY(call, struct_name, id, PARAMS(tstruct), PARAMS(print))
1896 #undef FTRACE_ENTRY_PACKED
1897 #define FTRACE_ENTRY_PACKED(call, struct_name, id, tstruct, print) \
1898 FTRACE_ENTRY(call, struct_name, id, PARAMS(tstruct), PARAMS(print))
1899
1900 #include "trace_entries.h"
1901
1902 #if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_FUNCTION_TRACER)
1903 int perf_ftrace_event_register(struct trace_event_call *call,
1904 enum trace_reg type, void *data);
1905 #else
1906 #define perf_ftrace_event_register NULL
1907 #endif
1908
1909 #ifdef CONFIG_FTRACE_SYSCALLS
1910 void init_ftrace_syscalls(void);
1911 const char *get_syscall_name(int syscall);
1912 #else
1913 static inline void init_ftrace_syscalls(void) { }
1914 static inline const char *get_syscall_name(int syscall)
1915 {
1916 return NULL;
1917 }
1918 #endif
1919
1920 #ifdef CONFIG_EVENT_TRACING
1921 void trace_event_init(void);
1922 void trace_event_eval_update(struct trace_eval_map **map, int len);
1923
1924 extern int ftrace_set_clr_event(struct trace_array *tr, char *buf, int set);
1925 extern int trigger_process_regex(struct trace_event_file *file, char *buff);
1926 #else
1927 static inline void __init trace_event_init(void) { }
1928 static inline void trace_event_eval_update(struct trace_eval_map **map, int len) { }
1929 #endif
1930
1931 #ifdef CONFIG_TRACER_SNAPSHOT
1932 void tracing_snapshot_instance(struct trace_array *tr);
1933 int tracing_alloc_snapshot_instance(struct trace_array *tr);
1934 #else
1935 static inline void tracing_snapshot_instance(struct trace_array *tr) { }
1936 static inline int tracing_alloc_snapshot_instance(struct trace_array *tr)
1937 {
1938 return 0;
1939 }
1940 #endif
1941
1942 #ifdef CONFIG_PREEMPT_TRACER
1943 void tracer_preempt_on(unsigned long a0, unsigned long a1);
1944 void tracer_preempt_off(unsigned long a0, unsigned long a1);
1945 #else
1946 static inline void tracer_preempt_on(unsigned long a0, unsigned long a1) { }
1947 static inline void tracer_preempt_off(unsigned long a0, unsigned long a1) { }
1948 #endif
1949 #ifdef CONFIG_IRQSOFF_TRACER
1950 void tracer_hardirqs_on(unsigned long a0, unsigned long a1);
1951 void tracer_hardirqs_off(unsigned long a0, unsigned long a1);
1952 #else
1953 static inline void tracer_hardirqs_on(unsigned long a0, unsigned long a1) { }
1954 static inline void tracer_hardirqs_off(unsigned long a0, unsigned long a1) { }
1955 #endif
1956
1957 extern struct trace_iterator *tracepoint_print_iter;
1958
1959
1960
1961
1962
1963
1964 static __always_inline void trace_iterator_reset(struct trace_iterator *iter)
1965 {
1966 memset_startat(iter, 0, seq);
1967 iter->pos = -1;
1968 }
1969
1970
1971 static inline bool is_good_name(const char *name)
1972 {
1973 if (!isalpha(*name) && *name != '_')
1974 return false;
1975 while (*++name != '\0') {
1976 if (!isalpha(*name) && !isdigit(*name) && *name != '_')
1977 return false;
1978 }
1979 return true;
1980 }
1981
1982
1983 static inline void sanitize_event_name(char *name)
1984 {
1985 while (*name++ != '\0')
1986 if (*name == ':' || *name == '.')
1987 *name = '_';
1988 }
1989
1990
1991
1992
1993
1994
1995
1996
1997 struct trace_min_max_param {
1998 struct mutex *lock;
1999 u64 *val;
2000 u64 *min;
2001 u64 *max;
2002 };
2003
2004 #define U64_STR_SIZE 24
2005
2006 extern const struct file_operations trace_min_max_fops;
2007
2008 #ifdef CONFIG_RV
2009 extern int rv_init_interface(void);
2010 #else
2011 static inline int rv_init_interface(void)
2012 {
2013 return 0;
2014 }
2015 #endif
2016
2017 #endif