perf/core improvements and fixes
Arnaldo Carvalho de Melo
maintainerHi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit d4cf1949f9689314aef962eea95df84a8288d097:
perf/x86/intel: Add {rd,wr}lbr_{to,from} wrappers (2016-06-27 11:34:21 +0200)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo-20160627
for you to fetch changes up to 6d9c675078e697309c1c06a1051f01de8151c476:
perf data ctf: Generate fork and exit events to CTF output (2016-06-27 15:50:23 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
New features:
- Generate comm, fork and exit events when converting perf.data files to CTF (Wang Nan)
Documentation:
- Document perf.data on disk format (Andi Kleen)
Infrastructure:
- Add libbabeltrace to build-test (Wang Nan)
- 'perf record' prep work to support multiple evlists (Wang Nan)
- Remove unused hist_entry__annotate function (Ravi Bangoria)
- Add more toolchain triplets (Ravi Bangoria)
- Update message for slang devel packages on Ubuntu (Neeraj Badlani)
- Generalize handling of 'ret' instructions in the annotate TUI (Naveen N. Rao)
- Use proper dso name for is_regular_file, fixing device file handling (Jiri Olsa)
Build Fixes:
- Add missing config.h include, fixing the build with libabeltrace (Jiri Olsa)
----------------------------------------------------------------
Andi Kleen (1):
perf tools: Add documentation for perf.data on disk format
Jiri Olsa (2):
perf data convert: Include config.h header perf symbols: Use proper dso name for is_regular_file
Naveen N. Rao (1):
perf annotate: Generalize handling of 'ret' instructions
Neeraj Badlani (1):
perf tools: Update makefile message for installing slang devel package
Ravi Bangoria (2):
perf annotate: Remove unused hist_entry__annotate function perf tools: Add more toolchain triplets
Wang Nan (11):
perf build: Add libbabeltrace to build-test
perf record: Move mmap setup block to separate function
perf record: Prepare reading from multiple evlists in record__mmap_read_all() perf record: Prepare picking perf_event_mmap_page from multiple evlists perf data ctf: Add value_set_string() helper
perf data ctf: Pass convert options through opts structure
perf data ctf: Add 'all' option
perf data ctf: Prepare collect non-sample events
perf data ctf: Generate comm event to CTF output
perf data ctf: Add '--all' option for 'perf data convert'
perf data ctf: Generate fork and exit events to CTF output
tools/perf/Documentation/perf-data.txt | 4 + tools/perf/Documentation/perf-file-format.txt | 442 ++++++++++++++++++++++++++ tools/perf/arch/common.c | 17 + tools/perf/builtin-data.c | 11 +- tools/perf/builtin-record.c | 105 ++++-- tools/perf/config/Makefile | 2 +- tools/perf/tests/make | 2 + tools/perf/ui/browsers/annotate.c | 20 +- tools/perf/util/annotate.c | 15 +- tools/perf/util/annotate.h | 3 +- tools/perf/util/data-convert-bt.c | 196 +++++++++++- tools/perf/util/data-convert-bt.h | 4 +- tools/perf/util/data-convert.h | 9 + tools/perf/util/symbol.c | 2 +- 14 files changed, 773 insertions(+), 59 deletions(-) create mode 100644 tools/perf/Documentation/perf-file-format.txt create mode 100644 tools/perf/util/data-convert.h
Arnaldo Carvalho de Melo
maintainerPATCH 1/18 perf annotate: Remove unused hist_entry__annotate function
From: Ravi Bangoria <[email protected]>
hist_entry__annotate looks part of API but I don't find any caller of this function. Removing it.
--- tools/perf/util/annotate.c | 5 ----- tools/perf/util/annotate.h | 2 -- 2 files changed, 7 deletions(-)
tools/perf/util/annotate.c +0 -5
@@ -1676,11 +1676,6 @@ int symbol__tty_annotate(struct symbol *sym, struct map *map,return 0 ; } -int hist_entry__annotate (struct hist_entry *he,size_t privsize) -{ -return symbol__annotate (he->ms.sym, he->ms.map, privsize); -} -bool ui__has_annotation (void ) {return use_browser ==1 && perf_hpp_list.sym;
tools/perf/util/annotate.h +0 -2
@@ -156,8 +156,6 @@ void symbol__annotate_zero_histograms(struct symbol *sym);int symbol__annotate (struct symbol *sym,struct map *map,size_t privsize); -int hist_entry__annotate (struct hist_entry *he,size_t privsize); -int symbol__annotate_init (struct map *map,struct symbol *sym); int symbol__annotate_printf(struct symbol *sym, struct map *map, struct perf_evsel *evsel, bool full_paths,
Signature · 1 line
2.7.4
Arnaldo Carvalho de Melo
maintainerPATCH 2/18 perf tools: Update makefile message for installing slang devel package
In reply to Arnaldo Carvalho de MeloFrom: Neeraj Badlani <[email protected]>
In case of missing library (libslang), give hint to install library (libslang2-dev), since libslang-dev is not provided by Ubuntu.
--- tools/perf/config/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/config/Makefile +1 -1
@@ -482,7 +482,7 @@ endif ifndef NO_SLANG ifneq ($(feature-libslang), 1) - msg := $(warning slang not found, disables TUI support. Please install slang-devel or libslang-dev); + msg := $(warning slang not found, disables TUI support. Please install slang-devel, libslang-dev or libslang2-dev); NO_SLANG := 1 else # Fedora has /usr/include/slang/slang.h, but ubuntu /usr/include/slang.h
Signature · 1 line
2.7.4
Arnaldo Carvalho de Melo
maintainerPATCH 3/18 perf annotate: Generalize handling of 'ret' instructions
In reply to Arnaldo Carvalho de MeloFrom: "Naveen N. Rao" <[email protected]>
Introduce helper to detect 'ret' instructions and use the same in the TUI. A helper is needed since some architectures such as powerpc have more than one return instruction.
--- tools/perf/ui/browsers/annotate.c | 20 +++++++++----------- tools/perf/util/annotate.c | 10 ++++++++++ tools/perf/util/annotate.h | 1 + 3 files changed, 20 insertions(+), 11 deletions(-)
tools/perf/ui/browsers/annotate.c +9 -11
@@ -223,16 +223,14 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int }else if (ins__is_call (dl->ins)) {ui_browser__write_graph (browser,SLSMG_RARROW_CHAR );SLsmg_write_char (' ' ); + }else if (ins__is_ret (dl->ins)) { +ui_browser__write_graph (browser,SLSMG_LARROW_CHAR ); +SLsmg_write_char (' ' ); }else {ui_browser__write_nstring (browser," " ,2 ); } }else { -if (strcmp (dl->name,"retq" )) { -ui_browser__write_nstring (browser," " ,2 ); - }else { -ui_browser__write_graph (browser,SLSMG_LARROW_CHAR ); -SLsmg_write_char (' ' ); - } +ui_browser__write_nstring (browser," " ,2 ); }disasm_line__scnprintf (dl, bf,sizeof (bf), !annotate_browser__opts.use_offset);
@@ -843,14 +841,14 @@ show_help:ui_helpline__puts ("Huh? No selection. Report to [email protected]" ); else if (browser->selection->offset == -1) ui_helpline__puts("Actions are only available for assembly lines."); - else if (!browser->selection->ins) { -if (strcmp (browser->selection->name,"retq" )) - goto show_sup_ins; + else if (!browser->selection->ins) + goto show_sup_ins; + else if (ins__is_ret(browser->selection->ins)) goto out; - } else if (!(annotate_browser__jump(browser) || + else if (!(annotate_browser__jump(browser) || annotate_browser__callq(browser, evsel, hbt))) { show_sup_ins: -ui_helpline__puts ("Actions are only available for 'callq', 'retq' & jump instructions." ); +ui_helpline__puts ("Actions are only available for function call/return & jump/branch instructions." ); }continue ;case 't' :
tools/perf/util/annotate.c +10 -0
@@ -354,6 +354,15 @@ static struct ins_ops nop_ops = { .scnprintf = nop__scnprintf, }; +static struct ins_ops ret_ops = { + .scnprintf = ins__raw_scnprintf, +}; + +bool ins__is_ret (const struct ins *ins) +{ +return ins->ops == &ret_ops; +} +static struct ins instructions[] = { { .name ="add" , .ops = &mov_ops, }, { .name ="addl" , .ops = &mov_ops, },
@@ -444,6 +453,7 @@ static struct ins instructions[] = { { .name = "xadd", .ops = &mov_ops, }, { .name = "xbeginl", .ops = &jump_ops, }, { .name = "xbeginq", .ops = &jump_ops, }, + { .name = "retq", .ops = &ret_ops, }, }; static int ins__key_cmp(const void *name, const void *insp)
tools/perf/util/annotate.h +1 -0
@@ -48,6 +48,7 @@ struct ins {bool ins__is_jump (const struct ins *ins);bool ins__is_call (const struct ins *ins); +bool ins__is_ret (const struct ins *ins);int ins__scnprintf (struct ins *ins,char *bf,size_t size,struct ins_operands *ops);struct annotation ;
Signature · 1 line
2.7.4
Arnaldo Carvalho de Melo
maintainerPATCH 4/18 perf tools: Add more toolchain triplets
In reply to Arnaldo Carvalho de MeloFrom: Ravi Bangoria <[email protected]>
Add few more triplets based on Fedora and Ubuntu binutils (cross tools).
Before applying patch on x86:
( Install binutils-powerpc64-linux-gnu.x86_64 )
$ perf report -i perf.data.powerpc --vmlinux vmlinux.powerpc \
--objdump powerpc64-linux-gnu-objdumpAfter applying patch on x86:
$ perf report -i perf.data.powerpc --vmlinux vmlinux.powerpc
I.e. it will find the right objdump from the environment data recorded in the perf.data file + these triplets.
--- tools/perf/arch/common.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
tools/perf/arch/common.c +17 -0
@@ -9,34 +9,44 @@ const char *const arm_triplets[] = {"arm-unknown-linux-" ,"arm-unknown-linux-gnu-" ,"arm-unknown-linux-gnueabi-" , +"arm-linux-gnu-" , +"arm-linux-gnueabihf-" , +"arm-none-eabi-" , NULL };const char *const arm64_triplets[] = {"aarch64-linux-android-" , +"aarch64-linux-gnu-" ,NULL };const char *const powerpc_triplets[] = {"powerpc-unknown-linux-gnu-" ,"powerpc64-unknown-linux-gnu-" , +"powerpc64-linux-gnu-" , +"powerpc64le-linux-gnu-" ,NULL };const char *const s390_triplets[] = {"s390-ibm-linux-" , +"s390x-linux-gnu-" ,NULL };const char *const sh_triplets[] = {"sh-unknown-linux-gnu-" ,"sh64-unknown-linux-gnu-" , +"sh-linux-gnu-" , +"sh64-linux-gnu-" ,NULL };const char *const sparc_triplets[] = {"sparc-unknown-linux-gnu-" ,"sparc64-unknown-linux-gnu-" , +"sparc64-linux-gnu-" ,NULL };
@@ -49,12 +59,19 @@ const char *const x86_triplets[] = {"i386-pc-linux-gnu-" ,"i686-linux-android-" ,"i686-android-linux-" , +"x86_64-linux-gnu-" , +"i586-linux-gnu-" , NULL };const char *const mips_triplets[] = {"mips-unknown-linux-gnu-" ,"mipsel-linux-android-" , +"mips-linux-gnu-" , +"mips64-linux-gnu-" , +"mips64el-linux-gnuabi64-" , +"mips64-linux-gnuabi64-" , +"mipsel-linux-gnu-" ,NULL };
Signature · 1 line
2.7.4
Arnaldo Carvalho de Melo
maintainerPATCH 5/18 perf tools: Add documentation for perf.data on disk format
In reply to Arnaldo Carvalho de MeloFrom: Andi Kleen <[email protected]>
Add some documentation for the on disk format of perf.data. This is not documenting the actual perf events -- which are documented in perf_event.h -- but just the additional headers that perf record adds around them when writing the data to disk.
--- tools/perf/Documentation/perf-file-format.txt | 442 ++++++++++++++++++++++++++ 1 file changed, 442 insertions(+) create mode 100644 tools/perf/Documentation/perf-file-format.txt
tools/perf/Documentation/perf-file-format.txt new file +442 -0
@@ -0,0 +1,442 @@ +perf.data format + +Uptodate as of v4.7 + +This document describes the on-disk perf.data format, generated by perf record +or perf inject and consumed by the other perf tools. + +On a high level perf.data contains the events generated by the PMUs, plus metadata. + +All fields are in native-endian of the machine that generated the perf.data. + +When perf is writing to a pipe it uses a special version of the file +format that does not rely on seeking to adjust data offsets. This +format is not described here. The pipe version can be converted to +normal perf.data with perf inject. + +The file starts with a perf_header: + +struct perf_header { + char magic[8]; /* PERFILE2 */ + uint64_t size; /* size of the header */ + uint64_t attr_size; /* size of an attribute in attrs */ + struct perf_file_section attrs; + struct perf_file_section data; + struct perf_file_section event_types; + uint64_t flags; + uint64_t flags1[3]; +}; + +The magic number identifies the perf file and the version. Current perf versions +use PERFILE2. Old perf versions generated a version 1 format (PERFFILE). Version 1 +is not described here. The magic number also identifies the endian. When the +magic value is 64bit byte swapped compared the file is in non-native +endian. + +A perf_file_section contains a pointer to another section of the perf file. +The header contains three such pointers: for attributes, data and event types. + +struct perf_file_section { + uint64_t offset; /* offset from start of file */ + uint64_t size; /* size of the section */ +}; + +Flags section: + +The header is followed by different optional headers, described by the bits set +in flags. Only headers for which the bit is set are included. Each header +consists of a perf_file_section located after the initial header. +The respective perf_file_section points to the data of the additional +header and defines its size. + +Some headers consist of strings, which are defined like this: + +struct perf_header_string { + uint32_t len; + char string[len]; /* zero terminated */ +}; + +Some headers consist of a sequence of strings, which start with a + +struct perf_header_string_list { + uint32_t nr; + struct perf_header_string strings[nr]; /* variable length records */ +}; + +The bits are the flags bits in a 256 bit bitmap starting with +flags. These define the valid bits: + + HEADER_RESERVED = 0, /* always cleared */ + HEADER_FIRST_FEATURE = 1, + HEADER_TRACING_DATA = 1, + +Describe me. + + HEADER_BUILD_ID = 2, + +The header consists of an sequence of build_id_event. The size of each record +is defined by header.size (see perf_event.h). Each event defines a ELF build id +for a executable file name for a pid. An ELF build id is a unique identifier +assigned by the linker to an executable. + +struct build_id_event { + struct perf_event_header header; + pid_t pid; + uint8_t build_id[24]; + char filename[header.size - offsetof(struct build_id_event, filename)]; +}; + + HEADER_HOSTNAME = 3, + +A perf_header_string with the hostname where the data was collected +(uname -n) + + HEADER_OSRELEASE = 4, + +A perf_header_string with the os release where the data was collected +(uname -r) + + HEADER_VERSION = 5, + +A perf_header_string with the perf user tool version where the +data was collected. This is the same as the version of the source tree +the perf tool was built from. + + HEADER_ARCH = 6, + +A perf_header_string with the CPU architecture (uname -m) + + HEADER_NRCPUS = 7, + +A structure defining the number of CPUs. + +struct nr_cpus { + uint32_t nr_cpus_online; + uint32_t nr_cpus_available; /* CPUs not yet onlined */ +}; + + HEADER_CPUDESC = 8, + +A perf_header_string with description of the CPU. On x86 this is the model name +in /proc/cpuinfo + + HEADER_CPUID = 9, + +A perf_header_string with the exact CPU type. On x86 this is +vendor,family,model,stepping. For example: GenuineIntel,6,69,1 + + HEADER_TOTAL_MEM = 10, + +An uint64_t with the total memory in bytes. + + HEADER_CMDLINE = 11, + +A perf_header_string with the perf command line used to collect the data. + + HEADER_EVENT_DESC = 12, + +Another description of the perf_event_attrs, more detailed than header.attrs +including IDs and names. See perf_event.h or the man page for a description +of a struct perf_event_attr. + +struct { + uint32_t nr; /* number of events */ + uint32_t attr_size; /* size of each perf_event_attr */ + struct { + struct perf_event_attr attr; /* size of attr_size */ + uint32_t nr_ids; + struct perf_header_string event_string; + uint64_t ids[nr_ids]; + } events[nr]; /* Variable length records */ +}; + + HEADER_CPU_TOPOLOGY = 13, + +String lists defining the core and CPU threads topology. + +struct { + struct perf_header_string_list cores; /* Variable length */ + struct perf_header_string_list threads; /* Variable length */ +}; + +Example: + sibling cores : 0-3 + sibling threads : 0-1 + sibling threads : 2-3 + + HEADER_NUMA_TOPOLOGY = 14, + + A list of NUMA node descriptions + +struct { + uint32_t nr; + struct { + uint32_t nodenr; + uint64_t mem_total; + uint64_t mem_free; + struct perf_header_string cpus; + } nodes[nr]; /* Variable length records */ +}; + + HEADER_BRANCH_STACK = 15, + +Not implemented in perf. + + HEADER_PMU_MAPPINGS = 16, + + A list of PMU structures, defining the different PMUs supported by perf. + +struct { + uint32_t nr; + struct pmu { + uint32_t pmu_type; + struct perf_header_string pmu_name; + } [nr]; /* Variable length records */ +}; + + HEADER_GROUP_DESC = 17, + + Description of counter groups ({...} in perf syntax) + +struct { + uint32_t nr; + struct { + struct perf_header_string string; + uint32_t leader_idx; + uint32_t nr_members; + } [nr]; /* Variable length records */ +}; + + HEADER_AUXTRACE = 18, + +Define additional auxtrace areas in the perf.data. auxtrace is used to store +undecoded hardware tracing information, such as Intel Processor Trace data. + +/** + * struct auxtrace_index_entry - indexes a AUX area tracing event within a + * perf.data file. + * @file_offset: offset within the perf.data file + * @sz: size of the event + */ +struct auxtrace_index_entry { + u64 file_offset; + u64 sz; +}; + +#define PERF_AUXTRACE_INDEX_ENTRY_COUNT 256 + +/** + * struct auxtrace_index - index of AUX area tracing events within a perf.data + * file. + * @list: linking a number of arrays of entries + * @nr: number of entries + * @entries: array of entries + */ +struct auxtrace_index { + struct list_head list; + size_t nr; + struct auxtrace_index_entry entries[PERF_AUXTRACE_INDEX_ENTRY_COUNT]; +}; + + other bits are reserved and should ignored for now + HEADER_FEAT_BITS = 256, + +Attributes + +This is an array of perf_event_attrs, each attr_size bytes long, which defines +each event collected. See perf_event.h or the man page for a detailed +description. + +Data + +This section is the bulk of the file. It consist of a stream of perf_events +describing events. This matches the format generated by the kernel. +See perf_event.h or the manpage for a detailed description. + +Some notes on parsing: + +Ordering + +The events are not necessarily in time stamp order, as they can be +collected in parallel on different CPUs. If the events should be +processed in time order they need to be sorted first. It is possible +to only do a partial sort using the FINISHED_ROUND event header (see +below). perf record guarantees that there is no reordering over a +FINISHED_ROUND. + +ID vs IDENTIFIER + +When the event stream contains multiple events each event is identified +by an ID. This can be either through the PERF_SAMPLE_ID or the +PERF_SAMPLE_IDENTIFIER header. The PERF_SAMPLE_IDENTIFIER header is +at a fixed offset from the event header, which allows reliable +parsing of the header. Relying on ID may be ambigious. +IDENTIFIER is only supported by newer Linux kernels. + +Perf record specific events: + +In addition to the kernel generated event types perf record adds its +own event types (in addition it also synthesizes some kernel events, +for example MMAP events) + + PERF_RECORD_USER_TYPE_START = 64, + PERF_RECORD_HEADER_ATTR = 64, + +struct attr_event { + struct perf_event_header header; + struct perf_event_attr attr; + uint64_t id[]; +}; + + PERF_RECORD_HEADER_EVENT_TYPE = 65, /* depreceated */ + +#define MAX_EVENT_NAME 64 + +struct perf_trace_event_type { + uint64_t event_id; + char name[MAX_EVENT_NAME]; +}; + +struct event_type_event { + struct perf_event_header header; + struct perf_trace_event_type event_type; +}; + + + PERF_RECORD_HEADER_TRACING_DATA = 66, + +Describe me + +struct tracing_data_event { + struct perf_event_header header; + uint32_t size; +}; + + PERF_RECORD_HEADER_BUILD_ID = 67, + +Define a ELF build ID for a referenced executable. + + struct build_id_event; /* See above */ + + PERF_RECORD_FINISHED_ROUND = 68, + +No event reordering over this header. No payload. + + PERF_RECORD_ID_INDEX = 69, + +Map event ids to CPUs and TIDs. + +struct id_index_entry { + uint64_t id; + uint64_t idx; + uint64_t cpu; + uint64_t tid; +}; + +struct id_index_event { + struct perf_event_header header; + uint64_t nr; + struct id_index_entry entries[nr]; +}; + + PERF_RECORD_AUXTRACE_INFO = 70, + +Auxtrace type specific information. Describe me + +struct auxtrace_info_event { + struct perf_event_header header; + uint32_t type; + uint32_t reserved__; /* For alignment */ + uint64_t priv[]; +}; + + PERF_RECORD_AUXTRACE = 71, + +Defines auxtrace data. Followed by the actual data. The contents of +the auxtrace data is dependent on the event and the CPU. For example +for Intel Processor Trace it contains Processor Trace data generated +by the CPU. + +struct auxtrace_event { + struct perf_event_header header; + uint64_t size; + uint64_t offset; + uint64_t reference; + uint32_t idx; + uint32_t tid; + uint32_t cpu; + uint32_t reserved__; /* For alignment */ +}; + +struct aux_event { + struct perf_event_header header; + uint64_t aux_offset; + uint64_t aux_size; + uint64_t flags; +}; + + PERF_RECORD_AUXTRACE_ERROR = 72, + +Describes an error in hardware tracing + +enum auxtrace_error_type { + PERF_AUXTRACE_ERROR_ITRACE = 1, + PERF_AUXTRACE_ERROR_MAX +}; + +#define MAX_AUXTRACE_ERROR_MSG 64 + +struct auxtrace_error_event { + struct perf_event_header header; + uint32_t type; + uint32_t code; + uint32_t cpu; + uint32_t pid; + uint32_t tid; + uint32_t reserved__; /* For alignment */ + uint64_t ip; + char msg[MAX_AUXTRACE_ERROR_MSG]; +}; + +Event types + +Define the event attributes with their IDs. + +An array bound by the perf_file_section size. + + struct { + struct perf_event_attr attr; /* Size defined by header.attr_size */ + struct perf_file_section ids; + } + +ids points to a array of uint64_t defining the ids for event attr attr. + +References: + +include/uapi/linux/perf_event.h + +This is the canonical description of the kernel generated perf_events +and the perf_event_attrs. + +perf_events manpage + +A manpage describing perf_event and perf_event_attr is here: +http://web.eece.maine.edu/~vweaver/projects/perf_events/programming.html +This tends to be slightly behind the kernel include, but has better +descriptions. An (typically older) version of the man page may be +included with the standard Linux man pages, available with "man +perf_events" + +pmu-tools + +https://github.com/andikleen/pmu-tools/tree/master/parser + +A definition of the perf.data format in python "construct" format is available +in pmu-tools parser. This allows to read perf.data from python and dump it. + +quipper + +The quipper C++ parser is available at +https://chromium.googlesource.com/chromiumos/platform/chromiumos-wide-profiling/ +Unfortunately this parser tends to be many versions behind and may not be able +to parse data files generated by recent perf.
Signature · 1 line
2.7.4
Arnaldo Carvalho de Melo
maintainerPATCH 6/18 perf build: Add libbabeltrace to build-test
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
'make build-test' doesn't test LIBBABELTRACE=1. It misses a building failure caused by commit 41840d211c51 ("perf config: Move config declarations from util/cache.h to util/config.h"), breaks bisect.
Add LIBBABELTRACE=1 to build-test.
--- tools/perf/tests/make | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/tests/make +2 -0
@@ -81,6 +81,7 @@ make_no_libbionic := NO_LIBBIONIC=1 make_no_auxtrace := NO_AUXTRACE=1 make_no_libbpf := NO_LIBBPF=1 make_no_libcrypto := NO_LIBCRYPTO=1 +make_with_babeltrace:= LIBBABELTRACE=1 make_tags := tags make_cscope := cscope make_help := help
@@ -136,6 +137,7 @@ run += make_no_libaudit run += make_no_libbionic run += make_no_auxtrace run += make_no_libbpf +run += make_with_babeltrace run += make_help run += make_doc run += make_perf_o
Signature · 1 line
2.7.4
Arnaldo Carvalho de Melo
maintainerPATCH 7/18 perf data convert: Include config.h header
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Otherwise some compiler might scream:
$ make LIBBABELTRACE_DIR=/opt/libbabeltrace/ LIBBABELTRACE=1
BUILD: Doing 'make -j4' parallel build
CC util/data-convert-bt.o
util/data-convert-bt.c: In function ‘convert__config’:
util/data-convert-bt.c:1299:19: error: implicit declaration of function ‘perf_config_u64’ [-Werror=implicit-function-declaration]
c->queue_size = perf_config_u64(var, value);
...--- tools/perf/util/data-convert-bt.c | 1 + 1 file changed, 1 insertion(+)
tools/perf/util/data-convert-bt.c +1 -0
@@ -26,6 +26,7 @@#include "evlist.h" #include "evsel.h" #include "machine.h" +#include "config.h" #define pr_N (n, fmt, ...) \ eprintf(n, debug_data_convert, fmt, ##__VA_ARGS__)
Signature · 1 line
2.7.4
Arnaldo Carvalho de Melo
maintainerPATCH 8/18 perf record: Move mmap setup block to separate function
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
Following commits introduce multiple evlists to record. This patch extracts perf_evlist__mmap_ex() processing to a new function, creates record__mmap() and record__mmap_evlist() to wrap perf_evlist__mmap_ex() and its error processing. They will be improvemented to create mmap for all evlists.
--- tools/perf/builtin-record.c | 56 +++++++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 20 deletions(-)
tools/perf/builtin-record.c +36 -20
@@ -342,6 +342,40 @@ int auxtrace_record__snapshot_start(struct auxtrace_record *itr __maybe_unused)#endif +static int record__mmap_evlist (struct record *rec, +struct perf_evlist *evlist) +{ +struct record_opts *opts = &rec->opts; +char msg[512 ]; + +if (perf_evlist__mmap_ex (evlist, opts->mmap_pages, false, + opts->auxtrace_mmap_pages, + opts->auxtrace_snapshot_mode) <0 ) { +if (errno ==EPERM ) { +pr_err ("Permission error mapping pages.\n" +"Consider increasing " +"/proc/sys/kernel/perf_event_mlock_kb,\n" +"or try again with a smaller value of -m/--mmap_pages.\n" +"(current value: %u,%u)\n" , + opts->mmap_pages, opts->auxtrace_mmap_pages); +return -errno; + }else { +pr_err ("failed to mmap with %d (%s)\n" , errno, +strerror_r (errno, msg,sizeof (msg))); +if (errno) +return -errno; +else +return -EINVAL ; + } + } +return 0 ; +} + +static int record__mmap (struct record *rec) +{ +return record__mmap_evlist (rec, rec->evlist); +} +static int record__open (struct record *rec) {char msg[512 ];
@@ -378,27 +412,9 @@ try_again: goto out; } -if (perf_evlist__mmap_ex (evlist, opts->mmap_pages, false, - opts->auxtrace_mmap_pages, - opts->auxtrace_snapshot_mode) <0 ) { -if (errno ==EPERM ) { -pr_err ("Permission error mapping pages.\n" -"Consider increasing " -"/proc/sys/kernel/perf_event_mlock_kb,\n" -"or try again with a smaller value of -m/--mmap_pages.\n" -"(current value: %u,%u)\n" , - opts->mmap_pages, opts->auxtrace_mmap_pages); - rc = -errno; - }else { -pr_err ("failed to mmap with %d (%s)\n" , errno, -strerror_r (errno, msg,sizeof (msg))); -if (errno) - rc = -errno; -else - rc = -EINVAL ; - } + rc =record__mmap (rec); +if (rc) goto out; - } session->evlist = evlist;perf_session__set_id_hdr_size (session);
Signature · 1 line
2.7.4
Arnaldo Carvalho de Melo
maintainerPATCH 9/18 perf record: Prepare reading from multiple evlists in record__mmap_read_all()
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
Following commits introduce new evlists to record. This patch adjusts record__mmap_read_all() and record__mmap_read(): converting original record__mmap_read_all() to record__mmap_read_evlist(), read from one evlist; makes record__mmap_read() reading from specific evlist. record__mmap_read_all() will be improved to read from multiple evlists.
--- tools/perf/builtin-record.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-)
tools/perf/builtin-record.c +24 -10
@@ -132,9 +132,9 @@ rb_find_range(struct perf_evlist *evlist,return backward_rb_find_range (data, mask, head, start, end); } -static int record__mmap_read (struct record *rec,int idx) +static int record__mmap_read (struct record *rec,struct perf_evlist *evlist,int idx) { -struct perf_mmap *md = &rec->evlist->mmap[idx]; +struct perf_mmap *md = &evlist->mmap[idx];u64 head =perf_mmap__read_head (md);u64 old = md->prev;u64 end = head, start = old;
@@ -143,7 +143,7 @@ static int record__mmap_read(struct record *rec, int idx)void *buf;int rc =0 ; -if (rb_find_range (rec->evlist, data, md->mask, head, +if (rb_find_range (evlist, data, md->mask, head, old, &start, &end))return -1 ;
@@ -157,7 +157,7 @@ static int record__mmap_read(struct record *rec, int idx)WARN_ONCE (1 ,"failed to keep up with mmap data. (warn only once)\n" ); md->prev = head; -perf_evlist__mmap_consume (rec->evlist, idx); +perf_evlist__mmap_consume (evlist, idx);return 0 ; }
@@ -182,7 +182,7 @@ static int record__mmap_read(struct record *rec, int idx) } md->prev = head; -perf_evlist__mmap_consume (rec->evlist, idx); +perf_evlist__mmap_consume (evlist, idx); out:return rc; }
@@ -498,17 +498,20 @@ static struct perf_event_header finished_round_event = { .type = PERF_RECORD_FINISHED_ROUND, }; -static int record__mmap_read_all (struct record *rec) +static int record__mmap_read_evlist (struct record *rec,struct perf_evlist *evlist) {u64 bytes_written = rec->bytes_written;int i;int rc =0 ; -for (i =0 ; i < rec->evlist->nr_mmaps; i++) { -struct auxtrace_mmap *mm = &rec->evlist->mmap[i].auxtrace_mmap; +if (!evlist) +return 0 ; + +for (i =0 ; i < evlist->nr_mmaps; i++) { +struct auxtrace_mmap *mm = &evlist->mmap[i].auxtrace_mmap; -if (rec->evlist->mmap[i].base) { -if (record__mmap_read (rec, i) !=0 ) { +if (evlist->mmap[i].base) { +if (record__mmap_read (rec, evlist, i) !=0 ) { rc =-1 ; goto out; }
@@ -532,6 +535,17 @@ out:return rc; } +static int record__mmap_read_all (struct record *rec) +{ +int err; + + err =record__mmap_read_evlist (rec, rec->evlist); +if (err) +return err; + +return err; +} +static void record__init_features (struct record *rec) {struct perf_session *session = rec->session;
Signature · 1 line
2.7.4
Arnaldo Carvalho de Melo
maintainerPATCH 10/18 perf record: Prepare picking perf_event_mmap_page from multiple evlists
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
Following commits introduce new evlists to record. This patch adjusts record__pick_pc() and introduces perf_evlist__pick_pc() to read control page from one specific evlist. record__pick_pc() will be improved to search control page from multiple evlists.
--- tools/perf/builtin-record.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
tools/perf/builtin-record.c +13 -2
@@ -686,10 +686,21 @@ perf_event__synth_time_conv(const struct perf_event_mmap_page *pc __maybe_unusedreturn 0 ; } +static const struct perf_event_mmap_page * +perf_evlist__pick_pc (struct perf_evlist *evlist) +{ +if (evlist && evlist->mmap && evlist->mmap[0 ].base) +return evlist->mmap[0 ].base; +return NULL ; +} +static const struct perf_event_mmap_page *record__pick_pc (struct record *rec) { -if (rec->evlist && rec->evlist->mmap && rec->evlist->mmap[0 ].base) -return rec->evlist->mmap[0 ].base; +const struct perf_event_mmap_page *pc; + + pc =perf_evlist__pick_pc (rec->evlist); +if (pc) +return pc;return NULL ; }
Signature · 1 line
2.7.4
Arnaldo Carvalho de Melo
maintainerPATCH 11/18 perf symbols: Use proper dso name for is_regular_file
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Marc reported use of uninitialized memory:
Quoted 38 lines
In commit "
403567217d3fperf symbols: Do not read symbols/data from device files" a check to uninitialzied memory was added. This leads to the following valgrind output:==24515== Syscall param
stat(file_name)points to uninitialised byte(s)==24515== at 0x75B26D5: _xstat (in /lib/x86_64-linux-gnu/libc-2.22.so) ==24515== by 0x4E548D: stat (stat.h:454) ==24515== by 0x4E548D: is_regular_file (util.c:687) ==24515== by 0x4A5BEE: dso__load (symbol.c:1435) ==24515== by 0x4BB1AE: map__load (map.c:289) ==24515== by 0x4BB1AE: map__find_symbol (map.c:333) ==24515== by 0x4835B3: thread__find_addr_location (event.c:1300) ==24515== by 0x4B5342: add_callchain_ip (machine.c:1652) ==24515== by 0x4B5342: thread__resolve_callchain_sample (machine.c:1906) ==24515== by 0x4B9E7D: thread__resolve_callchain (machine.c:1958) ==24515== by 0x441B3E: process_event (builtin-script.c:795) ==24515== by 0x441B3E: process_sample_event (builtin-script.c:920) ==24515== by 0x4BEE29: perf_evlist__deliver_sample (session.c:1192) ==24515== by 0x4BEE29: machines__deliver_event (session.c:1229) ==24515== by 0x4BF770: perf_session__deliver_event (session.c:1286) ==24515== by 0x4BF770: ordered_events__deliver_event (session.c:114) ==24515== by 0x4C1D17: __ordered_events__flush (ordered-events.c:207) ==24515== by 0x4C1D17: ordered_events__flush.part.3 (ordered-events.c:274) ==24515== by 0x4BF44C: perf_session__process_user_event (session.c:1325) ==24515== by 0x4BF44C: perf_session__process_event (session.c:1451) ==24515== Address 0x807c6a0 is 0 bytes inside a block of size 4,096 alloc'd ==24515== at 0x4C29C0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==24515== by 0x4A5BCB: dso__load (symbol.c:1421) ==24515== by 0x4BB1AE: map__load (map.c:289) ==24515== by 0x4BB1AE: map__find_symbol (map.c:333) ==24515== by 0x4835B3: thread__find_addr_location (event.c:1300) ==24515== by 0x4B5342: add_callchain_ip (machine.c:1652) ==24515== by 0x4B5342: thread__resolve_callchain_sample (machine.c:1906) ==24515== by 0x4B9E7D: thread__resolve_callchain (machine.c:1958) ==24515== by 0x441B3E: process_event (builtin-script.c:795) ==24515== by 0x441B3E: process_sample_event (builtin-script.c:920) ==24515== by 0x4BEE29: perf_evlist__deliver_sample (session.c:1192) ==24515== by 0x4BEE29: machines__deliver_event (session.c:1229)
Quoted 8 lines
==24515== by 0x4BF770: perf_session__deliver_event (session.c:1286) ==24515== by 0x4BF770: ordered_events__deliver_event (session.c:114) ==24515== by 0x4C1D17: __ordered_events__flush (ordered-events.c:207) ==24515== by 0x4C1D17: ordered_events__flush.part.3 (ordered-events.c:274) ==24515== by 0x4BF44C: perf_session__process_user_event (session.c:1325) ==24515== by 0x4BF44C: perf_session__process_event (session.c:1451) ==24515== by 0x4C0EAC: __perf_session__process_events (session.c:1804) ==24515== by 0x4C0EAC: perf_session__process_events (session.c:1858)
The reason was a typo that passed global 'name' variable as the is_regular_file argument instead dso->long_name.
--- tools/perf/util/symbol.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/symbol.c +1 -1
@@ -1430,7 +1430,7 @@ int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter)* Read the build id if possible. This is required for * DSO_BINARY_TYPE__BUILDID_DEBUGINFO to work */ -if (is_regular_file (name) && +if (is_regular_file (dso->long_name) &&filename__read_build_id (dso->long_name, build_id,BUILD_ID_SIZE ) >0 )dso__set_build_id (dso, build_id);
Signature · 1 line
2.7.4
Arnaldo Carvalho de Melo
maintainerPATCH 12/18 perf data ctf: Add value_set_string() helper
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
There are many value_set_##x helper for integer, but only for integer. This patch adds value_set_string() helper to help following commits create string fields.
--- tools/perf/util/data-convert-bt.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+)
tools/perf/util/data-convert-bt.c +30 -0
@@ -141,6 +141,36 @@ FUNC_VALUE_SET(s64)FUNC_VALUE_SET (u64)__FUNC_VALUE_SET (u64_hex, u64) +static int string_set_value (struct bt_ctf_field *field,const char *string); +static __maybe_unused int +value_set_string(struct ctf_writer *cw, struct bt_ctf_event *event, + const char *name, const char *string) +{ +struct bt_ctf_field_type *type = cw->data.string; +struct bt_ctf_field *field; +int ret =0 ; + + field =bt_ctf_field_create (type); +if (!field) { +pr_err ("failed to create a field %s\n" , name); +return -1 ; + } + + ret =string_set_value (field, string); +if (ret) { +pr_err ("failed to set value %s\n" , name); + goto err_put_field; + } + + ret =bt_ctf_event_set_payload (event, name, field); +if (ret) +pr_err ("failed to set payload %s\n" , name); + +err_put_field: +bt_ctf_field_put (field); +return ret; +} +static struct bt_ctf_field_type *get_tracepoint_field_type (struct ctf_writer *cw,struct format_field *field) {
Signature · 1 line
2.7.4
Arnaldo Carvalho de Melo
maintainerPATCH 13/18 perf data ctf: Pass convert options through opts structure
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
Following commits will add new option to 'perf data convert'. All options should be grouped into a structure and passed to low level converter (currently there's only one converter).
Introduce data-convert.h and define 'struct perf_data_convert_opts' in it. Pass 'force' through opts.
--- tools/perf/builtin-data.c | 9 ++++++--- tools/perf/util/data-convert-bt.c | 5 +++-- tools/perf/util/data-convert-bt.h | 4 +++- tools/perf/util/data-convert.h | 8 ++++++++ 4 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 tools/perf/util/data-convert.h
tools/perf/builtin-data.c +6 -3
@@ -3,6 +3,7 @@#include "perf.h" #include "debug.h" #include <subcmd/parse-options.h> +#include "data-convert.h" #include "data-convert-bt.h" typedef int (*data_cmd_fn_t )(int argc,const char **argv,const char *prefix);
@@ -53,14 +54,16 @@ static int cmd_data_convert(int argc, const char **argv, const char *prefix __maybe_unused) {const char *to_ctf =NULL ; -bool force = false; +struct perf_data_convert_opts opts = { + .force = false, + };const struct option options[] = {OPT_INCR ('v' ,"verbose" , &verbose,"be more verbose" ),OPT_STRING ('i' ,"input" , &input_name,"file" ,"input file name" ), #ifdef HAVE_LIBBABELTRACE_SUPPORTOPT_STRING (0 ,"to-ctf" , &to_ctf,NULL ,"Convert to CTF format" ), #endif -OPT_BOOLEAN ('f' ,"force" , &force,"don't complain, do it" ), +OPT_BOOLEAN ('f' ,"force" , &opts.force,"don't complain, do it" ),OPT_END () };
@@ -78,7 +81,7 @@ static int cmd_data_convert(int argc, const char **argv,if (to_ctf) {#ifdef HAVE_LIBBABELTRACE_SUPPORT -return bt_convert__perf2ctf (input_name, to_ctf, force); +return bt_convert__perf2ctf (input_name, to_ctf, &opts);#else pr_err ("The libbabeltrace support is not compiled in.\n" );return -1 ;
tools/perf/util/data-convert-bt.c +3 -2
@@ -1304,13 +1304,14 @@ static int convert__config(const char *var, const char *value, void *cb)return 0 ; } -int bt_convert__perf2ctf (const char *input,const char *path,bool force) +int bt_convert__perf2ctf (const char *input,const char *path, +struct perf_data_convert_opts *opts) {struct perf_session *session;struct perf_data_file file = { .path = input, .mode =PERF_DATA_MODE_READ , - .force = force, + .force = opts->force, };struct convert c = { .tool = {
tools/perf/util/data-convert-bt.h +3 -1
@@ -1,8 +1,10 @@#ifndef __DATA_CONVERT_BT_H#define __DATA_CONVERT_BT_H +#include "data-convert.h" #ifdef HAVE_LIBBABELTRACE_SUPPORT -int bt_convert__perf2ctf (const char *input_name,const char *to_ctf,bool force); +int bt_convert__perf2ctf (const char *input_name,const char *to_ctf, +struct perf_data_convert_opts *opts);#endif /* HAVE_LIBBABELTRACE_SUPPORT */ #endif /* __DATA_CONVERT_BT_H */
tools/perf/util/data-convert.h new file +8 -0
@@ -0,0 +1,8 @@ +#ifndef __DATA_CONVERT_H +#define __DATA_CONVERT_H + +struct perf_data_convert_opts { +bool force; +}; + +#endif /* __DATA_CONVERT_H */
Signature · 1 line
2.7.4
Arnaldo Carvalho de Melo
maintainerPATCH 14/18 perf data ctf: Add 'all' option
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
If 'all' option is selected, 'perf data convert' should convert not only samples, but non-sample events such as comm and fork. Add this option in perf_data_convert_opts. Following commits will add cmdline option to select it.
--- tools/perf/builtin-data.c | 1 + tools/perf/util/data-convert.h | 1 + 2 files changed, 2 insertions(+)
tools/perf/builtin-data.c +1 -0
@@ -56,6 +56,7 @@ static int cmd_data_convert(int argc, const char **argv,const char *to_ctf =NULL ;struct perf_data_convert_opts opts = { .force = false, + .all = false, };const struct option options[] = {OPT_INCR ('v' ,"verbose" , &verbose,"be more verbose" ),
tools/perf/util/data-convert.h +1 -0
@@ -3,6 +3,7 @@struct perf_data_convert_opts {bool force; +bool all; };#endif /* __DATA_CONVERT_H */
Signature · 1 line
2.7.4
Arnaldo Carvalho de Melo
maintainerPATCH 15/18 perf data ctf: Prepare collect non-sample events
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
Following commits are going to allow 'perf data convert' to collect not only samples, but also non-sample events like comm and fork. In this patch we count non-sample events using c.non_sample_count, and prepare to print number of both type of events like:
# ~/perf data convert --all --to-ctf ./out.ctf
[ perf data convert: Converted 'perf.data' into CTF data './out.ctf' ] [ perf data convert: Converted and wrote 0.846 MB (6508 samples, 686 non-samples) ]
--- tools/perf/util/data-convert-bt.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
tools/perf/util/data-convert-bt.c +7 -1
@@ -77,6 +77,7 @@ struct convert {u64 events_size;u64 events_count; +u64 non_sample_count;/* Ordered events configured queue size. */ u64 queue_size;
@@ -1369,10 +1370,15 @@ int bt_convert__perf2ctf(const char *input, const char *path, file.path, path);fprintf (stderr, -"[ perf data convert: Converted and wrote %.3f MB (%" PRIu64" samples) ]\n" , +"[ perf data convert: Converted and wrote %.3f MB (%" PRIu64" samples" , (double ) c.events_size /1024.0 /1024.0 , c.events_count); +if (!c.non_sample_count) +fprintf (stderr,") ]\n" ); +else +fprintf (stderr,", %" PRIu64" non-samples) ]\n" , c.non_sample_count); +cleanup_events (session);perf_session__delete (session);ctf_writer__cleanup (cw);
Signature · 1 line
2.7.4
Arnaldo Carvalho de Melo
maintainerPATCH 16/18 perf data ctf: Generate comm event to CTF output
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
If 'all' is selected, convert comm event to output CTF stream.
setup_non_sample_events() is called if non_sample is selected. It creates a comm_class for comm event.
Use macros to generate and process_comm_event and add_comm_event. These macros can be reused for other non-sample events.
--- tools/perf/util/data-convert-bt.c | 110 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+)
tools/perf/util/data-convert-bt.c +110 -0
@@ -69,6 +69,7 @@ struct ctf_writer { };struct bt_ctf_field_type *array[6 ]; } data; +struct bt_ctf_event_class *comm_class; };struct convert {
@@ -763,6 +764,57 @@ static int process_sample_event(struct perf_tool *tool,return cs ?0 :-1 ; } +#define __NON_SAMPLE_SET_FIELD (_name, _type, _field) \ +do { \ + ret = value_set_##_type(cw, event, #_field, _event->_name._field);\ + if (ret) \ + return -1; \ +} while(0) + +#define __FUNC_PROCESS_NON_SAMPLE (_name, body) \ +static int process_##_name##_event(struct perf_tool *tool, \ + union perf_event *_event, \ + struct perf_sample *sample, \ + struct machine *machine) \ +{ \ + struct convert *c = container_of(tool, struct convert, tool);\ + struct ctf_writer *cw = &c->writer; \ + struct bt_ctf_event_class *event_class = cw->_name##_class;\ + struct bt_ctf_event *event; \ + struct ctf_stream *cs; \ + int ret; \ + \ + c->non_sample_count++; \ + c->events_size += _event->header.size; \ + event = bt_ctf_event_create(event_class); \ + if (!event) { \ + pr_err("Failed to create an CTF event\n"); \ + return -1; \ + } \ + \ + bt_ctf_clock_set_time(cw->clock, sample->time); \ + body \ + cs = ctf_stream(cw, 0); \ + if (cs) { \ + if (is_flush_needed(cs)) \ + ctf_stream__flush(cs); \ + \ + cs->count++; \ + bt_ctf_stream_append_event(cs->stream, event); \ + } \ + bt_ctf_event_put(event); \ + \ + return perf_event__process_##_name(tool, _event, sample, machine);\ +} + +__FUNC_PROCESS_NON_SAMPLE (comm, + __NON_SAMPLE_SET_FIELD(comm, u32, pid); +__NON_SAMPLE_SET_FIELD (comm, u32, tid); +__NON_SAMPLE_SET_FIELD (comm, string, comm); +) +#undef __NON_SAMPLE_SET_FIELD +#undef __FUNC_PROCESS_NON_SAMPLE +/* If dup < 0, add a prefix. Else, add _dupl_X suffix. */ static char *change_name (char *name,char *orig_name,int dup) {
@@ -1037,6 +1089,58 @@ static int setup_events(struct ctf_writer *cw, struct perf_session *session)return 0 ; } +#define __NON_SAMPLE_ADD_FIELD (t, n) \ + do { \ + pr2(" field '%s'\n", #n); \ + if (bt_ctf_event_class_add_field(event_class, cw->data.t, #n)) {\ + pr_err("Failed to add field '%s';\n", #n);\ + return -1; \ + } \ + } while(0) + +#define __FUNC_ADD_NON_SAMPLE_EVENT_CLASS (_name, body) \ +static int add_##_name##_event(struct ctf_writer *cw) \ +{ \ + struct bt_ctf_event_class *event_class; \ + int ret; \ + \ + pr("Adding "#_name" event\n"); \ + event_class = bt_ctf_event_class_create("perf_" #_name);\ + if (!event_class) \ + return -1; \ + body \ + \ + ret = bt_ctf_stream_class_add_event_class(cw->stream_class, event_class);\ + if (ret) { \ + pr("Failed to add event class '"#_name"' into stream.\n");\ + return ret; \ + } \ + \ + cw->_name##_class = event_class; \ + bt_ctf_event_class_put(event_class); \ + return 0; \ +} + +__FUNC_ADD_NON_SAMPLE_EVENT_CLASS (comm, + __NON_SAMPLE_ADD_FIELD(u32, pid); +__NON_SAMPLE_ADD_FIELD (u32, tid); +__NON_SAMPLE_ADD_FIELD (string, comm); +) + +#undef __NON_SAMPLE_ADD_FIELD +#undef __FUNC_ADD_NON_SAMPLE_EVENT_CLASS + +static int setup_non_sample_events (struct ctf_writer *cw, +struct perf_session *session__maybe_unused ) +{ +int ret; + + ret =add_comm_event (cw); +if (ret) +return ret; +return 0 ; +} +static void cleanup_events (struct perf_session *session) {struct perf_evlist *evlist = session->evlist;
@@ -1332,6 +1436,9 @@ int bt_convert__perf2ctf(const char *input, const char *path,struct ctf_writer *cw = &c.writer;int err =-1 ; +if (opts->all) + c.tool.comm = process_comm_event; +perf_config (convert__config, &c);/* CTF writer */
@@ -1356,6 +1463,9 @@ int bt_convert__perf2ctf(const char *input, const char *path,if (setup_events (cw, session)) goto free_session; +if (opts->all &&setup_non_sample_events (cw, session)) + goto free_session; +if (setup_streams (cw, session)) goto free_session;
Signature · 1 line
2.7.4
Arnaldo Carvalho de Melo
maintainerPATCH 17/18 perf data ctf: Add '--all' option for 'perf data convert'
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
After this patch, 'perf data convert' convert comm events to output CTF stream.
Result:
# perf record -a sleep 1 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.378 MB perf.data (73 samples) ]
# perf data convert --to-ctf ./out.ctf [ perf data convert: Converted 'perf.data' into CTF data './out.ctf' ] [ perf data convert: Converted and wrote 0.003 MB (73 samples) ]
# babeltrace --clock-seconds ./out.ctf/
[10627.402515791] (+?.?????????) cycles:ppp: { cpu_id = 0 }, { perf_ip = 0xFFFFFFFF81065AF4, perf_tid = 0, perf_pid = 0, perf_period = 1 }
[10627.402518972] (+0.000003181) cycles:ppp: { cpu_id = 0 }, { perf_ip = 0xFFFFFFFF81065AF4, perf_tid = 0, perf_pid = 0, perf_period = 1 }
... // only sample event is converted# perf data convert --all --to-ctf ./out.ctf [ perf data convert: Converted 'perf.data' into CTF data './out.ctf' ] [ perf data convert: Converted and wrote 0.023 MB (73 samples, 384 non-samples) ]
# babeltrace --clock-seconds ./out.ctf/
[ 0.000000000] (+?.?????????) perf_comm: { cpu_id = 0 }, { pid = 1, tid = 1, comm = "init" }
[ 0.000000000] (+0.000000000) perf_comm: { cpu_id = 0 }, { pid = 2, tid = 2, comm = "kthreadd" }
[ 0.000000000] (+0.000000000) perf_comm: { cpu_id = 0 }, { pid = 3, tid = 3, comm = "ksoftirqd/0" }
... // comm events are converted
[10627.402515791] (+10627.402515791) cycles:ppp: { cpu_id = 0 }, { perf_ip = 0xFFFFFFFF81065AF4, perf_tid = 0, perf_pid = 0, perf_period = 1 }
[10627.402518972] (+0.000003181) cycles:ppp: { cpu_id = 0 }, { perf_ip = 0xFFFFFFFF81065AF4, perf_tid = 0, perf_pid = 0, perf_period = 1 }
... // samples are also converted--- tools/perf/Documentation/perf-data.txt | 4 ++++ tools/perf/builtin-data.c | 1 + 2 files changed, 5 insertions(+)
tools/perf/Documentation/perf-data.txt +4 -0
@@ -34,6 +34,10 @@ OPTIONS for 'convert' --verbose:: Be more verbose (show counter open errors, etc). +--all:: + Convert all events, including non-sample events (comm, fork, ...), to output. + Default is off, only convert samples. + SEE ALSO -------- linkperf:perf[1]
tools/perf/builtin-data.c +1 -0
@@ -65,6 +65,7 @@ static int cmd_data_convert(int argc, const char **argv,OPT_STRING (0 ,"to-ctf" , &to_ctf,NULL ,"Convert to CTF format" ), #endifOPT_BOOLEAN ('f' ,"force" , &opts.force,"don't complain, do it" ), +OPT_BOOLEAN (0 ,"all" , &opts.all,"Convert all events" ),OPT_END () };
Signature · 1 line
2.7.4
Arnaldo Carvalho de Melo
maintainerPATCH 18/18 perf data ctf: Generate fork and exit events to CTF output
In reply to Arnaldo Carvalho de MeloFrom: Wang Nan <[email protected]>
If 'all' is selected, convert fork and exit events to output CTF stream.
--- tools/perf/util/data-convert-bt.c | 44 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-)
tools/perf/util/data-convert-bt.c +43 -1
@@ -70,6 +70,8 @@ struct ctf_writer {struct bt_ctf_field_type *array[6 ]; } data;struct bt_ctf_event_class *comm_class; +struct bt_ctf_event_class *exit_class; +struct bt_ctf_event_class *fork_class; };struct convert {
@@ -812,6 +814,21 @@ __FUNC_PROCESS_NON_SAMPLE(comm,__NON_SAMPLE_SET_FIELD (comm, u32, tid);__NON_SAMPLE_SET_FIELD (comm, string, comm); ) +__FUNC_PROCESS_NON_SAMPLE (fork, + __NON_SAMPLE_SET_FIELD(fork, u32, pid); +__NON_SAMPLE_SET_FIELD (fork, u32, ppid); +__NON_SAMPLE_SET_FIELD (fork, u32, tid); +__NON_SAMPLE_SET_FIELD (fork, u32, ptid); +__NON_SAMPLE_SET_FIELD (fork, u64, time); +) + +__FUNC_PROCESS_NON_SAMPLE (exit, + __NON_SAMPLE_SET_FIELD(fork, u32, pid); +__NON_SAMPLE_SET_FIELD (fork, u32, ppid); +__NON_SAMPLE_SET_FIELD (fork, u32, tid); +__NON_SAMPLE_SET_FIELD (fork, u32, ptid); +__NON_SAMPLE_SET_FIELD (fork, u64, time); +)#undef __NON_SAMPLE_SET_FIELD#undef __FUNC_PROCESS_NON_SAMPLE
@@ -1127,6 +1144,22 @@ __FUNC_ADD_NON_SAMPLE_EVENT_CLASS(comm,__NON_SAMPLE_ADD_FIELD (string, comm); ) +__FUNC_ADD_NON_SAMPLE_EVENT_CLASS (fork, + __NON_SAMPLE_ADD_FIELD(u32, pid); +__NON_SAMPLE_ADD_FIELD (u32, ppid); +__NON_SAMPLE_ADD_FIELD (u32, tid); +__NON_SAMPLE_ADD_FIELD (u32, ptid); +__NON_SAMPLE_ADD_FIELD (u64, time); +) + +__FUNC_ADD_NON_SAMPLE_EVENT_CLASS (exit, + __NON_SAMPLE_ADD_FIELD(u32, pid); +__NON_SAMPLE_ADD_FIELD (u32, ppid); +__NON_SAMPLE_ADD_FIELD (u32, tid); +__NON_SAMPLE_ADD_FIELD (u32, ptid); +__NON_SAMPLE_ADD_FIELD (u64, time); +) +#undef __NON_SAMPLE_ADD_FIELD#undef __FUNC_ADD_NON_SAMPLE_EVENT_CLASS
@@ -1138,6 +1171,12 @@ static int setup_non_sample_events(struct ctf_writer *cw, ret =add_comm_event (cw);if (ret)return ret; + ret =add_exit_event (cw); +if (ret) +return ret; + ret =add_fork_event (cw); +if (ret) +return ret;return 0 ; }
@@ -1436,8 +1475,11 @@ int bt_convert__perf2ctf(const char *input, const char *path,struct ctf_writer *cw = &c.writer;int err =-1 ; -if (opts->all) +if (opts->all) { c.tool.comm = process_comm_event; + c.tool.exit = process_exit_event; + c.tool.fork = process_fork_event; + }perf_config (convert__config, &c);
Signature · 1 line
2.7.4
Quoted 47 lines · Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit
d4cf1949f9689314aef962eea95df84a8288d097:perf/x86/intel: Add {rd,wr}lbr_{to,from} wrappers (2016-06-27 11:34:21 +0200)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.gittags/perf-core-for-mingo-20160627for you to fetch changes up to
6d9c675078e697309c1c06a1051f01de8151c476:perf data ctf: Generate fork and exit events to CTF output (2016-06-27 15:50:23 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:New features:
- Generate comm, fork and exit events when converting perf.data files to CTF (Wang Nan)
Documentation:
- Document perf.data on disk format (Andi Kleen)
Infrastructure:
- Add libbabeltrace to build-test (Wang Nan)
- 'perf record' prep work to support multiple evlists (Wang Nan)
- Remove unused
hist_entry__annotatefunction (Ravi Bangoria)- Add more toolchain triplets (Ravi Bangoria)
- Update message for slang devel packages on Ubuntu (Neeraj Badlani)
- Generalize handling of 'ret' instructions in the annotate TUI (Naveen N. Rao)
- Use proper dso name for
is_regular_file, fixing device file handling (Jiri Olsa)Build Fixes:
Quoted 7 lines
- Add missing
config.hinclude, fixing the build with libabeltrace (Jiri Olsa)Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Andi Kleen (1):
perf tools: Add documentation for perf.data on disk format
The doc build fails with:
asciidoc: FAILED: manpage document title is mandatory Makefile:276: recipe for target 'perf-file-format.xml' failed make[2]: *** [perf-file-format.xml] Error 1 make[2]: *** Waiting for unfinished jobs....
Thanks,
Ingo
On Tue, Jun 28, 2016 at 09:02:57AM +0200, Ingo Molnar wrote:
SNIP
Quoted 8 lines
Quoted 7 lines
- Add missing
config.hinclude, fixing the build with libabeltrace (Jiri Olsa)Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Andi Kleen (1):
perf tools: Add documentation for perf.data on disk format
Quoted 7 lines
The doc build fails with:
asciidoc: FAILED: manpage document title is mandatory Makefile:276: recipe for target 'perf-file-format.xml' failed make[2]: *** [perf-file-format.xml] Error 1 make[2]: *** Waiting for unfinished jobs....
hum, my asciidoc does not complain
jirka
Arnaldo Carvalho de Melo
maintainerEm Tue, Jun 28, 2016 at 09:02:57AM +0200, Ingo Molnar escreveu:
Quoted 58 lines · Arnaldo Carvalho de Melo
Quoted 48 lines
Hi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit
d4cf1949f9689314aef962eea95df84a8288d097:perf/x86/intel: Add {rd,wr}lbr_{to,from} wrappers (2016-06-27 11:34:21 +0200)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.gittags/perf-core-for-mingo-20160627for you to fetch changes up to
6d9c675078e697309c1c06a1051f01de8151c476:perf data ctf: Generate fork and exit events to CTF output (2016-06-27 15:50:23 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:New features:
- Generate comm, fork and exit events when converting perf.data files to CTF (Wang Nan)
Documentation:
- Document perf.data on disk format (Andi Kleen)
Infrastructure:
- Add libbabeltrace to build-test (Wang Nan)
- 'perf record' prep work to support multiple evlists (Wang Nan)
- Remove unused
hist_entry__annotatefunction (Ravi Bangoria)- Add more toolchain triplets (Ravi Bangoria)
- Update message for slang devel packages on Ubuntu (Neeraj Badlani)
- Generalize handling of 'ret' instructions in the annotate TUI (Naveen N. Rao)
- Use proper dso name for
is_regular_file, fixing device file handling (Jiri Olsa)Build Fixes:
Quoted 7 lines
- Add missing
config.hinclude, fixing the build with libabeltrace (Jiri Olsa)Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Andi Kleen (1):
perf tools: Add documentation for perf.data on disk format
Quoted 6 lines
The doc build fails with:
asciidoc: FAILED: manpage document title is mandatory Makefile:276: recipe for target 'perf-file-format.xml' failed make[2]: *** [perf-file-format.xml] Error 1 make[2]: *** Waiting for unfinished jobs....
Ok, I've created a perf-core-for-mingo-20160628 with that patch removed while we investigate this, please consider pulling that one instead.
build-test should've caught this... Reproduced, trying to fix...
- Arnaldo
Arnaldo Carvalho de Melo
maintainerEm Tue, Jun 28, 2016 at 11:01:55AM -0300, Arnaldo Carvalho de Melo escreveu:
Quoted 12 lines
Em Tue, Jun 28, 2016 at 09:02:57AM +0200, Ingo Molnar escreveu:
Quoted 10 lines · Arnaldo Carvalho de Melo
Quoted 2 lines
Andi Kleen (1):
perf tools: Add documentation for perf.data on disk formatThe doc build fails with:
asciidoc: FAILED: manpage document title is mandatory Makefile:276: recipe for target 'perf-file-format.xml' failed make[2]: *** [perf-file-format.xml] Error 1 make[2]: *** Waiting for unfinished jobs....
Quoted 4 lines
Ok, I've created a perf-core-for-mingo-20160628 with that patch removed while we investigate this, please consider pulling that one instead.
build-test should've caught this... Reproduced, trying to fix...
So, when doing the docs install it expects files starting with perf-* will be fed to asciidoc to generate man pages, etc, so the quick fix here is to rename perf-file-format.txt to perf.data-file-format.txt, which I did, so this will go in the next pull request.
Volunteers accepted to turn this into asciidoc format so that we can do a man perf-data-file-format or somesuch.
- Arnaldo
Quoted 61 lines · Arnaldo Carvalho de Melo
Em Tue, Jun 28, 2016 at 09:02:57AM +0200, Ingo Molnar escreveu:
Quoted 60 lines · Arnaldo Carvalho de Melo
Quoted 48 lines
Hi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit
d4cf1949f9689314aef962eea95df84a8288d097:perf/x86/intel: Add {rd,wr}lbr_{to,from} wrappers (2016-06-27 11:34:21 +0200)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.gittags/perf-core-for-mingo-20160627for you to fetch changes up to
6d9c675078e697309c1c06a1051f01de8151c476:perf data ctf: Generate fork and exit events to CTF output (2016-06-27 15:50:23 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:New features:
- Generate comm, fork and exit events when converting perf.data files to CTF (Wang Nan)
Documentation:
- Document perf.data on disk format (Andi Kleen)
Infrastructure:
- Add libbabeltrace to build-test (Wang Nan)
- 'perf record' prep work to support multiple evlists (Wang Nan)
- Remove unused
hist_entry__annotatefunction (Ravi Bangoria)- Add more toolchain triplets (Ravi Bangoria)
- Update message for slang devel packages on Ubuntu (Neeraj Badlani)
- Generalize handling of 'ret' instructions in the annotate TUI (Naveen N. Rao)
- Use proper dso name for
is_regular_file, fixing device file handling (Jiri Olsa)Build Fixes:
Quoted 7 lines
- Add missing
config.hinclude, fixing the build with libabeltrace (Jiri Olsa)Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Andi Kleen (1):
perf tools: Add documentation for perf.data on disk formatThe doc build fails with:
Quoted 7 lines
Quoted 4 lines
asciidoc: FAILED: manpage document title is mandatory Makefile:276: recipe for target 'perf-file-format.xml' failed make[2]: *** [perf-file-format.xml] Error 1 make[2]: *** Waiting for unfinished jobs....
Ok, I've created a perf-core-for-mingo-20160628 with that patch removed while we investigate this, please consider pulling that one instead.
Pulled, thanks a lot Arnaldo!
Ingo