Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.31-rc2 760 lines 19 kB view raw
1/* 2 * Performance counters: 3 * 4 * Copyright (C) 2008-2009, Thomas Gleixner <tglx@linutronix.de> 5 * Copyright (C) 2008-2009, Red Hat, Inc., Ingo Molnar 6 * Copyright (C) 2008-2009, Red Hat, Inc., Peter Zijlstra 7 * 8 * Data type definitions, declarations, prototypes. 9 * 10 * Started by: Thomas Gleixner and Ingo Molnar 11 * 12 * For licencing details see kernel-base/COPYING 13 */ 14#ifndef _LINUX_PERF_COUNTER_H 15#define _LINUX_PERF_COUNTER_H 16 17#include <linux/types.h> 18#include <linux/ioctl.h> 19#include <asm/byteorder.h> 20 21/* 22 * User-space ABI bits: 23 */ 24 25/* 26 * attr.type 27 */ 28enum perf_type_id { 29 PERF_TYPE_HARDWARE = 0, 30 PERF_TYPE_SOFTWARE = 1, 31 PERF_TYPE_TRACEPOINT = 2, 32 PERF_TYPE_HW_CACHE = 3, 33 PERF_TYPE_RAW = 4, 34 35 PERF_TYPE_MAX, /* non-ABI */ 36}; 37 38/* 39 * Generalized performance counter event types, used by the 40 * attr.event_id parameter of the sys_perf_counter_open() 41 * syscall: 42 */ 43enum perf_hw_id { 44 /* 45 * Common hardware events, generalized by the kernel: 46 */ 47 PERF_COUNT_HW_CPU_CYCLES = 0, 48 PERF_COUNT_HW_INSTRUCTIONS = 1, 49 PERF_COUNT_HW_CACHE_REFERENCES = 2, 50 PERF_COUNT_HW_CACHE_MISSES = 3, 51 PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 4, 52 PERF_COUNT_HW_BRANCH_MISSES = 5, 53 PERF_COUNT_HW_BUS_CYCLES = 6, 54 55 PERF_COUNT_HW_MAX, /* non-ABI */ 56}; 57 58/* 59 * Generalized hardware cache counters: 60 * 61 * { L1-D, L1-I, LLC, ITLB, DTLB, BPU } x 62 * { read, write, prefetch } x 63 * { accesses, misses } 64 */ 65enum perf_hw_cache_id { 66 PERF_COUNT_HW_CACHE_L1D = 0, 67 PERF_COUNT_HW_CACHE_L1I = 1, 68 PERF_COUNT_HW_CACHE_LL = 2, 69 PERF_COUNT_HW_CACHE_DTLB = 3, 70 PERF_COUNT_HW_CACHE_ITLB = 4, 71 PERF_COUNT_HW_CACHE_BPU = 5, 72 73 PERF_COUNT_HW_CACHE_MAX, /* non-ABI */ 74}; 75 76enum perf_hw_cache_op_id { 77 PERF_COUNT_HW_CACHE_OP_READ = 0, 78 PERF_COUNT_HW_CACHE_OP_WRITE = 1, 79 PERF_COUNT_HW_CACHE_OP_PREFETCH = 2, 80 81 PERF_COUNT_HW_CACHE_OP_MAX, /* non-ABI */ 82}; 83 84enum perf_hw_cache_op_result_id { 85 PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0, 86 PERF_COUNT_HW_CACHE_RESULT_MISS = 1, 87 88 PERF_COUNT_HW_CACHE_RESULT_MAX, /* non-ABI */ 89}; 90 91/* 92 * Special "software" counters provided by the kernel, even if the hardware 93 * does not support performance counters. These counters measure various 94 * physical and sw events of the kernel (and allow the profiling of them as 95 * well): 96 */ 97enum perf_sw_ids { 98 PERF_COUNT_SW_CPU_CLOCK = 0, 99 PERF_COUNT_SW_TASK_CLOCK = 1, 100 PERF_COUNT_SW_PAGE_FAULTS = 2, 101 PERF_COUNT_SW_CONTEXT_SWITCHES = 3, 102 PERF_COUNT_SW_CPU_MIGRATIONS = 4, 103 PERF_COUNT_SW_PAGE_FAULTS_MIN = 5, 104 PERF_COUNT_SW_PAGE_FAULTS_MAJ = 6, 105 106 PERF_COUNT_SW_MAX, /* non-ABI */ 107}; 108 109/* 110 * Bits that can be set in attr.sample_type to request information 111 * in the overflow packets. 112 */ 113enum perf_counter_sample_format { 114 PERF_SAMPLE_IP = 1U << 0, 115 PERF_SAMPLE_TID = 1U << 1, 116 PERF_SAMPLE_TIME = 1U << 2, 117 PERF_SAMPLE_ADDR = 1U << 3, 118 PERF_SAMPLE_GROUP = 1U << 4, 119 PERF_SAMPLE_CALLCHAIN = 1U << 5, 120 PERF_SAMPLE_ID = 1U << 6, 121 PERF_SAMPLE_CPU = 1U << 7, 122 PERF_SAMPLE_PERIOD = 1U << 8, 123 124 PERF_SAMPLE_MAX = 1U << 9, /* non-ABI */ 125}; 126 127/* 128 * Bits that can be set in attr.read_format to request that 129 * reads on the counter should return the indicated quantities, 130 * in increasing order of bit value, after the counter value. 131 */ 132enum perf_counter_read_format { 133 PERF_FORMAT_TOTAL_TIME_ENABLED = 1U << 0, 134 PERF_FORMAT_TOTAL_TIME_RUNNING = 1U << 1, 135 PERF_FORMAT_ID = 1U << 2, 136 137 PERF_FORMAT_MAX = 1U << 3, /* non-ABI */ 138}; 139 140#define PERF_ATTR_SIZE_VER0 64 /* sizeof first published struct */ 141 142/* 143 * Hardware event to monitor via a performance monitoring counter: 144 */ 145struct perf_counter_attr { 146 147 /* 148 * Major type: hardware/software/tracepoint/etc. 149 */ 150 __u32 type; 151 152 /* 153 * Size of the attr structure, for fwd/bwd compat. 154 */ 155 __u32 size; 156 157 /* 158 * Type specific configuration information. 159 */ 160 __u64 config; 161 162 union { 163 __u64 sample_period; 164 __u64 sample_freq; 165 }; 166 167 __u64 sample_type; 168 __u64 read_format; 169 170 __u64 disabled : 1, /* off by default */ 171 inherit : 1, /* children inherit it */ 172 pinned : 1, /* must always be on PMU */ 173 exclusive : 1, /* only group on PMU */ 174 exclude_user : 1, /* don't count user */ 175 exclude_kernel : 1, /* ditto kernel */ 176 exclude_hv : 1, /* ditto hypervisor */ 177 exclude_idle : 1, /* don't count when idle */ 178 mmap : 1, /* include mmap data */ 179 comm : 1, /* include comm data */ 180 freq : 1, /* use freq, not period */ 181 inherit_stat : 1, /* per task counts */ 182 enable_on_exec : 1, /* next exec enables */ 183 184 __reserved_1 : 51; 185 186 __u32 wakeup_events; /* wakeup every n events */ 187 __u32 __reserved_2; 188 189 __u64 __reserved_3; 190}; 191 192/* 193 * Ioctls that can be done on a perf counter fd: 194 */ 195#define PERF_COUNTER_IOC_ENABLE _IO ('$', 0) 196#define PERF_COUNTER_IOC_DISABLE _IO ('$', 1) 197#define PERF_COUNTER_IOC_REFRESH _IO ('$', 2) 198#define PERF_COUNTER_IOC_RESET _IO ('$', 3) 199#define PERF_COUNTER_IOC_PERIOD _IOW('$', 4, u64) 200 201enum perf_counter_ioc_flags { 202 PERF_IOC_FLAG_GROUP = 1U << 0, 203}; 204 205/* 206 * Structure of the page that can be mapped via mmap 207 */ 208struct perf_counter_mmap_page { 209 __u32 version; /* version number of this structure */ 210 __u32 compat_version; /* lowest version this is compat with */ 211 212 /* 213 * Bits needed to read the hw counters in user-space. 214 * 215 * u32 seq; 216 * s64 count; 217 * 218 * do { 219 * seq = pc->lock; 220 * 221 * barrier() 222 * if (pc->index) { 223 * count = pmc_read(pc->index - 1); 224 * count += pc->offset; 225 * } else 226 * goto regular_read; 227 * 228 * barrier(); 229 * } while (pc->lock != seq); 230 * 231 * NOTE: for obvious reason this only works on self-monitoring 232 * processes. 233 */ 234 __u32 lock; /* seqlock for synchronization */ 235 __u32 index; /* hardware counter identifier */ 236 __s64 offset; /* add to hardware counter value */ 237 __u64 time_enabled; /* time counter active */ 238 __u64 time_running; /* time counter on cpu */ 239 240 /* 241 * Hole for extension of the self monitor capabilities 242 */ 243 244 __u64 __reserved[123]; /* align to 1k */ 245 246 /* 247 * Control data for the mmap() data buffer. 248 * 249 * User-space reading the @data_head value should issue an rmb(), on 250 * SMP capable platforms, after reading this value -- see 251 * perf_counter_wakeup(). 252 * 253 * When the mapping is PROT_WRITE the @data_tail value should be 254 * written by userspace to reflect the last read data. In this case 255 * the kernel will not over-write unread data. 256 */ 257 __u64 data_head; /* head in the data section */ 258 __u64 data_tail; /* user-space written tail */ 259}; 260 261#define PERF_EVENT_MISC_CPUMODE_MASK (3 << 0) 262#define PERF_EVENT_MISC_CPUMODE_UNKNOWN (0 << 0) 263#define PERF_EVENT_MISC_KERNEL (1 << 0) 264#define PERF_EVENT_MISC_USER (2 << 0) 265#define PERF_EVENT_MISC_HYPERVISOR (3 << 0) 266 267struct perf_event_header { 268 __u32 type; 269 __u16 misc; 270 __u16 size; 271}; 272 273enum perf_event_type { 274 275 /* 276 * The MMAP events record the PROT_EXEC mappings so that we can 277 * correlate userspace IPs to code. They have the following structure: 278 * 279 * struct { 280 * struct perf_event_header header; 281 * 282 * u32 pid, tid; 283 * u64 addr; 284 * u64 len; 285 * u64 pgoff; 286 * char filename[]; 287 * }; 288 */ 289 PERF_EVENT_MMAP = 1, 290 291 /* 292 * struct { 293 * struct perf_event_header header; 294 * u64 id; 295 * u64 lost; 296 * }; 297 */ 298 PERF_EVENT_LOST = 2, 299 300 /* 301 * struct { 302 * struct perf_event_header header; 303 * 304 * u32 pid, tid; 305 * char comm[]; 306 * }; 307 */ 308 PERF_EVENT_COMM = 3, 309 310 /* 311 * struct { 312 * struct perf_event_header header; 313 * u64 time; 314 * u64 id; 315 * u64 sample_period; 316 * }; 317 */ 318 PERF_EVENT_PERIOD = 4, 319 320 /* 321 * struct { 322 * struct perf_event_header header; 323 * u64 time; 324 * u64 id; 325 * }; 326 */ 327 PERF_EVENT_THROTTLE = 5, 328 PERF_EVENT_UNTHROTTLE = 6, 329 330 /* 331 * struct { 332 * struct perf_event_header header; 333 * u32 pid, ppid; 334 * }; 335 */ 336 PERF_EVENT_FORK = 7, 337 338 /* 339 * struct { 340 * struct perf_event_header header; 341 * u32 pid, tid; 342 * u64 value; 343 * { u64 time_enabled; } && PERF_FORMAT_ENABLED 344 * { u64 time_running; } && PERF_FORMAT_RUNNING 345 * { u64 parent_id; } && PERF_FORMAT_ID 346 * }; 347 */ 348 PERF_EVENT_READ = 8, 349 350 /* 351 * struct { 352 * struct perf_event_header header; 353 * 354 * { u64 ip; } && PERF_SAMPLE_IP 355 * { u32 pid, tid; } && PERF_SAMPLE_TID 356 * { u64 time; } && PERF_SAMPLE_TIME 357 * { u64 addr; } && PERF_SAMPLE_ADDR 358 * { u64 id; } && PERF_SAMPLE_ID 359 * { u32 cpu, res; } && PERF_SAMPLE_CPU 360 * { u64 period; } && PERF_SAMPLE_PERIOD 361 * 362 * { u64 nr; 363 * { u64 id, val; } cnt[nr]; } && PERF_SAMPLE_GROUP 364 * 365 * { u64 nr, 366 * u64 ips[nr]; } && PERF_SAMPLE_CALLCHAIN 367 * }; 368 */ 369 PERF_EVENT_SAMPLE = 9, 370 371 PERF_EVENT_MAX, /* non-ABI */ 372}; 373 374enum perf_callchain_context { 375 PERF_CONTEXT_HV = (__u64)-32, 376 PERF_CONTEXT_KERNEL = (__u64)-128, 377 PERF_CONTEXT_USER = (__u64)-512, 378 379 PERF_CONTEXT_GUEST = (__u64)-2048, 380 PERF_CONTEXT_GUEST_KERNEL = (__u64)-2176, 381 PERF_CONTEXT_GUEST_USER = (__u64)-2560, 382 383 PERF_CONTEXT_MAX = (__u64)-4095, 384}; 385 386#ifdef __KERNEL__ 387/* 388 * Kernel-internal data types and definitions: 389 */ 390 391#ifdef CONFIG_PERF_COUNTERS 392# include <asm/perf_counter.h> 393#endif 394 395#include <linux/list.h> 396#include <linux/mutex.h> 397#include <linux/rculist.h> 398#include <linux/rcupdate.h> 399#include <linux/spinlock.h> 400#include <linux/hrtimer.h> 401#include <linux/fs.h> 402#include <linux/pid_namespace.h> 403#include <asm/atomic.h> 404 405#define PERF_MAX_STACK_DEPTH 255 406 407struct perf_callchain_entry { 408 __u64 nr; 409 __u64 ip[PERF_MAX_STACK_DEPTH]; 410}; 411 412struct task_struct; 413 414/** 415 * struct hw_perf_counter - performance counter hardware details: 416 */ 417struct hw_perf_counter { 418#ifdef CONFIG_PERF_COUNTERS 419 union { 420 struct { /* hardware */ 421 u64 config; 422 unsigned long config_base; 423 unsigned long counter_base; 424 int idx; 425 }; 426 union { /* software */ 427 atomic64_t count; 428 struct hrtimer hrtimer; 429 }; 430 }; 431 atomic64_t prev_count; 432 u64 sample_period; 433 u64 last_period; 434 atomic64_t period_left; 435 u64 interrupts; 436 437 u64 freq_count; 438 u64 freq_interrupts; 439 u64 freq_stamp; 440#endif 441}; 442 443struct perf_counter; 444 445/** 446 * struct pmu - generic performance monitoring unit 447 */ 448struct pmu { 449 int (*enable) (struct perf_counter *counter); 450 void (*disable) (struct perf_counter *counter); 451 void (*read) (struct perf_counter *counter); 452 void (*unthrottle) (struct perf_counter *counter); 453}; 454 455/** 456 * enum perf_counter_active_state - the states of a counter 457 */ 458enum perf_counter_active_state { 459 PERF_COUNTER_STATE_ERROR = -2, 460 PERF_COUNTER_STATE_OFF = -1, 461 PERF_COUNTER_STATE_INACTIVE = 0, 462 PERF_COUNTER_STATE_ACTIVE = 1, 463}; 464 465struct file; 466 467struct perf_mmap_data { 468 struct rcu_head rcu_head; 469 int nr_pages; /* nr of data pages */ 470 int writable; /* are we writable */ 471 int nr_locked; /* nr pages mlocked */ 472 473 atomic_t poll; /* POLL_ for wakeups */ 474 atomic_t events; /* event limit */ 475 476 atomic_long_t head; /* write position */ 477 atomic_long_t done_head; /* completed head */ 478 479 atomic_t lock; /* concurrent writes */ 480 atomic_t wakeup; /* needs a wakeup */ 481 atomic_t lost; /* nr records lost */ 482 483 struct perf_counter_mmap_page *user_page; 484 void *data_pages[0]; 485}; 486 487struct perf_pending_entry { 488 struct perf_pending_entry *next; 489 void (*func)(struct perf_pending_entry *); 490}; 491 492/** 493 * struct perf_counter - performance counter kernel representation: 494 */ 495struct perf_counter { 496#ifdef CONFIG_PERF_COUNTERS 497 struct list_head list_entry; 498 struct list_head event_entry; 499 struct list_head sibling_list; 500 int nr_siblings; 501 struct perf_counter *group_leader; 502 const struct pmu *pmu; 503 504 enum perf_counter_active_state state; 505 atomic64_t count; 506 507 /* 508 * These are the total time in nanoseconds that the counter 509 * has been enabled (i.e. eligible to run, and the task has 510 * been scheduled in, if this is a per-task counter) 511 * and running (scheduled onto the CPU), respectively. 512 * 513 * They are computed from tstamp_enabled, tstamp_running and 514 * tstamp_stopped when the counter is in INACTIVE or ACTIVE state. 515 */ 516 u64 total_time_enabled; 517 u64 total_time_running; 518 519 /* 520 * These are timestamps used for computing total_time_enabled 521 * and total_time_running when the counter is in INACTIVE or 522 * ACTIVE state, measured in nanoseconds from an arbitrary point 523 * in time. 524 * tstamp_enabled: the notional time when the counter was enabled 525 * tstamp_running: the notional time when the counter was scheduled on 526 * tstamp_stopped: in INACTIVE state, the notional time when the 527 * counter was scheduled off. 528 */ 529 u64 tstamp_enabled; 530 u64 tstamp_running; 531 u64 tstamp_stopped; 532 533 struct perf_counter_attr attr; 534 struct hw_perf_counter hw; 535 536 struct perf_counter_context *ctx; 537 struct file *filp; 538 539 /* 540 * These accumulate total time (in nanoseconds) that children 541 * counters have been enabled and running, respectively. 542 */ 543 atomic64_t child_total_time_enabled; 544 atomic64_t child_total_time_running; 545 546 /* 547 * Protect attach/detach and child_list: 548 */ 549 struct mutex child_mutex; 550 struct list_head child_list; 551 struct perf_counter *parent; 552 553 int oncpu; 554 int cpu; 555 556 struct list_head owner_entry; 557 struct task_struct *owner; 558 559 /* mmap bits */ 560 struct mutex mmap_mutex; 561 atomic_t mmap_count; 562 struct perf_mmap_data *data; 563 564 /* poll related */ 565 wait_queue_head_t waitq; 566 struct fasync_struct *fasync; 567 568 /* delayed work for NMIs and such */ 569 int pending_wakeup; 570 int pending_kill; 571 int pending_disable; 572 struct perf_pending_entry pending; 573 574 atomic_t event_limit; 575 576 void (*destroy)(struct perf_counter *); 577 struct rcu_head rcu_head; 578 579 struct pid_namespace *ns; 580 u64 id; 581#endif 582}; 583 584/** 585 * struct perf_counter_context - counter context structure 586 * 587 * Used as a container for task counters and CPU counters as well: 588 */ 589struct perf_counter_context { 590 /* 591 * Protect the states of the counters in the list, 592 * nr_active, and the list: 593 */ 594 spinlock_t lock; 595 /* 596 * Protect the list of counters. Locking either mutex or lock 597 * is sufficient to ensure the list doesn't change; to change 598 * the list you need to lock both the mutex and the spinlock. 599 */ 600 struct mutex mutex; 601 602 struct list_head counter_list; 603 struct list_head event_list; 604 int nr_counters; 605 int nr_active; 606 int is_active; 607 int nr_stat; 608 atomic_t refcount; 609 struct task_struct *task; 610 611 /* 612 * Context clock, runs when context enabled. 613 */ 614 u64 time; 615 u64 timestamp; 616 617 /* 618 * These fields let us detect when two contexts have both 619 * been cloned (inherited) from a common ancestor. 620 */ 621 struct perf_counter_context *parent_ctx; 622 u64 parent_gen; 623 u64 generation; 624 int pin_count; 625 struct rcu_head rcu_head; 626}; 627 628/** 629 * struct perf_counter_cpu_context - per cpu counter context structure 630 */ 631struct perf_cpu_context { 632 struct perf_counter_context ctx; 633 struct perf_counter_context *task_ctx; 634 int active_oncpu; 635 int max_pertask; 636 int exclusive; 637 638 /* 639 * Recursion avoidance: 640 * 641 * task, softirq, irq, nmi context 642 */ 643 int recursion[4]; 644}; 645 646#ifdef CONFIG_PERF_COUNTERS 647 648/* 649 * Set by architecture code: 650 */ 651extern int perf_max_counters; 652 653extern const struct pmu *hw_perf_counter_init(struct perf_counter *counter); 654 655extern void perf_counter_task_sched_in(struct task_struct *task, int cpu); 656extern void perf_counter_task_sched_out(struct task_struct *task, 657 struct task_struct *next, int cpu); 658extern void perf_counter_task_tick(struct task_struct *task, int cpu); 659extern int perf_counter_init_task(struct task_struct *child); 660extern void perf_counter_exit_task(struct task_struct *child); 661extern void perf_counter_free_task(struct task_struct *task); 662extern void set_perf_counter_pending(void); 663extern void perf_counter_do_pending(void); 664extern void perf_counter_print_debug(void); 665extern void __perf_disable(void); 666extern bool __perf_enable(void); 667extern void perf_disable(void); 668extern void perf_enable(void); 669extern int perf_counter_task_disable(void); 670extern int perf_counter_task_enable(void); 671extern int hw_perf_group_sched_in(struct perf_counter *group_leader, 672 struct perf_cpu_context *cpuctx, 673 struct perf_counter_context *ctx, int cpu); 674extern void perf_counter_update_userpage(struct perf_counter *counter); 675 676struct perf_sample_data { 677 struct pt_regs *regs; 678 u64 addr; 679 u64 period; 680}; 681 682extern int perf_counter_overflow(struct perf_counter *counter, int nmi, 683 struct perf_sample_data *data); 684 685/* 686 * Return 1 for a software counter, 0 for a hardware counter 687 */ 688static inline int is_software_counter(struct perf_counter *counter) 689{ 690 return (counter->attr.type != PERF_TYPE_RAW) && 691 (counter->attr.type != PERF_TYPE_HARDWARE) && 692 (counter->attr.type != PERF_TYPE_HW_CACHE); 693} 694 695extern atomic_t perf_swcounter_enabled[PERF_COUNT_SW_MAX]; 696 697extern void __perf_swcounter_event(u32, u64, int, struct pt_regs *, u64); 698 699static inline void 700perf_swcounter_event(u32 event, u64 nr, int nmi, struct pt_regs *regs, u64 addr) 701{ 702 if (atomic_read(&perf_swcounter_enabled[event])) 703 __perf_swcounter_event(event, nr, nmi, regs, addr); 704} 705 706extern void __perf_counter_mmap(struct vm_area_struct *vma); 707 708static inline void perf_counter_mmap(struct vm_area_struct *vma) 709{ 710 if (vma->vm_flags & VM_EXEC) 711 __perf_counter_mmap(vma); 712} 713 714extern void perf_counter_comm(struct task_struct *tsk); 715extern void perf_counter_fork(struct task_struct *tsk); 716 717extern struct perf_callchain_entry *perf_callchain(struct pt_regs *regs); 718 719extern int sysctl_perf_counter_paranoid; 720extern int sysctl_perf_counter_mlock; 721extern int sysctl_perf_counter_sample_rate; 722 723extern void perf_counter_init(void); 724 725#ifndef perf_misc_flags 726#define perf_misc_flags(regs) (user_mode(regs) ? PERF_EVENT_MISC_USER : \ 727 PERF_EVENT_MISC_KERNEL) 728#define perf_instruction_pointer(regs) instruction_pointer(regs) 729#endif 730 731#else 732static inline void 733perf_counter_task_sched_in(struct task_struct *task, int cpu) { } 734static inline void 735perf_counter_task_sched_out(struct task_struct *task, 736 struct task_struct *next, int cpu) { } 737static inline void 738perf_counter_task_tick(struct task_struct *task, int cpu) { } 739static inline int perf_counter_init_task(struct task_struct *child) { return 0; } 740static inline void perf_counter_exit_task(struct task_struct *child) { } 741static inline void perf_counter_free_task(struct task_struct *task) { } 742static inline void perf_counter_do_pending(void) { } 743static inline void perf_counter_print_debug(void) { } 744static inline void perf_disable(void) { } 745static inline void perf_enable(void) { } 746static inline int perf_counter_task_disable(void) { return -EINVAL; } 747static inline int perf_counter_task_enable(void) { return -EINVAL; } 748 749static inline void 750perf_swcounter_event(u32 event, u64 nr, int nmi, 751 struct pt_regs *regs, u64 addr) { } 752 753static inline void perf_counter_mmap(struct vm_area_struct *vma) { } 754static inline void perf_counter_comm(struct task_struct *tsk) { } 755static inline void perf_counter_fork(struct task_struct *tsk) { } 756static inline void perf_counter_init(void) { } 757#endif 758 759#endif /* __KERNEL__ */ 760#endif /* _LINUX_PERF_COUNTER_H */