1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Performance events: 3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Copyright (C) 2008-2009, Thomas Gleixner <tglx@linutronix.de> 5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Copyright (C) 2008-2011, Red Hat, Inc., Ingo Molnar 6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Copyright (C) 2008-2011, Red Hat, Inc., Peter Zijlstra 7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Data type definitions, declarations, prototypes. 9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Started by: Thomas Gleixner and Ingo Molnar 11e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 12e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * For licencing details see kernel-base/COPYING 13e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 14e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef _LINUX_PERF_EVENT_H 15e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define _LINUX_PERF_EVENT_H 16e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 177d82a4640abdcc3ffbd89c7971a11e4ac7953b7fBen Cheng/* ANDROID_CHANGE_BEGIN */ 187d82a4640abdcc3ffbd89c7971a11e4ac7953b7fBen Cheng#ifndef __APPLE__ 19097a574687b429a2f8ab7988308c7edb828156b6Andrew Hsieh/* Suppress kernel-name space pollution in <linux/types.h> below */ 20097a574687b429a2f8ab7988308c7edb828156b6Andrew Hsieh#include <features.h> 21e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/types.h> 22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/ioctl.h> 23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <asm/byteorder.h> 247d82a4640abdcc3ffbd89c7971a11e4ac7953b7fBen Cheng#else 257d82a4640abdcc3ffbd89c7971a11e4ac7953b7fBen Cheng#include "../types.h" 267d82a4640abdcc3ffbd89c7971a11e4ac7953b7fBen Cheng#endif 277d82a4640abdcc3ffbd89c7971a11e4ac7953b7fBen Cheng/* ANDROID_CHANGE_END */ 28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * User-space ABI bits: 31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * attr.type 35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengenum perf_type_id { 37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_TYPE_HARDWARE = 0, 38e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_TYPE_SOFTWARE = 1, 39e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_TYPE_TRACEPOINT = 2, 40e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_TYPE_HW_CACHE = 3, 41e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_TYPE_RAW = 4, 42e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_TYPE_BREAKPOINT = 5, 43e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 44e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_TYPE_MAX, /* non-ABI */ 45e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 46e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 47e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 48e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Generalized performance event event_id types, used by the 49e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * attr.event_id parameter of the sys_perf_event_open() 50e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * syscall: 51e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 52e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengenum perf_hw_id { 53e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 54e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Common hardware events, generalized by the kernel: 55e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 56e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_CPU_CYCLES = 0, 57e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_INSTRUCTIONS = 1, 58e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_CACHE_REFERENCES = 2, 59e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_CACHE_MISSES = 3, 60e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 4, 61e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_BRANCH_MISSES = 5, 62e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_BUS_CYCLES = 6, 63e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 7, 64e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 8, 65e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 66e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_MAX, /* non-ABI */ 67e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 68e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 69e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 70e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Generalized hardware cache events: 71e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 72e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { L1-D, L1-I, LLC, ITLB, DTLB, BPU } x 73e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { read, write, prefetch } x 74e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { accesses, misses } 75e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 76e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengenum perf_hw_cache_id { 77e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_CACHE_L1D = 0, 78e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_CACHE_L1I = 1, 79e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_CACHE_LL = 2, 80e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_CACHE_DTLB = 3, 81e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_CACHE_ITLB = 4, 82e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_CACHE_BPU = 5, 83e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 84e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_CACHE_MAX, /* non-ABI */ 85e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 86e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 87e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengenum perf_hw_cache_op_id { 88e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_CACHE_OP_READ = 0, 89e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_CACHE_OP_WRITE = 1, 90e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_CACHE_OP_PREFETCH = 2, 91e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 92e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_CACHE_OP_MAX, /* non-ABI */ 93e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 94e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 95e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengenum perf_hw_cache_op_result_id { 96e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0, 97e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_CACHE_RESULT_MISS = 1, 98e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 99e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_HW_CACHE_RESULT_MAX, /* non-ABI */ 100e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 101e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 102e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 103e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Special "software" events provided by the kernel, even if the hardware 104e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * does not support performance events. These events measure various 105e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * physical and sw events of the kernel (and allow the profiling of them as 106e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * well): 107e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 108e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengenum perf_sw_ids { 109e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_SW_CPU_CLOCK = 0, 110e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_SW_TASK_CLOCK = 1, 111e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_SW_PAGE_FAULTS = 2, 112e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_SW_CONTEXT_SWITCHES = 3, 113e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_SW_CPU_MIGRATIONS = 4, 114e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_SW_PAGE_FAULTS_MIN = 5, 115e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_SW_PAGE_FAULTS_MAJ = 6, 116e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_SW_ALIGNMENT_FAULTS = 7, 117e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_SW_EMULATION_FAULTS = 8, 118e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 119e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_COUNT_SW_MAX, /* non-ABI */ 120e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 121e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 122e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 123e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Bits that can be set in attr.sample_type to request information 124e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * in the overflow packets. 125e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 126e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengenum perf_event_sample_format { 127e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_SAMPLE_IP = 1U << 0, 128e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_SAMPLE_TID = 1U << 1, 129e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_SAMPLE_TIME = 1U << 2, 130e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_SAMPLE_ADDR = 1U << 3, 131e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_SAMPLE_READ = 1U << 4, 132e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_SAMPLE_CALLCHAIN = 1U << 5, 133e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_SAMPLE_ID = 1U << 6, 134e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_SAMPLE_CPU = 1U << 7, 135e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_SAMPLE_PERIOD = 1U << 8, 136e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_SAMPLE_STREAM_ID = 1U << 9, 137e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_SAMPLE_RAW = 1U << 10, 138e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 139e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_SAMPLE_MAX = 1U << 11, /* non-ABI */ 140e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 141e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 142e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 143e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * The format of the data returned by read() on a perf event fd, 144e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * as specified by attr.read_format: 145e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 146e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct read_format { 147e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u64 value; 148e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u64 time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED 149e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u64 time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING 150e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u64 id; } && PERF_FORMAT_ID 151e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * } && !PERF_FORMAT_GROUP 152e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 153e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u64 nr; 154e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u64 time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED 155e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u64 time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING 156e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u64 value; 157e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u64 id; } && PERF_FORMAT_ID 158e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * } cntr[nr]; 159e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * } && PERF_FORMAT_GROUP 160e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * }; 161e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 162e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengenum perf_event_read_format { 163e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_FORMAT_TOTAL_TIME_ENABLED = 1U << 0, 164e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_FORMAT_TOTAL_TIME_RUNNING = 1U << 1, 165e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_FORMAT_ID = 1U << 2, 166e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_FORMAT_GROUP = 1U << 3, 167e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 168e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_FORMAT_MAX = 1U << 4, /* non-ABI */ 169e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 170e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 171e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_ATTR_SIZE_VER0 64 /* sizeof first published struct */ 172e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 173e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 174e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Hardware event_id to monitor via a performance monitoring event: 175e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 176e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_event_attr { 177e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 178e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 179e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Major type: hardware/software/tracepoint/etc. 180e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 181e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u32 type; 182e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 183e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 184e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Size of the attr structure, for fwd/bwd compat. 185e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 186e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u32 size; 187e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 188e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 189e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Type specific configuration information. 190e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 191e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 config; 192e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 193e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng union { 194e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 sample_period; 195e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 sample_freq; 196e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng }; 197e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 198e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 sample_type; 199e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 read_format; 200e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 201e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 disabled : 1, /* off by default */ 202e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng inherit : 1, /* children inherit it */ 203e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng pinned : 1, /* must always be on PMU */ 204e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng exclusive : 1, /* only group on PMU */ 205e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng exclude_user : 1, /* don't count user */ 206e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng exclude_kernel : 1, /* ditto kernel */ 207e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng exclude_hv : 1, /* ditto hypervisor */ 208e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng exclude_idle : 1, /* don't count when idle */ 209e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng mmap : 1, /* include mmap data */ 210e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng comm : 1, /* include comm data */ 211e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng freq : 1, /* use freq, not period */ 212e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng inherit_stat : 1, /* per task counts */ 213e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng enable_on_exec : 1, /* next exec enables */ 214e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng task : 1, /* trace fork/exit */ 215e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng watermark : 1, /* wakeup_watermark */ 216e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 217e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * precise_ip: 218e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 219e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 0 - SAMPLE_IP can have arbitrary skid 220e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 1 - SAMPLE_IP must have constant skid 221e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 2 - SAMPLE_IP requested to have 0 skid 222e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 3 - SAMPLE_IP must have 0 skid 223e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 224e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * See also PERF_RECORD_MISC_EXACT_IP 225e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 226e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng precise_ip : 2, /* skid constraint */ 227e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng mmap_data : 1, /* non-exec mmap data */ 228e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng sample_id_all : 1, /* sample_type all events */ 229e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 230e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __reserved_1 : 45; 231e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 232e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng union { 233e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u32 wakeup_events; /* wakeup every n events */ 234e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u32 wakeup_watermark; /* bytes before wakeup */ 235e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng }; 236e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 237e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u32 bp_type; 238e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng union { 239e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 bp_addr; 240e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 config1; /* extension of config */ 241e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng }; 242e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng union { 243e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 bp_len; 244e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 config2; /* extension of config1 */ 245e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng }; 246e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 247e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 248e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 249e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Ioctls that can be done on a perf event fd: 250e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 251e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_EVENT_IOC_ENABLE _IO ('$', 0) 252e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_EVENT_IOC_DISABLE _IO ('$', 1) 253e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_EVENT_IOC_REFRESH _IO ('$', 2) 254e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_EVENT_IOC_RESET _IO ('$', 3) 255e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_EVENT_IOC_PERIOD _IOW('$', 4, __u64) 256e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_EVENT_IOC_SET_OUTPUT _IO ('$', 5) 257e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_EVENT_IOC_SET_FILTER _IOW('$', 6, char *) 258e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 259e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengenum perf_event_ioc_flags { 260e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_IOC_FLAG_GROUP = 1U << 0, 261e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 262e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 263e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 264e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Structure of the page that can be mapped via mmap 265e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 266e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_event_mmap_page { 267e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u32 version; /* version number of this structure */ 268e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u32 compat_version; /* lowest version this is compat with */ 269e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 270e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 271e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Bits needed to read the hw events in user-space. 272e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 273e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u32 seq; 274e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * s64 count; 275e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 276e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * do { 277e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * seq = pc->lock; 278e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 279e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * barrier() 280e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * if (pc->index) { 281e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * count = pmc_read(pc->index - 1); 282e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * count += pc->offset; 283e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * } else 284e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * goto regular_read; 285e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 286e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * barrier(); 287e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * } while (pc->lock != seq); 288e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 289e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * NOTE: for obvious reason this only works on self-monitoring 290e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * processes. 291e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 292e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u32 lock; /* seqlock for synchronization */ 293e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u32 index; /* hardware event identifier */ 294e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __s64 offset; /* add to hardware event value */ 295e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 time_enabled; /* time event active */ 296e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 time_running; /* time event on cpu */ 297e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 298e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 299e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Hole for extension of the self monitor capabilities 300e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 301e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 302e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 __reserved[123]; /* align to 1k */ 303e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 304e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 305e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Control data for the mmap() data buffer. 306e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 307e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * User-space reading the @data_head value should issue an rmb(), on 308e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * SMP capable platforms, after reading this value -- see 309e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * perf_event_wakeup(). 310e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 311e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * When the mapping is PROT_WRITE the @data_tail value should be 312e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * written by userspace to reflect the last read data. In this case 313e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * the kernel will not over-write unread data. 314e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 315e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 data_head; /* head in the data section */ 316e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 data_tail; /* user-space written tail */ 317e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 318e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 319e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_RECORD_MISC_CPUMODE_MASK (7 << 0) 320e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_RECORD_MISC_CPUMODE_UNKNOWN (0 << 0) 321e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_RECORD_MISC_KERNEL (1 << 0) 322e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_RECORD_MISC_USER (2 << 0) 323e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_RECORD_MISC_HYPERVISOR (3 << 0) 324e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_RECORD_MISC_GUEST_KERNEL (4 << 0) 325e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_RECORD_MISC_GUEST_USER (5 << 0) 326e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 327e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 328e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Indicates that the content of PERF_SAMPLE_IP points to 329e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * the actual instruction that triggered the event. See also 330e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * perf_event_attr::precise_ip. 331e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 332e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_RECORD_MISC_EXACT_IP (1 << 14) 333e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 334e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Reserve the last bit to indicate some extended misc field 335e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 336e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_RECORD_MISC_EXT_RESERVED (1 << 15) 337e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 338e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_event_header { 339e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u32 type; 340e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u16 misc; 341e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u16 size; 342e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 343e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 344e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengenum perf_event_type { 345e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 346e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 347e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * If perf_event_attr.sample_id_all is set then all event types will 348e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * have the sample_type selected fields related to where/when 349e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * (identity) an event took place (TID, TIME, ID, CPU, STREAM_ID) 350e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * described in PERF_RECORD_SAMPLE below, it will be stashed just after 351e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * the perf_event_header and the fields already present for the existing 352e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * fields, i.e. at the end of the payload. That way a newer perf.data 353e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * file will be supported by older perf tools, with these new optional 354e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * fields being ignored. 355e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 356e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * The MMAP events record the PROT_EXEC mappings so that we can 357e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * correlate userspace IPs to code. They have the following structure: 358e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 359e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct { 360e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct perf_event_header header; 361e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 362e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u32 pid, tid; 363e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u64 addr; 364e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u64 len; 365e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u64 pgoff; 366e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * char filename[]; 367e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * }; 368e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 369e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_RECORD_MMAP = 1, 370e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 371e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 372e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct { 373e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct perf_event_header header; 374e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u64 id; 375e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u64 lost; 376e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * }; 377e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 378e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_RECORD_LOST = 2, 379e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 380e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 381e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct { 382e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct perf_event_header header; 383e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 384e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u32 pid, tid; 385e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * char comm[]; 386e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * }; 387e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 388e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_RECORD_COMM = 3, 389e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 390e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 391e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct { 392e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct perf_event_header header; 393e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u32 pid, ppid; 394e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u32 tid, ptid; 395e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u64 time; 396e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * }; 397e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 398e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_RECORD_EXIT = 4, 399e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 400e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 401e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct { 402e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct perf_event_header header; 403e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u64 time; 404e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u64 id; 405e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u64 stream_id; 406e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * }; 407e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 408e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_RECORD_THROTTLE = 5, 409e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_RECORD_UNTHROTTLE = 6, 410e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 411e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 412e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct { 413e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct perf_event_header header; 414e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u32 pid, ppid; 415e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u32 tid, ptid; 416e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u64 time; 417e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * }; 418e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 419e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_RECORD_FORK = 7, 420e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 421e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 422e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct { 423e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct perf_event_header header; 424e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u32 pid, tid; 425e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 426e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct read_format values; 427e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * }; 428e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 429e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_RECORD_READ = 8, 430e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 431e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 432e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct { 433e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct perf_event_header header; 434e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 435e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u64 ip; } && PERF_SAMPLE_IP 436e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u32 pid, tid; } && PERF_SAMPLE_TID 437e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u64 time; } && PERF_SAMPLE_TIME 438e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u64 addr; } && PERF_SAMPLE_ADDR 439e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u64 id; } && PERF_SAMPLE_ID 440e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u64 stream_id;} && PERF_SAMPLE_STREAM_ID 441e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u32 cpu, res; } && PERF_SAMPLE_CPU 442e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u64 period; } && PERF_SAMPLE_PERIOD 443e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 444e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { struct read_format values; } && PERF_SAMPLE_READ 445e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 446e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u64 nr, 447e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * u64 ips[nr]; } && PERF_SAMPLE_CALLCHAIN 448e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 449e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * # 450e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * # The RAW record below is opaque data wrt the ABI 451e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * # 452e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * # That is, the ABI doesn't make any promises wrt to 453e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * # the stability of its content, it may vary depending 454e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * # on event, hardware, kernel version and phase of 455e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * # the moon. 456e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * # 457e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * # In other words, PERF_SAMPLE_RAW contents are not an ABI. 458e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * # 459e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 460e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * { u32 size; 461e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * char data[size];}&& PERF_SAMPLE_RAW 462e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * }; 463e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 464e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_RECORD_SAMPLE = 9, 465e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 466e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_RECORD_MAX, /* non-ABI */ 467e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 468e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 469e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengenum perf_callchain_context { 470e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_CONTEXT_HV = (__u64)-32, 471e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_CONTEXT_KERNEL = (__u64)-128, 472e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_CONTEXT_USER = (__u64)-512, 473e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 474e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_CONTEXT_GUEST = (__u64)-2048, 475e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_CONTEXT_GUEST_KERNEL = (__u64)-2176, 476e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_CONTEXT_GUEST_USER = (__u64)-2560, 477e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 478e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_CONTEXT_MAX = (__u64)-4095, 479e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 480e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 481e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_FLAG_FD_NO_GROUP (1U << 0) 482e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_FLAG_FD_OUTPUT (1U << 1) 483e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_FLAG_PID_CGROUP (1U << 2) /* pid=cgroup id, per-cpu mode only */ 484e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 485e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifdef __KERNEL__ 486e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 487e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Kernel-internal data types and definitions: 488e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 489e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 490e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifdef CONFIG_PERF_EVENTS 491e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# include <linux/cgroup.h> 492e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# include <asm/perf_event.h> 493e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# include <asm/local64.h> 494e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif 495e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 496e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_guest_info_callbacks { 497e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int (*is_in_guest)(void); 498e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int (*is_user_mode)(void); 499e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned long (*get_guest_ip)(void); 500e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 501e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 502e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifdef CONFIG_HAVE_HW_BREAKPOINT 503e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <asm/hw_breakpoint.h> 504e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif 505e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 506e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/list.h> 507e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/mutex.h> 508e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/rculist.h> 509e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/rcupdate.h> 510e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/spinlock.h> 511e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/hrtimer.h> 512e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/fs.h> 513e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/pid_namespace.h> 514e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/workqueue.h> 515e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/ftrace.h> 516e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/cpu.h> 517e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/irq_work.h> 518e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/jump_label.h> 519e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <asm/atomic.h> 520e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <asm/local.h> 521e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 522e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_MAX_STACK_DEPTH 255 523e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 524e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_callchain_entry { 525e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 nr; 526e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 ip[PERF_MAX_STACK_DEPTH]; 527e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 528e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 529e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_raw_record { 530e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u32 size; 531e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng void *data; 532e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 533e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 534e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_branch_entry { 535e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 from; 536e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 to; 537e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 flags; 538e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 539e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 540e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_branch_stack { 541e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __u64 nr; 542e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_branch_entry entries[0]; 543e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 544e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 545e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct task_struct; 546e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 547e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/** 548e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct hw_perf_event - performance event hardware details: 549e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 550e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct hw_perf_event { 551e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifdef CONFIG_PERF_EVENTS 552e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng union { 553e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct { /* hardware */ 554e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 config; 555e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 last_tag; 556e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned long config_base; 557e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned long event_base; 558e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int idx; 559e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int last_cpu; 560e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned int extra_reg; 561e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 extra_config; 562e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int extra_alloc; 563e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng }; 564e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct { /* software */ 565e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct hrtimer hrtimer; 566e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng }; 567e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifdef CONFIG_HAVE_HW_BREAKPOINT 568e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct { /* breakpoint */ 569e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct arch_hw_breakpoint info; 570e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct list_head bp_list; 571e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 572e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Crufty hack to avoid the chicken and egg 573e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * problem hw_breakpoint has with context 574e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * creation and event initalization. 575e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 576e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct task_struct *bp_target; 577e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng }; 578e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif 579e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng }; 580e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int state; 581e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng local64_t prev_count; 582e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 sample_period; 583e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 last_period; 584e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng local64_t period_left; 585e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 interrupts; 586e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 587e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 freq_time_stamp; 588e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 freq_count_stamp; 589e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif 590e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 591e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 592e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 593e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * hw_perf_event::state flags 594e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 595e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_HES_STOPPED 0x01 /* the counter is stopped */ 596e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_HES_UPTODATE 0x02 /* event->count up-to-date */ 597e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_HES_ARCH 0x04 598e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 599e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_event; 600e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 601e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 602e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Common implementation detail of pmu::{start,commit,cancel}_txn 603e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 604e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_EVENT_TXN 0x1 605e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 606e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/** 607e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct pmu - generic performance monitoring unit 608e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 609e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct pmu { 610e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct list_head entry; 611e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 612e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct device *dev; 613e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char *name; 614e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int type; 615e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 616e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int * __percpu pmu_disable_count; 617e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_cpu_context * __percpu pmu_cpu_context; 618e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int task_ctx_nr; 619e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 620e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 621e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Fully disable/enable this PMU, can be used to protect from the PMI 622e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * as well as for lazy/batch writing of the MSRs. 623e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 624e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng void (*pmu_enable) (struct pmu *pmu); /* optional */ 625e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng void (*pmu_disable) (struct pmu *pmu); /* optional */ 626e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 627e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 628e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Try and initialize the event for this PMU. 629e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Should return -ENOENT when the @event doesn't match this PMU. 630e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 631e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int (*event_init) (struct perf_event *event); 632e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 633e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_EF_START 0x01 /* start the counter when adding */ 634e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_EF_RELOAD 0x02 /* reload the counter when starting */ 635e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_EF_UPDATE 0x04 /* update the counter when stopping */ 636e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 637e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 638e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Adds/Removes a counter to/from the PMU, can be done inside 639e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * a transaction, see the ->*_txn() methods. 640e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 641e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int (*add) (struct perf_event *event, int flags); 642e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng void (*del) (struct perf_event *event, int flags); 643e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 644e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 645e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Starts/Stops a counter present on the PMU. The PMI handler 646e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * should stop the counter when perf_event_overflow() returns 647e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * !0. ->start() will be used to continue. 648e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 649e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng void (*start) (struct perf_event *event, int flags); 650e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng void (*stop) (struct perf_event *event, int flags); 651e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 652e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 653e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Updates the counter value of the event. 654e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 655e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng void (*read) (struct perf_event *event); 656e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 657e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 658e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Group events scheduling is treated as a transaction, add 659e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * group events as a whole and perform one schedulability test. 660e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * If the test fails, roll back the whole group 661e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 662e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Start the transaction, after this ->add() doesn't need to 663e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * do schedulability tests. 664e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 665e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng void (*start_txn) (struct pmu *pmu); /* optional */ 666e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 667e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * If ->start_txn() disabled the ->add() schedulability test 668e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * then ->commit_txn() is required to perform one. On success 669e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * the transaction is closed. On error the transaction is kept 670e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * open until ->cancel_txn() is called. 671e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 672e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int (*commit_txn) (struct pmu *pmu); /* optional */ 673e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 674e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Will cancel the transaction, assumes ->del() is called 675e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * for each successful ->add() during the transaction. 676e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 677e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng void (*cancel_txn) (struct pmu *pmu); /* optional */ 678e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 679e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 680e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/** 681e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * enum perf_event_active_state - the states of a event 682e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 683e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengenum perf_event_active_state { 684e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_EVENT_STATE_ERROR = -2, 685e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_EVENT_STATE_OFF = -1, 686e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_EVENT_STATE_INACTIVE = 0, 687e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_EVENT_STATE_ACTIVE = 1, 688e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 689e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 690e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct file; 691e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 692e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_BUFFER_WRITABLE 0x01 693e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 694e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_buffer { 695e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng atomic_t refcount; 696e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct rcu_head rcu_head; 697e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifdef CONFIG_PERF_USE_VMALLOC 698e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct work_struct work; 699e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int page_order; /* allocation order */ 700e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif 701e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int nr_pages; /* nr of data pages */ 702e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int writable; /* are we writable */ 703e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 704e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng atomic_t poll; /* POLL_ for wakeups */ 705e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 706e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng local_t head; /* write position */ 707e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng local_t nest; /* nested writers */ 708e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng local_t events; /* event limit */ 709e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng local_t wakeup; /* wakeup stamp */ 710e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng local_t lost; /* nr records lost */ 711e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 712e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng long watermark; /* wakeup watermark */ 713e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 714e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_event_mmap_page *user_page; 715e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng void *data_pages[0]; 716e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 717e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 718e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_sample_data; 719e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 720e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengtypedef void (*perf_overflow_handler_t)(struct perf_event *, int, 721e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_sample_data *, 722e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct pt_regs *regs); 723e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 724e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengenum perf_group_flag { 725e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng PERF_GROUP_SOFTWARE = 0x1, 726e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 727e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 728e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define SWEVENT_HLIST_BITS 8 729e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define SWEVENT_HLIST_SIZE (1 << SWEVENT_HLIST_BITS) 730e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 731e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct swevent_hlist { 732e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct hlist_head heads[SWEVENT_HLIST_SIZE]; 733e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct rcu_head rcu_head; 734e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 735e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 736e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_ATTACH_CONTEXT 0x01 737e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_ATTACH_GROUP 0x02 738e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_ATTACH_TASK 0x04 739e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 740e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifdef CONFIG_CGROUP_PERF 741e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 742e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * perf_cgroup_info keeps track of time_enabled for a cgroup. 743e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * This is a per-cpu dynamically allocated data structure. 744e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 745e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_cgroup_info { 746e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 time; 747e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 timestamp; 748e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 749e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 750e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_cgroup { 751e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct cgroup_subsys_state css; 752e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_cgroup_info *info; /* timing info, one per cpu */ 753e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 754e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif 755e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 756e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/** 757e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct perf_event - performance event kernel representation: 758e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 759e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_event { 760e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifdef CONFIG_PERF_EVENTS 761e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct list_head group_entry; 762e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct list_head event_entry; 763e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct list_head sibling_list; 764e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct hlist_node hlist_entry; 765e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int nr_siblings; 766e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int group_flags; 767e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_event *group_leader; 768e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct pmu *pmu; 769e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 770e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng enum perf_event_active_state state; 771e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned int attach_state; 772e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng local64_t count; 773e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng atomic64_t child_count; 774e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 775e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 776e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * These are the total time in nanoseconds that the event 777e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * has been enabled (i.e. eligible to run, and the task has 778e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * been scheduled in, if this is a per-task event) 779e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * and running (scheduled onto the CPU), respectively. 780e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 781e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * They are computed from tstamp_enabled, tstamp_running and 782e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * tstamp_stopped when the event is in INACTIVE or ACTIVE state. 783e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 784e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 total_time_enabled; 785e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 total_time_running; 786e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 787e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 788e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * These are timestamps used for computing total_time_enabled 789e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * and total_time_running when the event is in INACTIVE or 790e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * ACTIVE state, measured in nanoseconds from an arbitrary point 791e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * in time. 792e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * tstamp_enabled: the notional time when the event was enabled 793e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * tstamp_running: the notional time when the event was scheduled on 794e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * tstamp_stopped: in INACTIVE state, the notional time when the 795e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * event was scheduled off. 796e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 797e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 tstamp_enabled; 798e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 tstamp_running; 799e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 tstamp_stopped; 800e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 801e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 802e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * timestamp shadows the actual context timing but it can 803e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * be safely used in NMI interrupt context. It reflects the 804e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * context time as it was when the event was last scheduled in. 805e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 806e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * ctx_time already accounts for ctx->timestamp. Therefore to 807e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * compute ctx_time for a sample, simply add perf_clock(). 808e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 809e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 shadow_ctx_time; 810e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 811e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_event_attr attr; 812e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u16 header_size; 813e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u16 id_header_size; 814e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u16 read_size; 815e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct hw_perf_event hw; 816e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 817e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_event_context *ctx; 818e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct file *filp; 819e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 820e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 821e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * These accumulate total time (in nanoseconds) that children 822e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * events have been enabled and running, respectively. 823e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 824e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng atomic64_t child_total_time_enabled; 825e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng atomic64_t child_total_time_running; 826e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 827e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 828e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Protect attach/detach and child_list: 829e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 830e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct mutex child_mutex; 831e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct list_head child_list; 832e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_event *parent; 833e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 834e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int oncpu; 835e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int cpu; 836e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 837e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct list_head owner_entry; 838e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct task_struct *owner; 839e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 840e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* mmap bits */ 841e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct mutex mmap_mutex; 842e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng atomic_t mmap_count; 843e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int mmap_locked; 844e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct user_struct *mmap_user; 845e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_buffer *buffer; 846e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 847e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* poll related */ 848e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng wait_queue_head_t waitq; 849e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct fasync_struct *fasync; 850e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 851e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* delayed work for NMIs and such */ 852e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int pending_wakeup; 853e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int pending_kill; 854e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int pending_disable; 855e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct irq_work pending; 856e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 857e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng atomic_t event_limit; 858e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 859e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng void (*destroy)(struct perf_event *); 860e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct rcu_head rcu_head; 861e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 862e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct pid_namespace *ns; 863e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 id; 864e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 865e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng perf_overflow_handler_t overflow_handler; 866e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 867e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifdef CONFIG_EVENT_TRACING 868e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct ftrace_event_call *tp_event; 869e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct event_filter *filter; 870e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif 871e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 872e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifdef CONFIG_CGROUP_PERF 873e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_cgroup *cgrp; /* cgroup event is attach to */ 874e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int cgrp_defer_enabled; 875e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif 876e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 877e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif /* CONFIG_PERF_EVENTS */ 878e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 879e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 880e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengenum perf_event_context_type { 881e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng task_context, 882e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cpu_context, 883e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 884e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 885e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/** 886e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct perf_event_context - event context structure 887e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 888e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Used as a container for task events and CPU events as well: 889e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 890e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_event_context { 891e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct pmu *pmu; 892e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng enum perf_event_context_type type; 893e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 894e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Protect the states of the events in the list, 895e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * nr_active, and the list: 896e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 897e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng raw_spinlock_t lock; 898e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 899e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Protect the list of events. Locking either mutex or lock 900e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * is sufficient to ensure the list doesn't change; to change 901e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * the list you need to lock both the mutex and the spinlock. 902e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 903e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct mutex mutex; 904e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 905e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct list_head pinned_groups; 906e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct list_head flexible_groups; 907e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct list_head event_list; 908e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int nr_events; 909e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int nr_active; 910e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int is_active; 911e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int nr_stat; 912e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int rotate_disable; 913e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng atomic_t refcount; 914e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct task_struct *task; 915e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 916e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 917e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Context clock, runs when context enabled. 918e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 919e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 time; 920e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 timestamp; 921e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 922e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 923e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * These fields let us detect when two contexts have both 924e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * been cloned (inherited) from a common ancestor. 925e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 926e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_event_context *parent_ctx; 927e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 parent_gen; 928e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 generation; 929e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int pin_count; 930e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct rcu_head rcu_head; 931e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int nr_cgroups; /* cgroup events present */ 932e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 933e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 934e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 935e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Number of contexts where an event can trigger: 936e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * task, softirq, hardirq, nmi. 937e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 938e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_NR_CONTEXTS 4 939e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 940e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/** 941e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * struct perf_event_cpu_context - per cpu event context structure 942e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 943e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_cpu_context { 944e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_event_context ctx; 945e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_event_context *task_ctx; 946e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int active_oncpu; 947e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int exclusive; 948e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct list_head rotation_list; 949e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int jiffies_interval; 950e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct pmu *active_pmu; 951e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_cgroup *cgrp; 952e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 953e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 954e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_output_handle { 955e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_event *event; 956e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_buffer *buffer; 957e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned long wakeup; 958e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned long size; 959e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng void *addr; 960e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int page; 961e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int nmi; 962e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int sample; 963e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 964e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 965e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifdef CONFIG_PERF_EVENTS 966e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 967e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern int perf_pmu_register(struct pmu *pmu, char *name, int type); 968e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_pmu_unregister(struct pmu *pmu); 969e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 970e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern int perf_num_counters(void); 971e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern const char *perf_pmu_name(void); 972e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void __perf_event_task_sched_in(struct task_struct *task); 973e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void __perf_event_task_sched_out(struct task_struct *task, struct task_struct *next); 974e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern int perf_event_init_task(struct task_struct *child); 975e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_event_exit_task(struct task_struct *child); 976e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_event_free_task(struct task_struct *task); 977e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_event_delayed_put(struct task_struct *task); 978e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_event_print_debug(void); 979e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_pmu_disable(struct pmu *pmu); 980e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_pmu_enable(struct pmu *pmu); 981e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern int perf_event_task_disable(void); 982e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern int perf_event_task_enable(void); 983e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_event_update_userpage(struct perf_event *event); 984e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern int perf_event_release_kernel(struct perf_event *event); 985e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern struct perf_event * 986e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengperf_event_create_kernel_counter(struct perf_event_attr *attr, 987e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int cpu, 988e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct task_struct *task, 989e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng perf_overflow_handler_t callback); 990e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern u64 perf_event_read_value(struct perf_event *event, 991e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 *enabled, u64 *running); 992e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 993e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_sample_data { 994e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 type; 995e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 996e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 ip; 997e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct { 998e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u32 pid; 999e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u32 tid; 1000e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } tid_entry; 1001e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 time; 1002e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 addr; 1003e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 id; 1004e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 stream_id; 1005e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct { 1006e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u32 cpu; 1007e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u32 reserved; 1008e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } cpu_entry; 1009e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng u64 period; 1010e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_callchain_entry *callchain; 1011e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_raw_record *raw; 1012e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 1013e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1014e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void perf_sample_data_init(struct perf_sample_data *data, u64 addr) 1015e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 1016e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng data->addr = addr; 1017e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng data->raw = NULL; 1018e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 1019e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1020e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_output_sample(struct perf_output_handle *handle, 1021e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_event_header *header, 1022e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_sample_data *data, 1023e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_event *event); 1024e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_prepare_sample(struct perf_event_header *header, 1025e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_sample_data *data, 1026e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_event *event, 1027e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct pt_regs *regs); 1028e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1029e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern int perf_event_overflow(struct perf_event *event, int nmi, 1030e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_sample_data *data, 1031e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct pt_regs *regs); 1032e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1033e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline bool is_sampling_event(struct perf_event *event) 1034e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 1035e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return event->attr.sample_period != 0; 1036e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 1037e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1038e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 1039e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Return 1 for a software event, 0 for a hardware event 1040e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 1041e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline int is_software_event(struct perf_event *event) 1042e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 1043e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return event->pmu->task_ctx_nr == perf_sw_context; 1044e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 1045e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1046e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern struct jump_label_key perf_swevent_enabled[PERF_COUNT_SW_MAX]; 1047e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1048e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void __perf_sw_event(u32, u64, int, struct pt_regs *, u64); 1049e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1050e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef perf_arch_fetch_caller_regs 1051e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned long ip) { } 1052e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif 1053e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1054e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 1055e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Take a snapshot of the regs. Skip ip and frame pointer to 1056e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * the nth caller. We only need a few of the regs: 1057e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * - ip for PERF_SAMPLE_IP 1058e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * - cs for user_mode() tests 1059e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * - bp for callchains 1060e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * - eflags, for future purposes, just in case 1061e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 1062e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void perf_fetch_caller_regs(struct pt_regs *regs) 1063e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 1064e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng memset(regs, 0, sizeof(*regs)); 1065e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1066e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng perf_arch_fetch_caller_regs(regs, CALLER_ADDR0); 1067e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 1068e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1069e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic __always_inline void 1070e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengperf_sw_event(u32 event_id, u64 nr, int nmi, struct pt_regs *regs, u64 addr) 1071e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 1072e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct pt_regs hot_regs; 1073e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1074e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (static_branch(&perf_swevent_enabled[event_id])) { 1075e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!regs) { 1076e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng perf_fetch_caller_regs(&hot_regs); 1077e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng regs = &hot_regs; 1078e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 1079e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __perf_sw_event(event_id, nr, nmi, regs, addr); 1080e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 1081e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 1082e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1083e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern struct jump_label_key perf_sched_events; 1084e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1085e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void perf_event_task_sched_in(struct task_struct *task) 1086e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 1087e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (static_branch(&perf_sched_events)) 1088e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __perf_event_task_sched_in(task); 1089e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 1090e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1091e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void perf_event_task_sched_out(struct task_struct *task, struct task_struct *next) 1092e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 1093e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng perf_sw_event(PERF_COUNT_SW_CONTEXT_SWITCHES, 1, 1, NULL, 0); 1094e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1095e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng __perf_event_task_sched_out(task, next); 1096e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 1097e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1098e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_event_mmap(struct vm_area_struct *vma); 1099e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern struct perf_guest_info_callbacks *perf_guest_cbs; 1100e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern int perf_register_guest_info_callbacks(struct perf_guest_info_callbacks *callbacks); 1101e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern int perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *callbacks); 1102e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1103e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_event_comm(struct task_struct *tsk); 1104e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_event_fork(struct task_struct *tsk); 1105e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1106e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* Callchains */ 1107e6817ec1d8ab31fc7b01906e305f848542df6413Ben ChengDECLARE_PER_CPU(struct perf_callchain_entry, perf_callchain_entry); 1108e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1109e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs); 1110e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_callchain_kernel(struct perf_callchain_entry *entry, struct pt_regs *regs); 1111e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1112e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void perf_callchain_store(struct perf_callchain_entry *entry, u64 ip) 1113e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 1114e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (entry->nr < PERF_MAX_STACK_DEPTH) 1115e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng entry->ip[entry->nr++] = ip; 1116e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 1117e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1118e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern int sysctl_perf_event_paranoid; 1119e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern int sysctl_perf_event_mlock; 1120e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern int sysctl_perf_event_sample_rate; 1121e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1122e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern int perf_proc_update_handler(struct ctl_table *table, int write, 1123e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng void __user *buffer, size_t *lenp, 1124e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng loff_t *ppos); 1125e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1126e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline bool perf_paranoid_tracepoint_raw(void) 1127e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 1128e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return sysctl_perf_event_paranoid > -1; 1129e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 1130e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1131e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline bool perf_paranoid_cpu(void) 1132e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 1133e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return sysctl_perf_event_paranoid > 0; 1134e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 1135e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1136e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline bool perf_paranoid_kernel(void) 1137e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 1138e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return sysctl_perf_event_paranoid > 1; 1139e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 1140e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1141e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_event_init(void); 1142e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_tp_event(u64 addr, u64 count, void *record, 1143e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int entry_size, struct pt_regs *regs, 1144e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct hlist_head *head, int rctx); 1145e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_bp_event(struct perf_event *event, void *data); 1146e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1147e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef perf_misc_flags 1148e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# define perf_misc_flags(regs) \ 1149e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng (user_mode(regs) ? PERF_RECORD_MISC_USER : PERF_RECORD_MISC_KERNEL) 1150e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# define perf_instruction_pointer(regs) instruction_pointer(regs) 1151e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif 1152e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1153e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern int perf_output_begin(struct perf_output_handle *handle, 1154e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_event *event, unsigned int size, 1155e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int nmi, int sample); 1156e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_output_end(struct perf_output_handle *handle); 1157e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_output_copy(struct perf_output_handle *handle, 1158e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng const void *buf, unsigned int len); 1159e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern int perf_swevent_get_recursion_context(void); 1160e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_swevent_put_recursion_context(int rctx); 1161e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_event_enable(struct perf_event *event); 1162e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_event_disable(struct perf_event *event); 1163e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void perf_event_task_tick(void); 1164e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#else 1165e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void 1166e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengperf_event_task_sched_in(struct task_struct *task) { } 1167e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void 1168e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengperf_event_task_sched_out(struct task_struct *task, 1169e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct task_struct *next) { } 1170e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline int perf_event_init_task(struct task_struct *child) { return 0; } 1171e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void perf_event_exit_task(struct task_struct *child) { } 1172e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void perf_event_free_task(struct task_struct *task) { } 1173e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void perf_event_delayed_put(struct task_struct *task) { } 1174e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void perf_event_print_debug(void) { } 1175e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline int perf_event_task_disable(void) { return -EINVAL; } 1176e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline int perf_event_task_enable(void) { return -EINVAL; } 1177e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1178e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void 1179e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengperf_sw_event(u32 event_id, u64 nr, int nmi, 1180e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct pt_regs *regs, u64 addr) { } 1181e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void 1182e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengperf_bp_event(struct perf_event *event, void *data) { } 1183e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1184e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline int perf_register_guest_info_callbacks 1185e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng(struct perf_guest_info_callbacks *callbacks) { return 0; } 1186e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline int perf_unregister_guest_info_callbacks 1187e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng(struct perf_guest_info_callbacks *callbacks) { return 0; } 1188e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1189e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void perf_event_mmap(struct vm_area_struct *vma) { } 1190e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void perf_event_comm(struct task_struct *tsk) { } 1191e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void perf_event_fork(struct task_struct *tsk) { } 1192e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void perf_event_init(void) { } 1193e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline int perf_swevent_get_recursion_context(void) { return -1; } 1194e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void perf_swevent_put_recursion_context(int rctx) { } 1195e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void perf_event_enable(struct perf_event *event) { } 1196e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void perf_event_disable(struct perf_event *event) { } 1197e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void perf_event_task_tick(void) { } 1198e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif 1199e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1200e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define perf_output_put(handle, x) perf_output_copy((handle), &(x), sizeof(x)) 1201e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1202e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 1203e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * This has to have a higher priority than migration_notifier in sched.c. 1204e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 1205e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define perf_cpu_notifier(fn) \ 1206e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengdo { \ 1207e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng static struct notifier_block fn##_nb __cpuinitdata = \ 1208e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng { .notifier_call = fn, .priority = CPU_PRI_PERF }; \ 1209e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng fn(&fn##_nb, (unsigned long)CPU_UP_PREPARE, \ 1210e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng (void *)(unsigned long)smp_processor_id()); \ 1211e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng fn(&fn##_nb, (unsigned long)CPU_STARTING, \ 1212e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng (void *)(unsigned long)smp_processor_id()); \ 1213e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng fn(&fn##_nb, (unsigned long)CPU_ONLINE, \ 1214e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng (void *)(unsigned long)smp_processor_id()); \ 1215e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng register_cpu_notifier(&fn##_nb); \ 1216e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} while (0) 1217e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 1218e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif /* __KERNEL__ */ 1219e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif /* _LINUX_PERF_EVENT_H */ 1220