Skip to contentSkip to conversation

perf/core improvements and fixes

GIT PULL New Jiri Olsa 2 participants 8 messages Apr 29, 2014 – May 1, 2014

Subsystems (2)
lore
Share & tools
lore

Jiri Olsa

author reviewer
#0 lore raw

hi 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
author reviewer
#1 lore raw

PATCH 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
index 9f66549..7fff6be 100644
@@ -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
author reviewer
#2 lore raw

PATCH 2/6 perf tools: Parse tracepoints with '-' in system name

In reply to Jiri Olsa

From: 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
index 4eb67ec..ac9db9f 100644
@@ -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
author reviewer
#3 lore raw

PATCH 3/6 perf tests: Add numeric identifier to evlist_test

In reply to Jiri Olsa

From: 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
index 8605ff5..81dbd5a 100644
@@ -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
author reviewer
#4 lore raw

PATCH 4/6 perf tests: Add a test of kvm-390: trace event

In reply to Jiri Olsa

From: 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
index 81dbd5a..deba669 100644
@@ -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
author reviewer
#5 lore raw

PATCH 5/6 perf tools: Move u64_swap union

In reply to Jiri Olsa

From: 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
index 0c9926c..0c581d0 100644
@@ -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
index c51fa6b..5f3689a 100644
@@ -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
author reviewer
#6 lore raw

PATCH 6/6 perf tools ARM64: Wire up perf_regs and unwind support

In reply to Jiri Olsa

From: 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
new file mode 100644
index 0000000..67e9b3d
@@ -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
index a71fb39..cd56869 100644
@@ -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
#7 lore raw
In reply to Jiri Olsa
Quoted 50 lines · Jiri Olsa

hi 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

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