linux/include/linux/trace_events.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2
   3#ifndef _LINUX_TRACE_EVENT_H
   4#define _LINUX_TRACE_EVENT_H
   5
   6#include <linux/ring_buffer.h>
   7#include <linux/trace_seq.h>
   8#include <linux/percpu.h>
   9#include <linux/hardirq.h>
  10#include <linux/perf_event.h>
  11#include <linux/tracepoint.h>
  12
  13struct trace_array;
  14struct array_buffer;
  15struct tracer;
  16struct dentry;
  17struct bpf_prog;
  18
  19const char *trace_print_flags_seq(struct trace_seq *p, const char *delim,
  20                                  unsigned long flags,
  21                                  const struct trace_print_flags *flag_array);
  22
  23const char *trace_print_symbols_seq(struct trace_seq *p, unsigned long val,
  24                                    const struct trace_print_flags *symbol_array);
  25
  26#if BITS_PER_LONG == 32
  27const char *trace_print_flags_seq_u64(struct trace_seq *p, const char *delim,
  28                      unsigned long long flags,
  29                      const struct trace_print_flags_u64 *flag_array);
  30
  31const char *trace_print_symbols_seq_u64(struct trace_seq *p,
  32                                        unsigned long long val,
  33                                        const struct trace_print_flags_u64
  34                                                                 *symbol_array);
  35#endif
  36
  37const char *trace_print_bitmask_seq(struct trace_seq *p, void *bitmask_ptr,
  38                                    unsigned int bitmask_size);
  39
  40const char *trace_print_hex_seq(struct trace_seq *p,
  41                                const unsigned char *buf, int len,
  42                                bool concatenate);
  43
  44const char *trace_print_array_seq(struct trace_seq *p,
  45                                   const void *buf, int count,
  46                                   size_t el_size);
  47
  48const char *
  49trace_print_hex_dump_seq(struct trace_seq *p, const char *prefix_str,
  50                         int prefix_type, int rowsize, int groupsize,
  51                         const void *buf, size_t len, bool ascii);
  52
  53struct trace_iterator;
  54struct trace_event;
  55
  56int trace_raw_output_prep(struct trace_iterator *iter,
  57                          struct trace_event *event);
  58
  59/*
  60 * The trace entry - the most basic unit of tracing. This is what
  61 * is printed in the end as a single line in the trace output, such as:
  62 *
  63 *     bash-15816 [01]   235.197585: idle_cpu <- irq_enter
  64 */
  65struct trace_entry {
  66        unsigned short          type;
  67        unsigned char           flags;
  68        unsigned char           preempt_count;
  69        int                     pid;
  70};
  71
  72#define TRACE_EVENT_TYPE_MAX                                            \
  73        ((1 << (sizeof(((struct trace_entry *)0)->type) * 8)) - 1)
  74
  75/*
  76 * Trace iterator - used by printout routines who present trace
  77 * results to users and which routines might sleep, etc:
  78 */
  79struct trace_iterator {
  80        struct trace_array      *tr;
  81        struct tracer           *trace;
  82        struct array_buffer     *array_buffer;
  83        void                    *private;
  84        int                     cpu_file;
  85        struct mutex            mutex;
  86        struct ring_buffer_iter **buffer_iter;
  87        unsigned long           iter_flags;
  88        void                    *temp;  /* temp holder */
  89        unsigned int            temp_size;
  90
  91        /* trace_seq for __print_flags() and __print_symbolic() etc. */
  92        struct trace_seq        tmp_seq;
  93
  94        cpumask_var_t           started;
  95
  96        /* it's true when current open file is snapshot */
  97        bool                    snapshot;
  98
  99        /* The below is zeroed out in pipe_read */
 100        struct trace_seq        seq;
 101        struct trace_entry      *ent;
 102        unsigned long           lost_events;
 103        int                     leftover;
 104        int                     ent_size;
 105        int                     cpu;
 106        u64                     ts;
 107
 108        loff_t                  pos;
 109        long                    idx;
 110
 111        /* All new field here will be zeroed out in pipe_read */
 112};
 113
 114enum trace_iter_flags {
 115        TRACE_FILE_LAT_FMT      = 1,
 116        TRACE_FILE_ANNOTATE     = 2,
 117        TRACE_FILE_TIME_IN_NS   = 4,
 118};
 119
 120
 121typedef enum print_line_t (*trace_print_func)(struct trace_iterator *iter,
 122                                      int flags, struct trace_event *event);
 123
 124struct trace_event_functions {
 125        trace_print_func        trace;
 126        trace_print_func        raw;
 127        trace_print_func        hex;
 128        trace_print_func        binary;
 129};
 130
 131struct trace_event {
 132        struct hlist_node               node;
 133        struct list_head                list;
 134        int                             type;
 135        struct trace_event_functions    *funcs;
 136};
 137
 138extern int register_trace_event(struct trace_event *event);
 139extern int unregister_trace_event(struct trace_event *event);
 140
 141/* Return values for print_line callback */
 142enum print_line_t {
 143        TRACE_TYPE_PARTIAL_LINE = 0,    /* Retry after flushing the seq */
 144        TRACE_TYPE_HANDLED      = 1,
 145        TRACE_TYPE_UNHANDLED    = 2,    /* Relay to other output functions */
 146        TRACE_TYPE_NO_CONSUME   = 3     /* Handled but ask to not consume */
 147};
 148
 149enum print_line_t trace_handle_return(struct trace_seq *s);
 150
 151void tracing_generic_entry_update(struct trace_entry *entry,
 152                                  unsigned short type,
 153                                  unsigned long flags,
 154                                  int pc);
 155struct trace_event_file;
 156
 157struct ring_buffer_event *
 158trace_event_buffer_lock_reserve(struct trace_buffer **current_buffer,
 159                                struct trace_event_file *trace_file,
 160                                int type, unsigned long len,
 161                                unsigned long flags, int pc);
 162
 163#define TRACE_RECORD_CMDLINE    BIT(0)
 164#define TRACE_RECORD_TGID       BIT(1)
 165
 166void tracing_record_taskinfo(struct task_struct *task, int flags);
 167void tracing_record_taskinfo_sched_switch(struct task_struct *prev,
 168                                          struct task_struct *next, int flags);
 169
 170void tracing_record_cmdline(struct task_struct *task);
 171void tracing_record_tgid(struct task_struct *task);
 172
 173int trace_output_call(struct trace_iterator *iter, char *name, char *fmt, ...);
 174
 175struct event_filter;
 176
 177enum trace_reg {
 178        TRACE_REG_REGISTER,
 179        TRACE_REG_UNREGISTER,
 180#ifdef CONFIG_PERF_EVENTS
 181        TRACE_REG_PERF_REGISTER,
 182        TRACE_REG_PERF_UNREGISTER,
 183        TRACE_REG_PERF_OPEN,
 184        TRACE_REG_PERF_CLOSE,
 185        /*
 186         * These (ADD/DEL) use a 'boolean' return value, where 1 (true) means a
 187         * custom action was taken and the default action is not to be
 188         * performed.
 189         */
 190        TRACE_REG_PERF_ADD,
 191        TRACE_REG_PERF_DEL,
 192#endif
 193};
 194
 195struct trace_event_call;
 196
 197#define TRACE_FUNCTION_TYPE ((const char *)~0UL)
 198
 199struct trace_event_fields {
 200        const char *type;
 201        union {
 202                struct {
 203                        const char *name;
 204                        const int  size;
 205                        const int  align;
 206                        const int  is_signed;
 207                        const int  filter_type;
 208                };
 209                int (*define_fields)(struct trace_event_call *);
 210        };
 211};
 212
 213struct trace_event_class {
 214        const char              *system;
 215        void                    *probe;
 216#ifdef CONFIG_PERF_EVENTS
 217        void                    *perf_probe;
 218#endif
 219        int                     (*reg)(struct trace_event_call *event,
 220                                       enum trace_reg type, void *data);
 221        struct trace_event_fields *fields_array;
 222        struct list_head        *(*get_fields)(struct trace_event_call *);
 223        struct list_head        fields;
 224        int                     (*raw_init)(struct trace_event_call *);
 225};
 226
 227extern int trace_event_reg(struct trace_event_call *event,
 228                            enum trace_reg type, void *data);
 229
 230struct trace_event_buffer {
 231        struct trace_buffer             *buffer;
 232        struct ring_buffer_event        *event;
 233        struct trace_event_file         *trace_file;
 234        void                            *entry;
 235        unsigned long                   flags;
 236        int                             pc;
 237        struct pt_regs                  *regs;
 238};
 239
 240void *trace_event_buffer_reserve(struct trace_event_buffer *fbuffer,
 241                                  struct trace_event_file *trace_file,
 242                                  unsigned long len);
 243
 244void trace_event_buffer_commit(struct trace_event_buffer *fbuffer);
 245
 246enum {
 247        TRACE_EVENT_FL_FILTERED_BIT,
 248        TRACE_EVENT_FL_CAP_ANY_BIT,
 249        TRACE_EVENT_FL_NO_SET_FILTER_BIT,
 250        TRACE_EVENT_FL_IGNORE_ENABLE_BIT,
 251        TRACE_EVENT_FL_TRACEPOINT_BIT,
 252        TRACE_EVENT_FL_KPROBE_BIT,
 253        TRACE_EVENT_FL_UPROBE_BIT,
 254};
 255
 256/*
 257 * Event flags:
 258 *  FILTERED      - The event has a filter attached
 259 *  CAP_ANY       - Any user can enable for perf
 260 *  NO_SET_FILTER - Set when filter has error and is to be ignored
 261 *  IGNORE_ENABLE - For trace internal events, do not enable with debugfs file
 262 *  TRACEPOINT    - Event is a tracepoint
 263 *  KPROBE        - Event is a kprobe
 264 *  UPROBE        - Event is a uprobe
 265 */
 266enum {
 267        TRACE_EVENT_FL_FILTERED         = (1 << TRACE_EVENT_FL_FILTERED_BIT),
 268        TRACE_EVENT_FL_CAP_ANY          = (1 << TRACE_EVENT_FL_CAP_ANY_BIT),
 269        TRACE_EVENT_FL_NO_SET_FILTER    = (1 << TRACE_EVENT_FL_NO_SET_FILTER_BIT),
 270        TRACE_EVENT_FL_IGNORE_ENABLE    = (1 << TRACE_EVENT_FL_IGNORE_ENABLE_BIT),
 271        TRACE_EVENT_FL_TRACEPOINT       = (1 << TRACE_EVENT_FL_TRACEPOINT_BIT),
 272        TRACE_EVENT_FL_KPROBE           = (1 << TRACE_EVENT_FL_KPROBE_BIT),
 273        TRACE_EVENT_FL_UPROBE           = (1 << TRACE_EVENT_FL_UPROBE_BIT),
 274};
 275
 276#define TRACE_EVENT_FL_UKPROBE (TRACE_EVENT_FL_KPROBE | TRACE_EVENT_FL_UPROBE)
 277
 278struct trace_event_call {
 279        struct list_head        list;
 280        struct trace_event_class *class;
 281        union {
 282                char                    *name;
 283                /* Set TRACE_EVENT_FL_TRACEPOINT flag when using "tp" */
 284                struct tracepoint       *tp;
 285        };
 286        struct trace_event      event;
 287        char                    *print_fmt;
 288        struct event_filter     *filter;
 289        void                    *mod;
 290        void                    *data;
 291        /*
 292         *   bit 0:             filter_active
 293         *   bit 1:             allow trace by non root (cap any)
 294         *   bit 2:             failed to apply filter
 295         *   bit 3:             trace internal event (do not enable)
 296         *   bit 4:             Event was enabled by module
 297         *   bit 5:             use call filter rather than file filter
 298         *   bit 6:             Event is a tracepoint
 299         */
 300        int                     flags; /* static flags of different events */
 301
 302#ifdef CONFIG_PERF_EVENTS
 303        int                             perf_refcount;
 304        struct hlist_head __percpu      *perf_events;
 305        struct bpf_prog_array __rcu     *prog_array;
 306
 307        int     (*perf_perm)(struct trace_event_call *,
 308                             struct perf_event *);
 309#endif
 310};
 311
 312#ifdef CONFIG_PERF_EVENTS
 313static inline bool bpf_prog_array_valid(struct trace_event_call *call)
 314{
 315        /*
 316         * This inline function checks whether call->prog_array
 317         * is valid or not. The function is called in various places,
 318         * outside rcu_read_lock/unlock, as a heuristic to speed up execution.
 319         *
 320         * If this function returns true, and later call->prog_array
 321         * becomes false inside rcu_read_lock/unlock region,
 322         * we bail out then. If this function return false,
 323         * there is a risk that we might miss a few events if the checking
 324         * were delayed until inside rcu_read_lock/unlock region and
 325         * call->prog_array happened to become non-NULL then.
 326         *
 327         * Here, READ_ONCE() is used instead of rcu_access_pointer().
 328         * rcu_access_pointer() requires the actual definition of
 329         * "struct bpf_prog_array" while READ_ONCE() only needs
 330         * a declaration of the same type.
 331         */
 332        return !!READ_ONCE(call->prog_array);
 333}
 334#endif
 335
 336static inline const char *
 337trace_event_name(struct trace_event_call *call)
 338{
 339        if (call->flags & TRACE_EVENT_FL_TRACEPOINT)
 340                return call->tp ? call->tp->name : NULL;
 341        else
 342                return call->name;
 343}
 344
 345static inline struct list_head *
 346trace_get_fields(struct trace_event_call *event_call)
 347{
 348        if (!event_call->class->get_fields)
 349                return &event_call->class->fields;
 350        return event_call->class->get_fields(event_call);
 351}
 352
 353struct trace_array;
 354struct trace_subsystem_dir;
 355
 356enum {
 357        EVENT_FILE_FL_ENABLED_BIT,
 358        EVENT_FILE_FL_RECORDED_CMD_BIT,
 359        EVENT_FILE_FL_RECORDED_TGID_BIT,
 360        EVENT_FILE_FL_FILTERED_BIT,
 361        EVENT_FILE_FL_NO_SET_FILTER_BIT,
 362        EVENT_FILE_FL_SOFT_MODE_BIT,
 363        EVENT_FILE_FL_SOFT_DISABLED_BIT,
 364        EVENT_FILE_FL_TRIGGER_MODE_BIT,
 365        EVENT_FILE_FL_TRIGGER_COND_BIT,
 366        EVENT_FILE_FL_PID_FILTER_BIT,
 367        EVENT_FILE_FL_WAS_ENABLED_BIT,
 368};
 369
 370extern struct trace_event_file *trace_get_event_file(const char *instance,
 371                                                     const char *system,
 372                                                     const char *event);
 373extern void trace_put_event_file(struct trace_event_file *file);
 374
 375#define MAX_DYNEVENT_CMD_LEN    (2048)
 376
 377enum dynevent_type {
 378        DYNEVENT_TYPE_SYNTH = 1,
 379        DYNEVENT_TYPE_KPROBE,
 380        DYNEVENT_TYPE_NONE,
 381};
 382
 383struct dynevent_cmd;
 384
 385typedef int (*dynevent_create_fn_t)(struct dynevent_cmd *cmd);
 386
 387struct dynevent_cmd {
 388        struct seq_buf          seq;
 389        const char              *event_name;
 390        unsigned int            n_fields;
 391        enum dynevent_type      type;
 392        dynevent_create_fn_t    run_command;
 393        void                    *private_data;
 394};
 395
 396extern int dynevent_create(struct dynevent_cmd *cmd);
 397
 398extern int synth_event_delete(const char *name);
 399
 400extern void synth_event_cmd_init(struct dynevent_cmd *cmd,
 401                                 char *buf, int maxlen);
 402
 403extern int __synth_event_gen_cmd_start(struct dynevent_cmd *cmd,
 404                                       const char *name,
 405                                       struct module *mod, ...);
 406
 407#define synth_event_gen_cmd_start(cmd, name, mod, ...)  \
 408        __synth_event_gen_cmd_start(cmd, name, mod, ## __VA_ARGS__, NULL)
 409
 410struct synth_field_desc {
 411        const char *type;
 412        const char *name;
 413};
 414
 415extern int synth_event_gen_cmd_array_start(struct dynevent_cmd *cmd,
 416                                           const char *name,
 417                                           struct module *mod,
 418                                           struct synth_field_desc *fields,
 419                                           unsigned int n_fields);
 420extern int synth_event_create(const char *name,
 421                              struct synth_field_desc *fields,
 422                              unsigned int n_fields, struct module *mod);
 423
 424extern int synth_event_add_field(struct dynevent_cmd *cmd,
 425                                 const char *type,
 426                                 const char *name);
 427extern int synth_event_add_field_str(struct dynevent_cmd *cmd,
 428                                     const char *type_name);
 429extern int synth_event_add_fields(struct dynevent_cmd *cmd,
 430                                  struct synth_field_desc *fields,
 431                                  unsigned int n_fields);
 432
 433#define synth_event_gen_cmd_end(cmd)    \
 434        dynevent_create(cmd)
 435
 436struct synth_event;
 437
 438struct synth_event_trace_state {
 439        struct trace_event_buffer fbuffer;
 440        struct synth_trace_event *entry;
 441        struct trace_buffer *buffer;
 442        struct synth_event *event;
 443        unsigned int cur_field;
 444        unsigned int n_u64;
 445        bool disabled;
 446        bool add_next;
 447        bool add_name;
 448};
 449
 450extern int synth_event_trace(struct trace_event_file *file,
 451                             unsigned int n_vals, ...);
 452extern int synth_event_trace_array(struct trace_event_file *file, u64 *vals,
 453                                   unsigned int n_vals);
 454extern int synth_event_trace_start(struct trace_event_file *file,
 455                                   struct synth_event_trace_state *trace_state);
 456extern int synth_event_add_next_val(u64 val,
 457                                    struct synth_event_trace_state *trace_state);
 458extern int synth_event_add_val(const char *field_name, u64 val,
 459                               struct synth_event_trace_state *trace_state);
 460extern int synth_event_trace_end(struct synth_event_trace_state *trace_state);
 461
 462extern int kprobe_event_delete(const char *name);
 463
 464extern void kprobe_event_cmd_init(struct dynevent_cmd *cmd,
 465                                  char *buf, int maxlen);
 466
 467#define kprobe_event_gen_cmd_start(cmd, name, loc, ...)                 \
 468        __kprobe_event_gen_cmd_start(cmd, false, name, loc, ## __VA_ARGS__, NULL)
 469
 470#define kretprobe_event_gen_cmd_start(cmd, name, loc, ...)              \
 471        __kprobe_event_gen_cmd_start(cmd, true, name, loc, ## __VA_ARGS__, NULL)
 472
 473extern int __kprobe_event_gen_cmd_start(struct dynevent_cmd *cmd,
 474                                        bool kretprobe,
 475                                        const char *name,
 476                                        const char *loc, ...);
 477
 478#define kprobe_event_add_fields(cmd, ...)       \
 479        __kprobe_event_add_fields(cmd, ## __VA_ARGS__, NULL)
 480
 481#define kprobe_event_add_field(cmd, field)      \
 482        __kprobe_event_add_fields(cmd, field, NULL)
 483
 484extern int __kprobe_event_add_fields(struct dynevent_cmd *cmd, ...);
 485
 486#define kprobe_event_gen_cmd_end(cmd)           \
 487        dynevent_create(cmd)
 488
 489#define kretprobe_event_gen_cmd_end(cmd)        \
 490        dynevent_create(cmd)
 491
 492/*
 493 * Event file flags:
 494 *  ENABLED       - The event is enabled
 495 *  RECORDED_CMD  - The comms should be recorded at sched_switch
 496 *  RECORDED_TGID - The tgids should be recorded at sched_switch
 497 *  FILTERED      - The event has a filter attached
 498 *  NO_SET_FILTER - Set when filter has error and is to be ignored
 499 *  SOFT_MODE     - The event is enabled/disabled by SOFT_DISABLED
 500 *  SOFT_DISABLED - When set, do not trace the event (even though its
 501 *                   tracepoint may be enabled)
 502 *  TRIGGER_MODE  - When set, invoke the triggers associated with the event
 503 *  TRIGGER_COND  - When set, one or more triggers has an associated filter
 504 *  PID_FILTER    - When set, the event is filtered based on pid
 505 *  WAS_ENABLED   - Set when enabled to know to clear trace on module removal
 506 */
 507enum {
 508        EVENT_FILE_FL_ENABLED           = (1 << EVENT_FILE_FL_ENABLED_BIT),
 509        EVENT_FILE_FL_RECORDED_CMD      = (1 << EVENT_FILE_FL_RECORDED_CMD_BIT),
 510        EVENT_FILE_FL_RECORDED_TGID     = (1 << EVENT_FILE_FL_RECORDED_TGID_BIT),
 511        EVENT_FILE_FL_FILTERED          = (1 << EVENT_FILE_FL_FILTERED_BIT),
 512        EVENT_FILE_FL_NO_SET_FILTER     = (1 << EVENT_FILE_FL_NO_SET_FILTER_BIT),
 513        EVENT_FILE_FL_SOFT_MODE         = (1 << EVENT_FILE_FL_SOFT_MODE_BIT),
 514        EVENT_FILE_FL_SOFT_DISABLED     = (1 << EVENT_FILE_FL_SOFT_DISABLED_BIT),
 515        EVENT_FILE_FL_TRIGGER_MODE      = (1 << EVENT_FILE_FL_TRIGGER_MODE_BIT),
 516        EVENT_FILE_FL_TRIGGER_COND      = (1 << EVENT_FILE_FL_TRIGGER_COND_BIT),
 517        EVENT_FILE_FL_PID_FILTER        = (1 << EVENT_FILE_FL_PID_FILTER_BIT),
 518        EVENT_FILE_FL_WAS_ENABLED       = (1 << EVENT_FILE_FL_WAS_ENABLED_BIT),
 519};
 520
 521struct trace_event_file {
 522        struct list_head                list;
 523        struct trace_event_call         *event_call;
 524        struct event_filter __rcu       *filter;
 525        struct dentry                   *dir;
 526        struct trace_array              *tr;
 527        struct trace_subsystem_dir      *system;
 528        struct list_head                triggers;
 529
 530        /*
 531         * 32 bit flags:
 532         *   bit 0:             enabled
 533         *   bit 1:             enabled cmd record
 534         *   bit 2:             enable/disable with the soft disable bit
 535         *   bit 3:             soft disabled
 536         *   bit 4:             trigger enabled
 537         *
 538         * Note: The bits must be set atomically to prevent races
 539         * from other writers. Reads of flags do not need to be in
 540         * sync as they occur in critical sections. But the way flags
 541         * is currently used, these changes do not affect the code
 542         * except that when a change is made, it may have a slight
 543         * delay in propagating the changes to other CPUs due to
 544         * caching and such. Which is mostly OK ;-)
 545         */
 546        unsigned long           flags;
 547        atomic_t                sm_ref; /* soft-mode reference counter */
 548        atomic_t                tm_ref; /* trigger-mode reference counter */
 549};
 550
 551#define __TRACE_EVENT_FLAGS(name, value)                                \
 552        static int __init trace_init_flags_##name(void)                 \
 553        {                                                               \
 554                event_##name.flags |= value;                            \
 555                return 0;                                               \
 556        }                                                               \
 557        early_initcall(trace_init_flags_##name);
 558
 559#define __TRACE_EVENT_PERF_PERM(name, expr...)                          \
 560        static int perf_perm_##name(struct trace_event_call *tp_event, \
 561                                    struct perf_event *p_event)         \
 562        {                                                               \
 563                return ({ expr; });                                     \
 564        }                                                               \
 565        static int __init trace_init_perf_perm_##name(void)             \
 566        {                                                               \
 567                event_##name.perf_perm = &perf_perm_##name;             \
 568                return 0;                                               \
 569        }                                                               \
 570        early_initcall(trace_init_perf_perm_##name);
 571
 572#define PERF_MAX_TRACE_SIZE     2048
 573
 574#define MAX_FILTER_STR_VAL      256     /* Should handle KSYM_SYMBOL_LEN */
 575
 576enum event_trigger_type {
 577        ETT_NONE                = (0),
 578        ETT_TRACE_ONOFF         = (1 << 0),
 579        ETT_SNAPSHOT            = (1 << 1),
 580        ETT_STACKTRACE          = (1 << 2),
 581        ETT_EVENT_ENABLE        = (1 << 3),
 582        ETT_EVENT_HIST          = (1 << 4),
 583        ETT_HIST_ENABLE         = (1 << 5),
 584};
 585
 586extern int filter_match_preds(struct event_filter *filter, void *rec);
 587
 588extern enum event_trigger_type
 589event_triggers_call(struct trace_event_file *file, void *rec,
 590                    struct ring_buffer_event *event);
 591extern void
 592event_triggers_post_call(struct trace_event_file *file,
 593                         enum event_trigger_type tt);
 594
 595bool trace_event_ignore_this_pid(struct trace_event_file *trace_file);
 596
 597/**
 598 * trace_trigger_soft_disabled - do triggers and test if soft disabled
 599 * @file: The file pointer of the event to test
 600 *
 601 * If any triggers without filters are attached to this event, they
 602 * will be called here. If the event is soft disabled and has no
 603 * triggers that require testing the fields, it will return true,
 604 * otherwise false.
 605 */
 606static inline bool
 607trace_trigger_soft_disabled(struct trace_event_file *file)
 608{
 609        unsigned long eflags = file->flags;
 610
 611        if (!(eflags & EVENT_FILE_FL_TRIGGER_COND)) {
 612                if (eflags & EVENT_FILE_FL_TRIGGER_MODE)
 613                        event_triggers_call(file, NULL, NULL);
 614                if (eflags & EVENT_FILE_FL_SOFT_DISABLED)
 615                        return true;
 616                if (eflags & EVENT_FILE_FL_PID_FILTER)
 617                        return trace_event_ignore_this_pid(file);
 618        }
 619        return false;
 620}
 621
 622#ifdef CONFIG_BPF_EVENTS
 623unsigned int trace_call_bpf(struct trace_event_call *call, void *ctx);
 624int perf_event_attach_bpf_prog(struct perf_event *event, struct bpf_prog *prog);
 625void perf_event_detach_bpf_prog(struct perf_event *event);
 626int perf_event_query_prog_array(struct perf_event *event, void __user *info);
 627int bpf_probe_register(struct bpf_raw_event_map *btp, struct bpf_prog *prog);
 628int bpf_probe_unregister(struct bpf_raw_event_map *btp, struct bpf_prog *prog);
 629struct bpf_raw_event_map *bpf_get_raw_tracepoint(const char *name);
 630void bpf_put_raw_tracepoint(struct bpf_raw_event_map *btp);
 631int bpf_get_perf_event_info(const struct perf_event *event, u32 *prog_id,
 632                            u32 *fd_type, const char **buf,
 633                            u64 *probe_offset, u64 *probe_addr);
 634#else
 635static inline unsigned int trace_call_bpf(struct trace_event_call *call, void *ctx)
 636{
 637        return 1;
 638}
 639
 640static inline int
 641perf_event_attach_bpf_prog(struct perf_event *event, struct bpf_prog *prog)
 642{
 643        return -EOPNOTSUPP;
 644}
 645
 646static inline void perf_event_detach_bpf_prog(struct perf_event *event) { }
 647
 648static inline int
 649perf_event_query_prog_array(struct perf_event *event, void __user *info)
 650{
 651        return -EOPNOTSUPP;
 652}
 653static inline int bpf_probe_register(struct bpf_raw_event_map *btp, struct bpf_prog *p)
 654{
 655        return -EOPNOTSUPP;
 656}
 657static inline int bpf_probe_unregister(struct bpf_raw_event_map *btp, struct bpf_prog *p)
 658{
 659        return -EOPNOTSUPP;
 660}
 661static inline struct bpf_raw_event_map *bpf_get_raw_tracepoint(const char *name)
 662{
 663        return NULL;
 664}
 665static inline void bpf_put_raw_tracepoint(struct bpf_raw_event_map *btp)
 666{
 667}
 668static inline int bpf_get_perf_event_info(const struct perf_event *event,
 669                                          u32 *prog_id, u32 *fd_type,
 670                                          const char **buf, u64 *probe_offset,
 671                                          u64 *probe_addr)
 672{
 673        return -EOPNOTSUPP;
 674}
 675#endif
 676
 677enum {
 678        FILTER_OTHER = 0,
 679        FILTER_STATIC_STRING,
 680        FILTER_DYN_STRING,
 681        FILTER_PTR_STRING,
 682        FILTER_TRACE_FN,
 683        FILTER_COMM,
 684        FILTER_CPU,
 685};
 686
 687extern int trace_event_raw_init(struct trace_event_call *call);
 688extern int trace_define_field(struct trace_event_call *call, const char *type,
 689                              const char *name, int offset, int size,
 690                              int is_signed, int filter_type);
 691extern int trace_add_event_call(struct trace_event_call *call);
 692extern int trace_remove_event_call(struct trace_event_call *call);
 693extern int trace_event_get_offsets(struct trace_event_call *call);
 694
 695#define is_signed_type(type)    (((type)(-1)) < (type)1)
 696
 697int ftrace_set_clr_event(struct trace_array *tr, char *buf, int set);
 698int trace_set_clr_event(const char *system, const char *event, int set);
 699int trace_array_set_clr_event(struct trace_array *tr, const char *system,
 700                const char *event, bool enable);
 701/*
 702 * The double __builtin_constant_p is because gcc will give us an error
 703 * if we try to allocate the static variable to fmt if it is not a
 704 * constant. Even with the outer if statement optimizing out.
 705 */
 706#define event_trace_printk(ip, fmt, args...)                            \
 707do {                                                                    \
 708        __trace_printk_check_format(fmt, ##args);                       \
 709        tracing_record_cmdline(current);                                \
 710        if (__builtin_constant_p(fmt)) {                                \
 711                static const char *trace_printk_fmt                     \
 712                  __attribute__((section("__trace_printk_fmt"))) =      \
 713                        __builtin_constant_p(fmt) ? fmt : NULL;         \
 714                                                                        \
 715                __trace_bprintk(ip, trace_printk_fmt, ##args);          \
 716        } else                                                          \
 717                __trace_printk(ip, fmt, ##args);                        \
 718} while (0)
 719
 720#ifdef CONFIG_PERF_EVENTS
 721struct perf_event;
 722
 723DECLARE_PER_CPU(struct pt_regs, perf_trace_regs);
 724DECLARE_PER_CPU(int, bpf_kprobe_override);
 725
 726extern int  perf_trace_init(struct perf_event *event);
 727extern void perf_trace_destroy(struct perf_event *event);
 728extern int  perf_trace_add(struct perf_event *event, int flags);
 729extern void perf_trace_del(struct perf_event *event, int flags);
 730#ifdef CONFIG_KPROBE_EVENTS
 731extern int  perf_kprobe_init(struct perf_event *event, bool is_retprobe);
 732extern void perf_kprobe_destroy(struct perf_event *event);
 733extern int bpf_get_kprobe_info(const struct perf_event *event,
 734                               u32 *fd_type, const char **symbol,
 735                               u64 *probe_offset, u64 *probe_addr,
 736                               bool perf_type_tracepoint);
 737#endif
 738#ifdef CONFIG_UPROBE_EVENTS
 739extern int  perf_uprobe_init(struct perf_event *event,
 740                             unsigned long ref_ctr_offset, bool is_retprobe);
 741extern void perf_uprobe_destroy(struct perf_event *event);
 742extern int bpf_get_uprobe_info(const struct perf_event *event,
 743                               u32 *fd_type, const char **filename,
 744                               u64 *probe_offset, bool perf_type_tracepoint);
 745#endif
 746extern int  ftrace_profile_set_filter(struct perf_event *event, int event_id,
 747                                     char *filter_str);
 748extern void ftrace_profile_free_filter(struct perf_event *event);
 749void perf_trace_buf_update(void *record, u16 type);
 750void *perf_trace_buf_alloc(int size, struct pt_regs **regs, int *rctxp);
 751
 752void bpf_trace_run1(struct bpf_prog *prog, u64 arg1);
 753void bpf_trace_run2(struct bpf_prog *prog, u64 arg1, u64 arg2);
 754void bpf_trace_run3(struct bpf_prog *prog, u64 arg1, u64 arg2,
 755                    u64 arg3);
 756void bpf_trace_run4(struct bpf_prog *prog, u64 arg1, u64 arg2,
 757                    u64 arg3, u64 arg4);
 758void bpf_trace_run5(struct bpf_prog *prog, u64 arg1, u64 arg2,
 759                    u64 arg3, u64 arg4, u64 arg5);
 760void bpf_trace_run6(struct bpf_prog *prog, u64 arg1, u64 arg2,
 761                    u64 arg3, u64 arg4, u64 arg5, u64 arg6);
 762void bpf_trace_run7(struct bpf_prog *prog, u64 arg1, u64 arg2,
 763                    u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7);
 764void bpf_trace_run8(struct bpf_prog *prog, u64 arg1, u64 arg2,
 765                    u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
 766                    u64 arg8);
 767void bpf_trace_run9(struct bpf_prog *prog, u64 arg1, u64 arg2,
 768                    u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
 769                    u64 arg8, u64 arg9);
 770void bpf_trace_run10(struct bpf_prog *prog, u64 arg1, u64 arg2,
 771                     u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
 772                     u64 arg8, u64 arg9, u64 arg10);
 773void bpf_trace_run11(struct bpf_prog *prog, u64 arg1, u64 arg2,
 774                     u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
 775                     u64 arg8, u64 arg9, u64 arg10, u64 arg11);
 776void bpf_trace_run12(struct bpf_prog *prog, u64 arg1, u64 arg2,
 777                     u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
 778                     u64 arg8, u64 arg9, u64 arg10, u64 arg11, u64 arg12);
 779void perf_trace_run_bpf_submit(void *raw_data, int size, int rctx,
 780                               struct trace_event_call *call, u64 count,
 781                               struct pt_regs *regs, struct hlist_head *head,
 782                               struct task_struct *task);
 783
 784static inline void
 785perf_trace_buf_submit(void *raw_data, int size, int rctx, u16 type,
 786                       u64 count, struct pt_regs *regs, void *head,
 787                       struct task_struct *task)
 788{
 789        perf_tp_event(type, count, raw_data, size, regs, head, rctx, task);
 790}
 791
 792#endif
 793
 794#endif /* _LINUX_TRACE_EVENT_H */
 795