perf/core improvements and fixes
Subsystems (2)
Jiri Olsa
reviewerhi Ingo,
please consider pulling
resending 0/6.. it got lost somehow from previous post..
thanks,
jirka
The following changes since commit 201131998fbf074b03679afedcc29948e63331ef:
Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf into perf/core (2014-04-29 08:41:21 +0200)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git tags/perf-core-for-mingo
for you to fetch changes up to 8ab596afb97bc9e2f9140dc1d993e81749acff42:
perf tools ARM64: Wire up perf_regs and unwind support (2014-04-29 15:31:19 +0200)
----------------------------------------------------------------
perf/core improvements and fixes:
. Wire up perf_regs and unwind support for ARM64 (Jean Pihet)
. Move u64_swap union to its single user's header, evsel.h (Borislav Petkov)
. Fix for s390 to properly parse tracepoints plus test code (Alexander Yarygin)
. Handle EINTR error for readn/writen (Namhyung Kim)
----------------------------------------------------------------
Alexander Yarygin (3):
perf tools: Parse tracepoints with '-' in system name perf tests: Add numeric identifier to evlist_test perf tests: Add a test of kvm-390: trace event
Borislav Petkov (1):
perf tools: Move u64_swap union
Jean Pihet (1):
perf tools ARM64: Wire up perf_regs and unwind support
Namhyung Kim (1):
perf tools: Handle EINTR error for readn/writen
tools/perf/arch/arm64/Makefile | 7 ++ tools/perf/arch/arm64/include/perf_regs.h | 88 ++++++++++++++++ tools/perf/arch/arm64/util/dwarf-regs.c | 80 +++++++++++++++ tools/perf/arch/arm64/util/unwind-libunwind.c | 82 +++++++++++++++ tools/perf/config/Makefile | 8 +- tools/perf/tests/parse-events.c | 142 ++++++++++++++++++-------- tools/perf/util/evsel.h | 5 + tools/perf/util/parse-events.y | 12 +++ tools/perf/util/types.h | 5 - tools/perf/util/util.c | 2 + 10 files changed, 380 insertions(+), 51 deletions(-) create mode 100644 tools/perf/arch/arm64/Makefile create mode 100644 tools/perf/arch/arm64/include/perf_regs.h create mode 100644 tools/perf/arch/arm64/util/dwarf-regs.c create mode 100644 tools/perf/arch/arm64/util/unwind-libunwind.c
Jiri Olsa
reviewerPATCH 1/6 perf tools: Handle EINTR error for readn/writen
From: Namhyung Kim <[email protected]>
Those readn/writen functions are to ensure read/write does I/O for a given size exactly. But ion() - its implementation - does not handle in case it returns prematurely due to a signal. As it's not an error itself so just retry the operation.
--- tools/perf/util/util.c | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/util/util.c +2 -0
@@ -166,6 +166,8 @@ static ssize_t ion(bool is_read, int fd, void *buf, size_t n)ssize_t ret = is_read ?read (fd, buf, left) :write (fd, buf, left); +if (ret <0 && errno ==EINTR ) +continue ;if (ret <=0 )return ret;
Signature · 1 line
1.8.3.1
Jiri Olsa
reviewerPATCH 2/6 perf tools: Parse tracepoints with '-' in system name
In reply to Jiri OlsaFrom: Alexander Yarygin <[email protected]>
Trace events potentially can have a '-' in their trace system name, e.g. kvm on s390 defines kvm-s390:* tracepoints.
We could not parse them, because there was no rule for this:
$ sudo ./perf top -e "kvm-s390:*" invalid or unsupported event: 'kvm-s390:*'
This patch adds an extra rule to event_legacy_tracepoint which handles those cases. Without the patch, perf will not accept such tracepoints in the -e option.
--- tools/perf/util/parse-events.y | 12 ++++++++++++ 1 file changed, 12 insertions(+)
tools/perf/util/parse-events.y +12 -0
@@ -299,6 +299,18 @@ PE_PREFIX_MEM PE_VALUE sep_dc } event_legacy_tracepoint: +PE_NAME '-' PE_NAME ':' PE_NAME +{ + struct parse_events_evlist *data = _data; + struct list_head *list; + char sys_name[128]; + snprintf(&sys_name, 128, "%s-%s", $1, $3); + + ALLOC_LIST(list); + ABORT_ON(parse_events_add_tracepoint(list, &data->idx, &sys_name, $5)); + $$ = list; +} +| PE_NAME ':' PE_NAME { struct parse_events_evlist *data = _data;
Signature · 1 line
1.8.3.1
Jiri Olsa
reviewerPATCH 3/6 perf tests: Add numeric identifier to evlist_test
In reply to Jiri OlsaFrom: Alexander Yarygin <[email protected]>
In tests/parse-events.c test cases are declared in evlist_test[] arrays. Elements of arrays are initialized in following pattern:
[i] = { .name = ...,
.check = ...,
},
When perf-test is running with '-v' option, 'i' variable will be printed for every existing test.
However, we can't add any arch specific tests inside #ifdefs, because it will create collision between the element number inside #ifdef and the next one outside.
This patch adds 'id' field in evlist_test, uses it as a test identifier and removes explicit numbering of array elements. This helps to number tests with gaps.
--- tools/perf/tests/parse-events.c | 135 ++++++++++++++++++++++++++-------------- 1 file changed, 90 insertions(+), 45 deletions(-)
tools/perf/tests/parse-events.c +90 -45
@@ -1174,188 +1174,233 @@ static int test__all_tracepoints(struct perf_evlist *evlist)struct evlist_test {const char *name;__u32 type; +const int id;int (*check)(struct perf_evlist *evlist); };static struct evlist_test test__events[] = { - [0 ] = { + { .name ="syscalls:sys_enter_open" , .check = test__checkevent_tracepoint, + .id =0 , }, - [1 ] = { + { .name ="syscalls:*" , .check = test__checkevent_tracepoint_multi, + .id =1 , }, - [2 ] = { + { .name ="r1a" , .check = test__checkevent_raw, + .id =2 , }, - [3 ] = { + { .name ="1:1" , .check = test__checkevent_numeric, + .id =3 , }, - [4 ] = { + { .name ="instructions" , .check = test__checkevent_symbolic_name, + .id =4 , }, - [5 ] = { + { .name ="cycles/period=100000,config2/" , .check = test__checkevent_symbolic_name_config, + .id =5 , }, - [6 ] = { + { .name ="faults" , .check = test__checkevent_symbolic_alias, + .id =6 , }, - [7 ] = { + { .name ="L1-dcache-load-miss" , .check = test__checkevent_genhw, + .id =7 , }, - [8 ] = { + { .name ="mem:0" , .check = test__checkevent_breakpoint, + .id =8 , }, - [9 ] = { + { .name ="mem:0:x" , .check = test__checkevent_breakpoint_x, + .id =9 , }, - [10 ] = { + { .name ="mem:0:r" , .check = test__checkevent_breakpoint_r, + .id =10 , }, - [11 ] = { + { .name ="mem:0:w" , .check = test__checkevent_breakpoint_w, + .id =11 , }, - [12 ] = { + { .name ="syscalls:sys_enter_open:k" , .check = test__checkevent_tracepoint_modifier, + .id =12 , }, - [13 ] = { + { .name ="syscalls:*:u" , .check = test__checkevent_tracepoint_multi_modifier, + .id =13 , }, - [14 ] = { + { .name ="r1a:kp" , .check = test__checkevent_raw_modifier, + .id =14 , }, - [15 ] = { + { .name ="1:1:hp" , .check = test__checkevent_numeric_modifier, + .id =15 , }, - [16 ] = { + { .name ="instructions:h" , .check = test__checkevent_symbolic_name_modifier, + .id =16 , }, - [17 ] = { + { .name ="faults:u" , .check = test__checkevent_symbolic_alias_modifier, + .id =17 , }, - [18 ] = { + { .name ="L1-dcache-load-miss:kp" , .check = test__checkevent_genhw_modifier, + .id =18 , }, - [19 ] = { + { .name ="mem:0:u" , .check = test__checkevent_breakpoint_modifier, + .id =19 , }, - [20 ] = { + { .name ="mem:0:x:k" , .check = test__checkevent_breakpoint_x_modifier, + .id =20 , }, - [21 ] = { + { .name ="mem:0:r:hp" , .check = test__checkevent_breakpoint_r_modifier, + .id =21 , }, - [22 ] = { + { .name ="mem:0:w:up" , .check = test__checkevent_breakpoint_w_modifier, + .id =22 , }, - [23 ] = { + { .name ="r1,syscalls:sys_enter_open:k,1:1:hp" , .check = test__checkevent_list, + .id =23 , }, - [24 ] = { + { .name ="instructions:G" , .check = test__checkevent_exclude_host_modifier, + .id =24 , }, - [25 ] = { + { .name ="instructions:H" , .check = test__checkevent_exclude_guest_modifier, + .id =25 , }, - [26 ] = { + { .name ="mem:0:rw" , .check = test__checkevent_breakpoint_rw, + .id =26 , }, - [27 ] = { + { .name ="mem:0:rw:kp" , .check = test__checkevent_breakpoint_rw_modifier, + .id =27 , }, - [28 ] = { + { .name ="{instructions:k,cycles:upp}" , .check = test__group1, + .id =28 , }, - [29 ] = { + { .name ="{faults:k,cache-references}:u,cycles:k" , .check = test__group2, + .id =29 , }, - [30 ] = { + { .name ="group1{syscalls:sys_enter_open:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u" , .check = test__group3, + .id =30 , }, - [31 ] = { + { .name ="{cycles:u,instructions:kp}:p" , .check = test__group4, + .id =31 , }, - [32 ] = { + { .name ="{cycles,instructions}:G,{cycles:G,instructions:G},cycles" , .check = test__group5, + .id =32 , }, - [33 ] = { + { .name ="*:*" , .check = test__all_tracepoints, + .id =33 , }, - [34 ] = { + { .name ="{cycles,cache-misses:G}:H" , .check = test__group_gh1, + .id =34 , }, - [35 ] = { + { .name ="{cycles,cache-misses:H}:G" , .check = test__group_gh2, + .id =35 , }, - [36 ] = { + { .name ="{cycles:G,cache-misses:H}:u" , .check = test__group_gh3, + .id =36 , }, - [37 ] = { + { .name ="{cycles:G,cache-misses:H}:uG" , .check = test__group_gh4, + .id =37 , }, - [38 ] = { + { .name ="{cycles,cache-misses,branch-misses}:S" , .check = test__leader_sample1, + .id =38 , }, - [39 ] = { + { .name ="{instructions,branch-misses}:Su" , .check = test__leader_sample2, + .id =39 , }, - [40 ] = { + { .name ="instructions:uDp" , .check = test__checkevent_pinned_modifier, + .id =40 , }, - [41 ] = { + { .name ="{cycles,cache-misses,branch-misses}:D" , .check = test__pinned_group, + .id =41 , }, };static struct evlist_test test__events_pmu[] = { - [0 ] = { + { .name ="cpu/config=10,config1,config2=3,period=1000/u" , .check = test__checkevent_pmu, + .id =0 , }, - [1 ] = { + { .name ="cpu/config=1,name=krava/u,cpu/config=2/u" , .check = test__checkevent_pmu_name, + .id =1 , }, };
@@ -1402,7 +1447,7 @@ static int test_events(struct evlist_test *events, unsigned cnt)for (i =0 ; i < cnt; i++) {struct evlist_test *e = &events[i]; -pr_debug ("running test %d '%s'\n" , i, e->name); +pr_debug ("running test %d '%s'\n" , e->id, e->name); ret1 =test_event (e);if (ret1) ret2 = ret1;
Signature · 1 line
1.8.3.1
Jiri Olsa
reviewerPATCH 4/6 perf tests: Add a test of kvm-390: trace event
In reply to Jiri OlsaFrom: Alexander Yarygin <[email protected]>
Add a s390 specific test of a hardcoded trace event with '-' in the name.
--- tools/perf/tests/parse-events.c | 7 +++++++ 1 file changed, 7 insertions(+)
tools/perf/tests/parse-events.c +7 -0
@@ -1389,6 +1389,13 @@ static struct evlist_test test__events[] = { .check = test__pinned_group, .id = 41, }, +#if defined(__s390x__) + { + .name = "kvm-s390:kvm_s390_create_vm", + .check = test__checkevent_tracepoint, + .id = 100, + }, +#endif }; static struct evlist_test test__events_pmu[] = {
Signature · 1 line
1.8.3.1
Jiri Olsa
reviewerPATCH 5/6 perf tools: Move u64_swap union
In reply to Jiri OlsaFrom: Borislav Petkov <[email protected]>
... to its single user's header, evsel.h.
--- tools/perf/util/evsel.h | 5 +++++ tools/perf/util/types.h | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-)
tools/perf/util/evsel.h +5 -0
@@ -91,6 +91,11 @@ struct perf_evsel {char *group_name; }; +union u64_swap { +u64 val64; +u32 val32[2 ]; +}; +#define hists_to_evsel (h) container_of(h, struct perf_evsel, hists)struct cpu_map ;
tools/perf/util/types.h +0 -5
@@ -16,9 +16,4 @@ typedef signed short s16;typedef unsigned char u8 ;typedef signed char s8 ; -union u64_swap { -u64 val64; -u32 val32[2 ]; -}; -#endif /* __PERF_TYPES_H */
Signature · 1 line
1.8.3.1
Jiri Olsa
reviewerPATCH 6/6 perf tools ARM64: Wire up perf_regs and unwind support
In reply to Jiri OlsaFrom: Jean Pihet <[email protected]>
This patch hooks in the perf_regs and libunwind code for ARM64. The tools/perf/arch/arm64 is created; it contains the arch specific code for DWARF unwinding.
--- tools/perf/arch/arm64/Makefile | 7 +++ tools/perf/arch/arm64/include/perf_regs.h | 88 +++++++++++++++++++++++++++ tools/perf/arch/arm64/util/dwarf-regs.c | 80 ++++++++++++++++++++++++ tools/perf/arch/arm64/util/unwind-libunwind.c | 82 +++++++++++++++++++++++++ tools/perf/config/Makefile | 8 ++- 5 files changed, 264 insertions(+), 1 deletion(-) create mode 100644 tools/perf/arch/arm64/Makefile create mode 100644 tools/perf/arch/arm64/include/perf_regs.h create mode 100644 tools/perf/arch/arm64/util/dwarf-regs.c create mode 100644 tools/perf/arch/arm64/util/unwind-libunwind.c
tools/perf/arch/arm64/Makefile new file +7 -0
@@ -0,0 +1,7 @@ +ifndef NO_DWARF +PERF_HAVE_DWARF_REGS := 1 +LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o +endif +ifndef NO_LIBUNWIND +LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/unwind-libunwind.o +endif
tools/perf/arch/arm64/include/perf_regs.h new file +88 -0
88 lines not on this page · raw message
tools/perf/arch/arm64/util/dwarf-regs.c new file +80 -0
80 lines not on this page · raw message
tools/perf/arch/arm64/util/unwind-libunwind.c new file +82 -0
82 lines not on this page · raw message
tools/perf/config/Makefile +7 -1
@@ -29,11 +29,17 @@ ifeq ($(ARCH),x86) endif NO_PERF_REGS := 0 endif + ifeq ($(ARCH),arm) NO_PERF_REGS := 0 LIBUNWIND_LIBS = -lunwind -lunwind-arm endif +ifeq ($(ARCH),arm64) + NO_PERF_REGS := 0 + LIBUNWIND_LIBS = -lunwind -lunwind-aarch64 +endif + # So far there's only x86 libdw unwind support merged in perf. # Disable it on all other architectures in case libdw unwind # support is detected in system. Add supported architectures
@@ -363,7 +369,7 @@ else endif ifndef NO_LIBUNWIND - ifeq ($(ARCH),arm) + ifeq ($(ARCH),$(filter $(ARCH),arm arm64)) $(call feature_check,libunwind-debug-frame) ifneq ($(feature-libunwind-debug-frame), 1) msg := $(warning No debug_frame support found in libunwind);
Signature · 1 line
1.8.3.1
Quoted 50 lines · Jiri Olsa
hi Ingo,
please consider pullingresending 0/6.. it got lost somehow from previous post..
thanks,
jirkaThe following changes since commit
201131998fbf074b03679afedcc29948e63331ef:Merge tag 'perf-core-for-mingo' of
git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perfinto perf/core (2014-04-29 08:41:21 +0200)are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.gittags/perf-core-for-mingofor you to fetch changes up to
8ab596afb97bc9e2f9140dc1d993e81749acff42:perf tools ARM64: Wire up
perf_regsand unwind support (2014-04-29 15:31:19 +0200)----------------------------------------------------------------
perf/core improvements and fixes:. Wire up
perf_regsand unwind support for ARM64 (Jean Pihet). Move
u64_swapunion to its single user's header,evsel.h(Borislav Petkov). Fix for s390 to properly parse tracepoints plus test code (Alexander Yarygin)
. Handle EINTR error for readn/writen (Namhyung Kim)
Signed-off-by Jiri Olsa <[email protected]>----------------------------------------------------------------
Alexander Yarygin (3):
perf tools: Parse tracepoints with '-' in system name perf tests: Add numeric identifier toevlist_testperf tests: Add a test of kvm-390: trace eventBorislav Petkov (1):
perf tools: Moveu64_swapunionJean Pihet (1):
perf tools ARM64: Wire upperf_regsand unwind supportNamhyung Kim (1):
perf tools: Handle EINTR error for readn/writen
Quoted 15 lines
tools/perf/arch/arm64/Makefile | 7 ++ tools/perf/arch/arm64/include/perf_regs.h | 88 ++++++++++++++++ tools/perf/arch/arm64/util/dwarf-regs.c | 80 +++++++++++++++ tools/perf/arch/arm64/util/unwind-libunwind.c | 82 +++++++++++++++ tools/perf/config/Makefile | 8 +- tools/perf/tests/parse-events.c | 142 ++++++++++++++++++-------- tools/perf/util/evsel.h | 5 + tools/perf/util/parse-events.y | 12 +++ tools/perf/util/types.h | 5 - tools/perf/util/util.c | 2 + 10 files changed, 380 insertions(+), 51 deletions(-) create mode 100644 tools/perf/arch/arm64/Makefile create mode 100644 tools/perf/arch/arm64/include/perf_regs.h create mode 100644 tools/perf/arch/arm64/util/dwarf-regs.c create mode 100644 tools/perf/arch/arm64/util/unwind-libunwind.c
Pulled, thanks a lot Jiri!
I also merged perf/urgent into perf/core, because a conflict developed between the two.
Thanks,
Ingo