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