162306a36Sopenharmony_ciperf.data format
262306a36Sopenharmony_ci
362306a36Sopenharmony_ciUptodate as of v4.7
462306a36Sopenharmony_ci
562306a36Sopenharmony_ciThis document describes the on-disk perf.data format, generated by perf record
662306a36Sopenharmony_cior perf inject and consumed by the other perf tools.
762306a36Sopenharmony_ci
862306a36Sopenharmony_ciOn a high level perf.data contains the events generated by the PMUs, plus metadata.
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ciAll fields are in native-endian of the machine that generated the perf.data.
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciWhen perf is writing to a pipe it uses a special version of the file
1362306a36Sopenharmony_ciformat that does not rely on seeking to adjust data offsets.  This
1462306a36Sopenharmony_ciformat is described in "Pipe-mode data" section. The pipe data version can be
1562306a36Sopenharmony_ciaugmented with additional events using perf inject.
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ciThe file starts with a perf_header:
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistruct perf_header {
2062306a36Sopenharmony_ci	char magic[8];		/* PERFILE2 */
2162306a36Sopenharmony_ci	uint64_t size;		/* size of the header */
2262306a36Sopenharmony_ci	uint64_t attr_size;	/* size of an attribute in attrs */
2362306a36Sopenharmony_ci	struct perf_file_section attrs;
2462306a36Sopenharmony_ci	struct perf_file_section data;
2562306a36Sopenharmony_ci	struct perf_file_section event_types;
2662306a36Sopenharmony_ci	uint64_t flags;
2762306a36Sopenharmony_ci	uint64_t flags1[3];
2862306a36Sopenharmony_ci};
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ciThe magic number identifies the perf file and the version. Current perf versions
3162306a36Sopenharmony_ciuse PERFILE2. Old perf versions generated a version 1 format (PERFFILE). Version 1
3262306a36Sopenharmony_ciis not described here. The magic number also identifies the endian. When the
3362306a36Sopenharmony_cimagic value is 64bit byte swapped compared the file is in non-native
3462306a36Sopenharmony_ciendian.
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ciA perf_file_section contains a pointer to another section of the perf file.
3762306a36Sopenharmony_ciThe header contains three such pointers: for attributes, data and event types.
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistruct perf_file_section {
4062306a36Sopenharmony_ci	uint64_t offset;	/* offset from start of file */
4162306a36Sopenharmony_ci	uint64_t size;		/* size of the section */
4262306a36Sopenharmony_ci};
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ciFlags section:
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ciFor each of the optional features a perf_file_section is placed after the data
4762306a36Sopenharmony_cisection if the feature bit is set in the perf_header flags bitset. The
4862306a36Sopenharmony_cirespective perf_file_section points to the data of the additional header and
4962306a36Sopenharmony_cidefines its size.
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ciSome headers consist of strings, which are defined like this:
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistruct perf_header_string {
5462306a36Sopenharmony_ci       uint32_t len;
5562306a36Sopenharmony_ci       char string[len]; /* zero terminated */
5662306a36Sopenharmony_ci};
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ciSome headers consist of a sequence of strings, which start with a
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistruct perf_header_string_list {
6162306a36Sopenharmony_ci     uint32_t nr;
6262306a36Sopenharmony_ci     struct perf_header_string strings[nr]; /* variable length records */
6362306a36Sopenharmony_ci};
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ciThe bits are the flags bits in a 256 bit bitmap starting with
6662306a36Sopenharmony_ciflags. These define the valid bits:
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci	HEADER_RESERVED		= 0,	/* always cleared */
6962306a36Sopenharmony_ci	HEADER_FIRST_FEATURE	= 1,
7062306a36Sopenharmony_ci	HEADER_TRACING_DATA	= 1,
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ciDescribe me.
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	HEADER_BUILD_ID = 2,
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ciThe header consists of an sequence of build_id_event. The size of each record
7762306a36Sopenharmony_ciis defined by header.size (see perf_event.h). Each event defines a ELF build id
7862306a36Sopenharmony_cifor a executable file name for a pid. An ELF build id is a unique identifier
7962306a36Sopenharmony_ciassigned by the linker to an executable.
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_cistruct build_id_event {
8262306a36Sopenharmony_ci	struct perf_event_header header;
8362306a36Sopenharmony_ci	pid_t			 pid;
8462306a36Sopenharmony_ci	uint8_t			 build_id[24];
8562306a36Sopenharmony_ci	char			 filename[header.size - offsetof(struct build_id_event, filename)];
8662306a36Sopenharmony_ci};
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci	HEADER_HOSTNAME = 3,
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ciA perf_header_string with the hostname where the data was collected
9162306a36Sopenharmony_ci(uname -n)
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	HEADER_OSRELEASE = 4,
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ciA perf_header_string with the os release where the data was collected
9662306a36Sopenharmony_ci(uname -r)
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	HEADER_VERSION = 5,
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ciA perf_header_string with the perf user tool version where the
10162306a36Sopenharmony_cidata was collected. This is the same as the version of the source tree
10262306a36Sopenharmony_cithe perf tool was built from.
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	HEADER_ARCH = 6,
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ciA perf_header_string with the CPU architecture (uname -m)
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci	HEADER_NRCPUS = 7,
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ciA structure defining the number of CPUs.
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_cistruct nr_cpus {
11362306a36Sopenharmony_ci       uint32_t nr_cpus_available; /* CPUs not yet onlined */
11462306a36Sopenharmony_ci       uint32_t nr_cpus_online;
11562306a36Sopenharmony_ci};
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci	HEADER_CPUDESC = 8,
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ciA perf_header_string with description of the CPU. On x86 this is the model name
12062306a36Sopenharmony_ciin /proc/cpuinfo
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci	HEADER_CPUID = 9,
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ciA perf_header_string with the exact CPU type. On x86 this is
12562306a36Sopenharmony_civendor,family,model,stepping. For example: GenuineIntel,6,69,1
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci	HEADER_TOTAL_MEM = 10,
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ciAn uint64_t with the total memory in kilobytes.
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci	HEADER_CMDLINE = 11,
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ciA perf_header_string_list with the perf arg-vector used to collect the data.
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	HEADER_EVENT_DESC = 12,
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ciAnother description of the perf_event_attrs, more detailed than header.attrs
13862306a36Sopenharmony_ciincluding IDs and names. See perf_event.h or the man page for a description
13962306a36Sopenharmony_ciof a struct perf_event_attr.
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_cistruct {
14262306a36Sopenharmony_ci       uint32_t nr; /* number of events */
14362306a36Sopenharmony_ci       uint32_t attr_size; /* size of each perf_event_attr */
14462306a36Sopenharmony_ci       struct {
14562306a36Sopenharmony_ci	      struct perf_event_attr attr;  /* size of attr_size */
14662306a36Sopenharmony_ci	      uint32_t nr_ids;
14762306a36Sopenharmony_ci	      struct perf_header_string event_string;
14862306a36Sopenharmony_ci	      uint64_t ids[nr_ids];
14962306a36Sopenharmony_ci       } events[nr]; /* Variable length records */
15062306a36Sopenharmony_ci};
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci	HEADER_CPU_TOPOLOGY = 13,
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_cistruct {
15562306a36Sopenharmony_ci	/*
15662306a36Sopenharmony_ci	 * First revision of HEADER_CPU_TOPOLOGY
15762306a36Sopenharmony_ci	 *
15862306a36Sopenharmony_ci	 * See 'struct perf_header_string_list' definition earlier
15962306a36Sopenharmony_ci	 * in this file.
16062306a36Sopenharmony_ci	 */
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci       struct perf_header_string_list cores; /* Variable length */
16362306a36Sopenharmony_ci       struct perf_header_string_list threads; /* Variable length */
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci       /*
16662306a36Sopenharmony_ci        * Second revision of HEADER_CPU_TOPOLOGY, older tools
16762306a36Sopenharmony_ci        * will not consider what comes next
16862306a36Sopenharmony_ci        */
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci       struct {
17162306a36Sopenharmony_ci	      uint32_t core_id;
17262306a36Sopenharmony_ci	      uint32_t socket_id;
17362306a36Sopenharmony_ci       } cpus[nr]; /* Variable length records */
17462306a36Sopenharmony_ci       /* 'nr' comes from previously processed HEADER_NRCPUS's nr_cpu_avail */
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci        /*
17762306a36Sopenharmony_ci	 * Third revision of HEADER_CPU_TOPOLOGY, older tools
17862306a36Sopenharmony_ci	 * will not consider what comes next
17962306a36Sopenharmony_ci	 */
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci	struct perf_header_string_list dies; /* Variable length */
18262306a36Sopenharmony_ci	uint32_t die_id[nr_cpus_avail]; /* from previously processed HEADER_NR_CPUS, VLA */
18362306a36Sopenharmony_ci};
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ciExample:
18662306a36Sopenharmony_ci	sibling sockets : 0-8
18762306a36Sopenharmony_ci	sibling dies	: 0-3
18862306a36Sopenharmony_ci	sibling dies	: 4-7
18962306a36Sopenharmony_ci	sibling threads : 0-1
19062306a36Sopenharmony_ci	sibling threads : 2-3
19162306a36Sopenharmony_ci	sibling threads : 4-5
19262306a36Sopenharmony_ci	sibling threads : 6-7
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci	HEADER_NUMA_TOPOLOGY = 14,
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci	A list of NUMA node descriptions
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_cistruct {
19962306a36Sopenharmony_ci       uint32_t nr;
20062306a36Sopenharmony_ci       struct {
20162306a36Sopenharmony_ci	      uint32_t nodenr;
20262306a36Sopenharmony_ci	      uint64_t mem_total;
20362306a36Sopenharmony_ci	      uint64_t mem_free;
20462306a36Sopenharmony_ci	      struct perf_header_string cpus;
20562306a36Sopenharmony_ci       } nodes[nr]; /* Variable length records */
20662306a36Sopenharmony_ci};
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci	HEADER_BRANCH_STACK = 15,
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ciNot implemented in perf.
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci	HEADER_PMU_MAPPINGS = 16,
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci	A list of PMU structures, defining the different PMUs supported by perf.
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_cistruct {
21762306a36Sopenharmony_ci       uint32_t nr;
21862306a36Sopenharmony_ci       struct pmu {
21962306a36Sopenharmony_ci	      uint32_t pmu_type;
22062306a36Sopenharmony_ci	      struct perf_header_string pmu_name;
22162306a36Sopenharmony_ci       } [nr]; /* Variable length records */
22262306a36Sopenharmony_ci};
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci	HEADER_GROUP_DESC = 17,
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci	Description of counter groups ({...} in perf syntax)
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_cistruct {
22962306a36Sopenharmony_ci         uint32_t nr;
23062306a36Sopenharmony_ci         struct {
23162306a36Sopenharmony_ci		struct perf_header_string string;
23262306a36Sopenharmony_ci		uint32_t leader_idx;
23362306a36Sopenharmony_ci		uint32_t nr_members;
23462306a36Sopenharmony_ci	 } [nr]; /* Variable length records */
23562306a36Sopenharmony_ci};
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci	HEADER_AUXTRACE = 18,
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_ciDefine additional auxtrace areas in the perf.data. auxtrace is used to store
24062306a36Sopenharmony_ciundecoded hardware tracing information, such as Intel Processor Trace data.
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci/**
24362306a36Sopenharmony_ci * struct auxtrace_index_entry - indexes a AUX area tracing event within a
24462306a36Sopenharmony_ci *                               perf.data file.
24562306a36Sopenharmony_ci * @file_offset: offset within the perf.data file
24662306a36Sopenharmony_ci * @sz: size of the event
24762306a36Sopenharmony_ci */
24862306a36Sopenharmony_cistruct auxtrace_index_entry {
24962306a36Sopenharmony_ci	u64			file_offset;
25062306a36Sopenharmony_ci	u64			sz;
25162306a36Sopenharmony_ci};
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci#define PERF_AUXTRACE_INDEX_ENTRY_COUNT 256
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci/**
25662306a36Sopenharmony_ci * struct auxtrace_index - index of AUX area tracing events within a perf.data
25762306a36Sopenharmony_ci *                         file.
25862306a36Sopenharmony_ci * @list: linking a number of arrays of entries
25962306a36Sopenharmony_ci * @nr: number of entries
26062306a36Sopenharmony_ci * @entries: array of entries
26162306a36Sopenharmony_ci */
26262306a36Sopenharmony_cistruct auxtrace_index {
26362306a36Sopenharmony_ci	struct list_head	list;
26462306a36Sopenharmony_ci	size_t			nr;
26562306a36Sopenharmony_ci	struct auxtrace_index_entry entries[PERF_AUXTRACE_INDEX_ENTRY_COUNT];
26662306a36Sopenharmony_ci};
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci	HEADER_STAT = 19,
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ciThis is merely a flag signifying that the data section contains data
27162306a36Sopenharmony_cirecorded from perf stat record.
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci	HEADER_CACHE = 20,
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ciDescription of the cache hierarchy. Based on the Linux sysfs format
27662306a36Sopenharmony_ciin /sys/devices/system/cpu/cpu*/cache/
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci	u32 version	Currently always 1
27962306a36Sopenharmony_ci	u32 number_of_cache_levels
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_cistruct {
28262306a36Sopenharmony_ci	u32	level;
28362306a36Sopenharmony_ci	u32	line_size;
28462306a36Sopenharmony_ci	u32	sets;
28562306a36Sopenharmony_ci	u32	ways;
28662306a36Sopenharmony_ci	struct perf_header_string type;
28762306a36Sopenharmony_ci	struct perf_header_string size;
28862306a36Sopenharmony_ci	struct perf_header_string map;
28962306a36Sopenharmony_ci}[number_of_cache_levels];
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci	HEADER_SAMPLE_TIME = 21,
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_ciTwo uint64_t for the time of first sample and the time of last sample.
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci	HEADER_SAMPLE_TOPOLOGY = 22,
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ciPhysical memory map and its node assignments.
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_ciThe format of data in MEM_TOPOLOGY is as follows:
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_ci	u64 version;            // Currently 1
30262306a36Sopenharmony_ci	u64 block_size_bytes;   // /sys/devices/system/memory/block_size_bytes
30362306a36Sopenharmony_ci	u64 count;              // number of nodes
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_cistruct memory_node {
30662306a36Sopenharmony_ci        u64 node_id;            // node index
30762306a36Sopenharmony_ci        u64 size;               // size of bitmap
30862306a36Sopenharmony_ci        struct bitmap {
30962306a36Sopenharmony_ci		/* size of bitmap again */
31062306a36Sopenharmony_ci                u64 bitmapsize;
31162306a36Sopenharmony_ci		/* bitmap of memory indexes that belongs to node     */
31262306a36Sopenharmony_ci		/* /sys/devices/system/node/node<NODE>/memory<INDEX> */
31362306a36Sopenharmony_ci                u64 entries[(bitmapsize/64)+1];
31462306a36Sopenharmony_ci        }
31562306a36Sopenharmony_ci}[count];
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ciThe MEM_TOPOLOGY can be displayed with following command:
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci$ perf report --header-only -I
32062306a36Sopenharmony_ci...
32162306a36Sopenharmony_ci# memory nodes (nr 1, block size 0x8000000):
32262306a36Sopenharmony_ci#    0 [7G]: 0-23,32-69
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci	HEADER_CLOCKID = 23,
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_ciOne uint64_t for the clockid frequency, specified, for instance, via 'perf
32762306a36Sopenharmony_cirecord -k' (see clock_gettime()), to enable timestamps derived metrics
32862306a36Sopenharmony_ciconversion into wall clock time on the reporting stage.
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_ci	HEADER_DIR_FORMAT = 24,
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ciThe data files layout is described by HEADER_DIR_FORMAT feature.  Currently it
33362306a36Sopenharmony_ciholds only version number (1):
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci  uint64_t version;
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_ciThe current version holds only version value (1) means that data files:
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci- Follow the 'data.*' name format.
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci- Contain raw events data in standard perf format as read from kernel (and need
34262306a36Sopenharmony_ci  to be sorted)
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ciFuture versions are expected to describe different data files layout according
34562306a36Sopenharmony_cito special needs.
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci        HEADER_BPF_PROG_INFO = 25,
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_cistruct perf_bpil, which contains detailed information about
35062306a36Sopenharmony_cia BPF program, including type, id, tag, jited/xlated instructions, etc.
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ci        HEADER_BPF_BTF = 26,
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ciContains BPF Type Format (BTF). For more information about BTF, please
35562306a36Sopenharmony_cirefer to Documentation/bpf/btf.rst.
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_cistruct {
35862306a36Sopenharmony_ci	u32	id;
35962306a36Sopenharmony_ci	u32	data_size;
36062306a36Sopenharmony_ci	char	data[];
36162306a36Sopenharmony_ci};
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_ci        HEADER_COMPRESSED = 27,
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_cistruct {
36662306a36Sopenharmony_ci	u32	version;
36762306a36Sopenharmony_ci	u32	type;
36862306a36Sopenharmony_ci	u32	level;
36962306a36Sopenharmony_ci	u32	ratio;
37062306a36Sopenharmony_ci	u32	mmap_len;
37162306a36Sopenharmony_ci};
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ciIndicates that trace contains records of PERF_RECORD_COMPRESSED type
37462306a36Sopenharmony_cithat have perf_events records in compressed form.
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci	HEADER_CPU_PMU_CAPS = 28,
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_ci	A list of cpu PMU capabilities. The format of data is as below.
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_cistruct {
38162306a36Sopenharmony_ci	u32 nr_cpu_pmu_caps;
38262306a36Sopenharmony_ci	{
38362306a36Sopenharmony_ci		char	name[];
38462306a36Sopenharmony_ci		char	value[];
38562306a36Sopenharmony_ci	} [nr_cpu_pmu_caps]
38662306a36Sopenharmony_ci};
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_ci
38962306a36Sopenharmony_ciExample:
39062306a36Sopenharmony_ci cpu pmu capabilities: branches=32, max_precise=3, pmu_name=icelake
39162306a36Sopenharmony_ci
39262306a36Sopenharmony_ci	HEADER_CLOCK_DATA = 29,
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci	Contains clock id and its reference time together with wall clock
39562306a36Sopenharmony_ci	time taken at the 'same time', both values are in nanoseconds.
39662306a36Sopenharmony_ci	The format of data is as below.
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_cistruct {
39962306a36Sopenharmony_ci	u32 version;  /* version = 1 */
40062306a36Sopenharmony_ci	u32 clockid;
40162306a36Sopenharmony_ci	u64 wall_clock_ns;
40262306a36Sopenharmony_ci	u64 clockid_time_ns;
40362306a36Sopenharmony_ci};
40462306a36Sopenharmony_ci
40562306a36Sopenharmony_ci	HEADER_HYBRID_TOPOLOGY = 30,
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ciIndicate the hybrid CPUs. The format of data is as below.
40862306a36Sopenharmony_ci
40962306a36Sopenharmony_cistruct {
41062306a36Sopenharmony_ci	u32 nr;
41162306a36Sopenharmony_ci	struct {
41262306a36Sopenharmony_ci		char pmu_name[];
41362306a36Sopenharmony_ci		char cpus[];
41462306a36Sopenharmony_ci	} [nr]; /* Variable length records */
41562306a36Sopenharmony_ci};
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_ciExample:
41862306a36Sopenharmony_ci  hybrid cpu system:
41962306a36Sopenharmony_ci  cpu_core cpu list : 0-15
42062306a36Sopenharmony_ci  cpu_atom cpu list : 16-23
42162306a36Sopenharmony_ci
42262306a36Sopenharmony_ci	HEADER_PMU_CAPS = 31,
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_ci	List of pmu capabilities (except cpu pmu which is already
42562306a36Sopenharmony_ci	covered by HEADER_CPU_PMU_CAPS). Note that hybrid cpu pmu
42662306a36Sopenharmony_ci	capabilities are also stored here.
42762306a36Sopenharmony_ci
42862306a36Sopenharmony_cistruct {
42962306a36Sopenharmony_ci	u32 nr_pmu;
43062306a36Sopenharmony_ci	struct {
43162306a36Sopenharmony_ci		u32 nr_caps;
43262306a36Sopenharmony_ci		{
43362306a36Sopenharmony_ci			char	name[];
43462306a36Sopenharmony_ci			char	value[];
43562306a36Sopenharmony_ci		} [nr_caps];
43662306a36Sopenharmony_ci		char pmu_name[];
43762306a36Sopenharmony_ci	} [nr_pmu];
43862306a36Sopenharmony_ci};
43962306a36Sopenharmony_ci
44062306a36Sopenharmony_ci	other bits are reserved and should ignored for now
44162306a36Sopenharmony_ci	HEADER_FEAT_BITS	= 256,
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_ciAttributes
44462306a36Sopenharmony_ci
44562306a36Sopenharmony_ciThis is an array of perf_event_attrs, each attr_size bytes long, which defines
44662306a36Sopenharmony_cieach event collected. See perf_event.h or the man page for a detailed
44762306a36Sopenharmony_cidescription.
44862306a36Sopenharmony_ci
44962306a36Sopenharmony_ciData
45062306a36Sopenharmony_ci
45162306a36Sopenharmony_ciThis section is the bulk of the file. It consist of a stream of perf_events
45262306a36Sopenharmony_cidescribing events. This matches the format generated by the kernel.
45362306a36Sopenharmony_ciSee perf_event.h or the manpage for a detailed description.
45462306a36Sopenharmony_ci
45562306a36Sopenharmony_ciSome notes on parsing:
45662306a36Sopenharmony_ci
45762306a36Sopenharmony_ciOrdering
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_ciThe events are not necessarily in time stamp order, as they can be
46062306a36Sopenharmony_cicollected in parallel on different CPUs. If the events should be
46162306a36Sopenharmony_ciprocessed in time order they need to be sorted first. It is possible
46262306a36Sopenharmony_cito only do a partial sort using the FINISHED_ROUND event header (see
46362306a36Sopenharmony_cibelow). perf record guarantees that there is no reordering over a
46462306a36Sopenharmony_ciFINISHED_ROUND.
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_ciID vs IDENTIFIER
46762306a36Sopenharmony_ci
46862306a36Sopenharmony_ciWhen the event stream contains multiple events each event is identified
46962306a36Sopenharmony_ciby an ID. This can be either through the PERF_SAMPLE_ID or the
47062306a36Sopenharmony_ciPERF_SAMPLE_IDENTIFIER header. The PERF_SAMPLE_IDENTIFIER header is
47162306a36Sopenharmony_ciat a fixed offset from the event header, which allows reliable
47262306a36Sopenharmony_ciparsing of the header. Relying on ID may be ambiguous.
47362306a36Sopenharmony_ciIDENTIFIER is only supported by newer Linux kernels.
47462306a36Sopenharmony_ci
47562306a36Sopenharmony_ciPerf record specific events:
47662306a36Sopenharmony_ci
47762306a36Sopenharmony_ciIn addition to the kernel generated event types perf record adds its
47862306a36Sopenharmony_ciown event types (in addition it also synthesizes some kernel events,
47962306a36Sopenharmony_cifor example MMAP events)
48062306a36Sopenharmony_ci
48162306a36Sopenharmony_ci	PERF_RECORD_USER_TYPE_START		= 64,
48262306a36Sopenharmony_ci	PERF_RECORD_HEADER_ATTR			= 64,
48362306a36Sopenharmony_ci
48462306a36Sopenharmony_cistruct attr_event {
48562306a36Sopenharmony_ci	struct perf_event_header header;
48662306a36Sopenharmony_ci	struct perf_event_attr attr;
48762306a36Sopenharmony_ci	uint64_t id[];
48862306a36Sopenharmony_ci};
48962306a36Sopenharmony_ci
49062306a36Sopenharmony_ci	PERF_RECORD_HEADER_EVENT_TYPE		= 65, /* deprecated */
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_ci#define MAX_EVENT_NAME 64
49362306a36Sopenharmony_ci
49462306a36Sopenharmony_cistruct perf_trace_event_type {
49562306a36Sopenharmony_ci	uint64_t	event_id;
49662306a36Sopenharmony_ci	char	name[MAX_EVENT_NAME];
49762306a36Sopenharmony_ci};
49862306a36Sopenharmony_ci
49962306a36Sopenharmony_cistruct event_type_event {
50062306a36Sopenharmony_ci	struct perf_event_header header;
50162306a36Sopenharmony_ci	struct perf_trace_event_type event_type;
50262306a36Sopenharmony_ci};
50362306a36Sopenharmony_ci
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_ci	PERF_RECORD_HEADER_TRACING_DATA		= 66,
50662306a36Sopenharmony_ci
50762306a36Sopenharmony_ciDescribe me
50862306a36Sopenharmony_ci
50962306a36Sopenharmony_cistruct tracing_data_event {
51062306a36Sopenharmony_ci	struct perf_event_header header;
51162306a36Sopenharmony_ci	uint32_t size;
51262306a36Sopenharmony_ci};
51362306a36Sopenharmony_ci
51462306a36Sopenharmony_ci	PERF_RECORD_HEADER_BUILD_ID		= 67,
51562306a36Sopenharmony_ci
51662306a36Sopenharmony_ciDefine a ELF build ID for a referenced executable.
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_ci       struct build_id_event;   /* See above */
51962306a36Sopenharmony_ci
52062306a36Sopenharmony_ci	PERF_RECORD_FINISHED_ROUND		= 68,
52162306a36Sopenharmony_ci
52262306a36Sopenharmony_ciNo event reordering over this header. No payload.
52362306a36Sopenharmony_ci
52462306a36Sopenharmony_ci	PERF_RECORD_ID_INDEX			= 69,
52562306a36Sopenharmony_ci
52662306a36Sopenharmony_ciMap event ids to CPUs and TIDs.
52762306a36Sopenharmony_ci
52862306a36Sopenharmony_cistruct id_index_entry {
52962306a36Sopenharmony_ci	uint64_t id;
53062306a36Sopenharmony_ci	uint64_t idx;
53162306a36Sopenharmony_ci	uint64_t cpu;
53262306a36Sopenharmony_ci	uint64_t tid;
53362306a36Sopenharmony_ci};
53462306a36Sopenharmony_ci
53562306a36Sopenharmony_cistruct id_index_event {
53662306a36Sopenharmony_ci	struct perf_event_header header;
53762306a36Sopenharmony_ci	uint64_t nr;
53862306a36Sopenharmony_ci	struct id_index_entry entries[nr];
53962306a36Sopenharmony_ci};
54062306a36Sopenharmony_ci
54162306a36Sopenharmony_ci	PERF_RECORD_AUXTRACE_INFO		= 70,
54262306a36Sopenharmony_ci
54362306a36Sopenharmony_ciAuxtrace type specific information. Describe me
54462306a36Sopenharmony_ci
54562306a36Sopenharmony_cistruct auxtrace_info_event {
54662306a36Sopenharmony_ci	struct perf_event_header header;
54762306a36Sopenharmony_ci	uint32_t type;
54862306a36Sopenharmony_ci	uint32_t reserved__; /* For alignment */
54962306a36Sopenharmony_ci	uint64_t priv[];
55062306a36Sopenharmony_ci};
55162306a36Sopenharmony_ci
55262306a36Sopenharmony_ci	PERF_RECORD_AUXTRACE			= 71,
55362306a36Sopenharmony_ci
55462306a36Sopenharmony_ciDefines auxtrace data. Followed by the actual data. The contents of
55562306a36Sopenharmony_cithe auxtrace data is dependent on the event and the CPU. For example
55662306a36Sopenharmony_cifor Intel Processor Trace it contains Processor Trace data generated
55762306a36Sopenharmony_ciby the CPU.
55862306a36Sopenharmony_ci
55962306a36Sopenharmony_cistruct auxtrace_event {
56062306a36Sopenharmony_ci	struct perf_event_header header;
56162306a36Sopenharmony_ci	uint64_t size;
56262306a36Sopenharmony_ci	uint64_t offset;
56362306a36Sopenharmony_ci	uint64_t reference;
56462306a36Sopenharmony_ci	uint32_t idx;
56562306a36Sopenharmony_ci	uint32_t tid;
56662306a36Sopenharmony_ci	uint32_t cpu;
56762306a36Sopenharmony_ci	uint32_t reserved__; /* For alignment */
56862306a36Sopenharmony_ci};
56962306a36Sopenharmony_ci
57062306a36Sopenharmony_cistruct aux_event {
57162306a36Sopenharmony_ci	struct perf_event_header header;
57262306a36Sopenharmony_ci	uint64_t	aux_offset;
57362306a36Sopenharmony_ci	uint64_t	aux_size;
57462306a36Sopenharmony_ci	uint64_t	flags;
57562306a36Sopenharmony_ci};
57662306a36Sopenharmony_ci
57762306a36Sopenharmony_ci	PERF_RECORD_AUXTRACE_ERROR		= 72,
57862306a36Sopenharmony_ci
57962306a36Sopenharmony_ciDescribes an error in hardware tracing
58062306a36Sopenharmony_ci
58162306a36Sopenharmony_cienum auxtrace_error_type {
58262306a36Sopenharmony_ci	PERF_AUXTRACE_ERROR_ITRACE  = 1,
58362306a36Sopenharmony_ci	PERF_AUXTRACE_ERROR_MAX
58462306a36Sopenharmony_ci};
58562306a36Sopenharmony_ci
58662306a36Sopenharmony_ci#define MAX_AUXTRACE_ERROR_MSG 64
58762306a36Sopenharmony_ci
58862306a36Sopenharmony_cistruct auxtrace_error_event {
58962306a36Sopenharmony_ci	struct perf_event_header header;
59062306a36Sopenharmony_ci	uint32_t type;
59162306a36Sopenharmony_ci	uint32_t code;
59262306a36Sopenharmony_ci	uint32_t cpu;
59362306a36Sopenharmony_ci	uint32_t pid;
59462306a36Sopenharmony_ci	uint32_t tid;
59562306a36Sopenharmony_ci	uint32_t reserved__; /* For alignment */
59662306a36Sopenharmony_ci	uint64_t ip;
59762306a36Sopenharmony_ci	char msg[MAX_AUXTRACE_ERROR_MSG];
59862306a36Sopenharmony_ci};
59962306a36Sopenharmony_ci
60062306a36Sopenharmony_ci	PERF_RECORD_HEADER_FEATURE		= 80,
60162306a36Sopenharmony_ci
60262306a36Sopenharmony_ciDescribes a header feature. These are records used in pipe-mode that
60362306a36Sopenharmony_cicontain information that otherwise would be in perf.data file's header.
60462306a36Sopenharmony_ci
60562306a36Sopenharmony_ci	PERF_RECORD_COMPRESSED 			= 81,
60662306a36Sopenharmony_ci
60762306a36Sopenharmony_cistruct compressed_event {
60862306a36Sopenharmony_ci	struct perf_event_header	header;
60962306a36Sopenharmony_ci	char				data[];
61062306a36Sopenharmony_ci};
61162306a36Sopenharmony_ci
61262306a36Sopenharmony_ci	PERF_RECORD_FINISHED_INIT			= 82,
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_ciMarks the end of records for the system, pre-existing threads in system wide
61562306a36Sopenharmony_cisessions, etc. Those are the ones prefixed PERF_RECORD_USER_*.
61662306a36Sopenharmony_ci
61762306a36Sopenharmony_ciThis is used, for instance, to 'perf inject' events after init and before
61862306a36Sopenharmony_ciregular events, those emitted by the kernel, to support combining guest and
61962306a36Sopenharmony_cihost records.
62062306a36Sopenharmony_ci
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_ciThe header is followed by compressed data frame that can be decompressed
62362306a36Sopenharmony_ciinto array of perf trace records. The size of the entire compressed event
62462306a36Sopenharmony_cirecord including the header is limited by the max value of header.size.
62562306a36Sopenharmony_ci
62662306a36Sopenharmony_ciEvent types
62762306a36Sopenharmony_ci
62862306a36Sopenharmony_ciDefine the event attributes with their IDs.
62962306a36Sopenharmony_ci
63062306a36Sopenharmony_ciAn array bound by the perf_file_section size.
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_ci	struct {
63362306a36Sopenharmony_ci		struct perf_event_attr attr;   /* Size defined by header.attr_size */
63462306a36Sopenharmony_ci		struct perf_file_section ids;
63562306a36Sopenharmony_ci	}
63662306a36Sopenharmony_ci
63762306a36Sopenharmony_ciids points to a array of uint64_t defining the ids for event attr attr.
63862306a36Sopenharmony_ci
63962306a36Sopenharmony_ciPipe-mode data
64062306a36Sopenharmony_ci
64162306a36Sopenharmony_ciPipe-mode avoid seeks in the file by removing the perf_file_section and flags
64262306a36Sopenharmony_cifrom the struct perf_header. The trimmed header is:
64362306a36Sopenharmony_ci
64462306a36Sopenharmony_cistruct perf_pipe_file_header {
64562306a36Sopenharmony_ci	u64				magic;
64662306a36Sopenharmony_ci	u64				size;
64762306a36Sopenharmony_ci};
64862306a36Sopenharmony_ci
64962306a36Sopenharmony_ciThe information about attrs, data, and event_types is instead in the
65062306a36Sopenharmony_cisynthesized events PERF_RECORD_ATTR, PERF_RECORD_HEADER_TRACING_DATA,
65162306a36Sopenharmony_ciPERF_RECORD_HEADER_EVENT_TYPE, and PERF_RECORD_HEADER_FEATURE
65262306a36Sopenharmony_cithat are generated by perf record in pipe-mode.
65362306a36Sopenharmony_ci
65462306a36Sopenharmony_ci
65562306a36Sopenharmony_ciReferences:
65662306a36Sopenharmony_ci
65762306a36Sopenharmony_ciinclude/uapi/linux/perf_event.h
65862306a36Sopenharmony_ci
65962306a36Sopenharmony_ciThis is the canonical description of the kernel generated perf_events
66062306a36Sopenharmony_ciand the perf_event_attrs.
66162306a36Sopenharmony_ci
66262306a36Sopenharmony_ciperf_events manpage
66362306a36Sopenharmony_ci
66462306a36Sopenharmony_ciA manpage describing perf_event and perf_event_attr is here:
66562306a36Sopenharmony_cihttp://web.eece.maine.edu/~vweaver/projects/perf_events/programming.html
66662306a36Sopenharmony_ciThis tends to be slightly behind the kernel include, but has better
66762306a36Sopenharmony_cidescriptions.  An (typically older) version of the man page may be
66862306a36Sopenharmony_ciincluded with the standard Linux man pages, available with "man
66962306a36Sopenharmony_ciperf_events"
67062306a36Sopenharmony_ci
67162306a36Sopenharmony_cipmu-tools
67262306a36Sopenharmony_ci
67362306a36Sopenharmony_cihttps://github.com/andikleen/pmu-tools/tree/master/parser
67462306a36Sopenharmony_ci
67562306a36Sopenharmony_ciA definition of the perf.data format in python "construct" format is available
67662306a36Sopenharmony_ciin pmu-tools parser. This allows to read perf.data from python and dump it.
67762306a36Sopenharmony_ci
67862306a36Sopenharmony_ciquipper
67962306a36Sopenharmony_ci
68062306a36Sopenharmony_ciThe quipper C++ parser is available at
68162306a36Sopenharmony_cihttp://github.com/google/perf_data_converter/tree/master/src/quipper
68262306a36Sopenharmony_ci
683