diff options
Diffstat (limited to 'include/linux/perf_counter.h')
| -rw-r--r-- | include/linux/perf_counter.h | 60 | 
1 files changed, 48 insertions, 12 deletions
diff --git a/include/linux/perf_counter.h b/include/linux/perf_counter.h index e604e6ef72d..b53f7006cc4 100644 --- a/include/linux/perf_counter.h +++ b/include/linux/perf_counter.h @@ -115,27 +115,44 @@ enum perf_counter_sample_format {  	PERF_SAMPLE_TID				= 1U << 1,  	PERF_SAMPLE_TIME			= 1U << 2,  	PERF_SAMPLE_ADDR			= 1U << 3, -	PERF_SAMPLE_GROUP			= 1U << 4, +	PERF_SAMPLE_READ			= 1U << 4,  	PERF_SAMPLE_CALLCHAIN			= 1U << 5,  	PERF_SAMPLE_ID				= 1U << 6,  	PERF_SAMPLE_CPU				= 1U << 7,  	PERF_SAMPLE_PERIOD			= 1U << 8,  	PERF_SAMPLE_STREAM_ID			= 1U << 9, +	PERF_SAMPLE_RAW				= 1U << 10, -	PERF_SAMPLE_MAX = 1U << 10,		/* non-ABI */ +	PERF_SAMPLE_MAX = 1U << 11,		/* non-ABI */  };  /* - * Bits that can be set in attr.read_format to request that - * reads on the counter should return the indicated quantities, - * in increasing order of bit value, after the counter value. + * The format of the data returned by read() on a perf counter fd, + * as specified by attr.read_format: + * + * struct read_format { + * 	{ u64		value; + * 	  { u64		time_enabled; } && PERF_FORMAT_ENABLED + * 	  { u64		time_running; } && PERF_FORMAT_RUNNING + * 	  { u64		id;           } && PERF_FORMAT_ID + * 	} && !PERF_FORMAT_GROUP + * + * 	{ u64		nr; + * 	  { u64		time_enabled; } && PERF_FORMAT_ENABLED + * 	  { u64		time_running; } && PERF_FORMAT_RUNNING + * 	  { u64		value; + * 	    { u64	id;           } && PERF_FORMAT_ID + * 	  }		cntr[nr]; + * 	} && PERF_FORMAT_GROUP + * };   */  enum perf_counter_read_format {  	PERF_FORMAT_TOTAL_TIME_ENABLED		= 1U << 0,  	PERF_FORMAT_TOTAL_TIME_RUNNING		= 1U << 1,  	PERF_FORMAT_ID				= 1U << 2, +	PERF_FORMAT_GROUP			= 1U << 3, -	PERF_FORMAT_MAX = 1U << 3, 		/* non-ABI */ +	PERF_FORMAT_MAX = 1U << 4, 		/* non-ABI */  };  #define PERF_ATTR_SIZE_VER0	64	/* sizeof first published struct */ @@ -342,10 +359,8 @@ enum perf_event_type {  	 * struct {  	 * 	struct perf_event_header	header;  	 * 	u32				pid, tid; -	 * 	u64				value; -	 * 	{ u64		time_enabled; 	} && PERF_FORMAT_ENABLED -	 * 	{ u64		time_running; 	} && PERF_FORMAT_RUNNING -	 * 	{ u64		parent_id;	} && PERF_FORMAT_ID +	 * +	 * 	struct read_format		values;  	 * };  	 */  	PERF_EVENT_READ			= 8, @@ -363,11 +378,24 @@ enum perf_event_type {  	 *	{ u32			cpu, res; } && PERF_SAMPLE_CPU  	 * 	{ u64			period;   } && PERF_SAMPLE_PERIOD  	 * -	 *	{ u64			nr; -	 *	  { u64 id, val; }	cnt[nr];  } && PERF_SAMPLE_GROUP +	 *	{ struct read_format	values;	  } && PERF_SAMPLE_READ  	 *  	 *	{ u64			nr,  	 *	  u64			ips[nr];  } && PERF_SAMPLE_CALLCHAIN +	 * +	 * 	# +	 * 	# The RAW record below is opaque data wrt the ABI +	 * 	# +	 * 	# That is, the ABI doesn't make any promises wrt to +	 * 	# the stability of its content, it may vary depending +	 * 	# on event, hardware, kernel version and phase of +	 * 	# the moon. +	 * 	# +	 * 	# In other words, PERF_SAMPLE_RAW contents are not an ABI. +	 * 	# +	 * +	 *	{ u32			size; +	 *	  char                  data[size];}&& PERF_SAMPLE_RAW  	 * };  	 */  	PERF_EVENT_SAMPLE		= 9, @@ -413,6 +441,11 @@ struct perf_callchain_entry {  	__u64				ip[PERF_MAX_STACK_DEPTH];  }; +struct perf_raw_record { +	u32				size; +	void				*data; +}; +  struct task_struct;  /** @@ -681,10 +714,13 @@ struct perf_sample_data {  	struct pt_regs			*regs;  	u64				addr;  	u64				period; +	struct perf_raw_record		*raw;  };  extern int perf_counter_overflow(struct perf_counter *counter, int nmi,  				 struct perf_sample_data *data); +extern void perf_counter_output(struct perf_counter *counter, int nmi, +				struct perf_sample_data *data);  /*   * Return 1 for a software counter, 0 for a hardware counter  |