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