Skip to contentSkip to conversation

perf/core fixes

GIT PULL New Arnaldo Carvalho de Melo 3 participants 13 messages Jul 1, 2015 – Jul 2, 2015 perf events

lore
Share & tools
lore

Arnaldo Carvalho de Melo

author maintainer
#0 lore raw

Hi Ingo,

Please consider pulling,

- Arnaldo

The following changes since commit 93472aff802fd7b61f2209335207e9bd793012f7:

perf/x86: Fix 'active_events' imbalance (2015-06-30 13:08:46 +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

for you to fetch changes up to 5ef7bbb09f7b91ef06524c72e1ab1fc48e0d6682:

perf tools: Allow to specify custom linker command (2015-07-01 17:53:50 -0300)

----------------------------------------------------------------
perf/core fixes:

Build fixes:

- Create config.detected into OUTPUT directory, fixing parallel builds sharing the same source directory (Aaro Kiskinen)

- Allow to specify custom linker command, fixing some MIPS64 builds. (Aaro Kiskinen)

Infrastructure:

- Add missing break for PERF_RECORD_ITRACE_START, which caused those events samples to be parsed as well as PERF_RECORD_LOST_SAMPLES. ITRACE_START only appears when Intel PT or BTS are present, so (Jiri Olsa)

- Call the perf_session destructor when bailing out in the inject, kmem, report, kvm and mem tools (Taeung Song)

----------------------------------------------------------------
Aaro Koskinen (2):
perf tools: Create config.detected into OUTPUT directory perf tools: Allow to specify custom linker command

Jiri Olsa (1):
perf tools: Add missing break for PERF_RECORD_ITRACE_START

Taeung Song (5):
perf inject: Fill in the missing session freeing after an error occurs perf kmem: Fill in the missing session freeing after an error occurs perf report: Fill in the missing session freeing after an error occurs perf kvm: Fill in the missing session freeing after an error occurs perf mem: Fill in the missing session freeing after an error occurs

 tools/build/Makefile.build  |  2 +-
 tools/perf/Makefile.perf    |  4 ++--
 tools/perf/builtin-inject.c |  7 ++++---
 tools/perf/builtin-kmem.c   |  4 ++--
 tools/perf/builtin-kvm.c    | 14 ++++++++++----
 tools/perf/builtin-mem.c    | 16 ++++++----------
 tools/perf/builtin-report.c |  6 ++++--
 tools/perf/config/Makefile  |  6 +++---
 tools/perf/util/machine.c   |  3 +--
 9 files changed, 33 insertions(+), 29 deletions(-)
author maintainer
#1 lore raw

PATCH 1/8 perf tools: Add missing break for PERF_RECORD_ITRACE_START

From: Jiri Olsa <[email protected]>

Missing switch break since introduction of new event:

c4937a91ea56 perf tools: handle PERF_RECORD_LOST_SAMPLES

Also removing unneeded break for PERF_RECORD_LOST_SAMPLES.

---
 tools/perf/util/machine.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
tools/perf/util/machine.c +1 -2
index 4744673aff1b..7ff682770fdb 100644
@@ -1448,10 +1448,9 @@ int machine__process_event(struct machine *machine, union perf_event *event,
 	case PERF_RECORD_AUX:
 		ret = machine__process_aux_event(machine, event); break;
 	case PERF_RECORD_ITRACE_START:
-		ret = machine__process_itrace_start_event(machine, event);
+		ret = machine__process_itrace_start_event(machine, event); break;
 	case PERF_RECORD_LOST_SAMPLES:
 		ret = machine__process_lost_samples_event(machine, event, sample); break;
-		break;
 	default:
 		ret = -1;
 		break;
Signature · 1 line
2.1.0
author maintainer
#2 lore raw

PATCH 2/8 perf inject: Fill in the missing session freeing after an error occurs

In reply to Arnaldo Carvalho de Melo

From: Taeung Song <[email protected]>

When an error occur an error value is just returned without freeing the session. So allocating and freeing session have to be matched as a pair even if an error occurs.

---
 tools/perf/builtin-inject.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)
tools/perf/builtin-inject.c +4 -3
index 52ec66b23607..01b06492bd6a 100644
@@ -630,12 +630,13 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused)
 	if (inject.session == NULL)
 		return -1;
 
-	if (symbol__init(&inject.session->header.env) < 0)
-		return -1;
+	ret = symbol__init(&inject.session->header.env);
+	if (ret < 0)
+		goto out_delete;
 
 	ret = __cmd_inject(&inject);
 
+out_delete:
 	perf_session__delete(inject.session);
-
 	return ret;
 }
Signature · 1 line
2.1.0
author maintainer
#3 lore raw

PATCH 3/8 perf kmem: Fill in the missing session freeing after an error occurs

In reply to Arnaldo Carvalho de Melo

From: Taeung Song <[email protected]>

When an error occurs an error value is just returned without freeing the session. So allocating and freeing session have to be matched as a pair even if an error occurs.

---
 tools/perf/builtin-kmem.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
tools/perf/builtin-kmem.c +2 -2
index 950f296dfcf7..23b1faaaa4cc 100644
@@ -1916,7 +1916,7 @@ int cmd_kmem(int argc, const char **argv, const char *prefix __maybe_unused)
 		if (!perf_evlist__find_tracepoint_by_name(session->evlist,
 							  "kmem:kmalloc")) {
 			pr_err(errmsg, "slab", "slab");
-			return -1;
+			goto out_delete;
 		}
 	}
 
@@ -1927,7 +1927,7 @@ int cmd_kmem(int argc, const char **argv, const char *prefix __maybe_unused)
 							     "kmem:mm_page_alloc");
 		if (evsel == NULL) {
 			pr_err(errmsg, "page", "page");
-			return -1;
+			goto out_delete;
 		}
 
 		kmem_page_size = pevent_get_page_size(evsel->tp_format->pevent);
Signature · 1 line
2.1.0
author maintainer
#4 lore raw

PATCH 4/8 perf report: Fill in the missing session freeing after an error occurs

In reply to Arnaldo Carvalho de Melo

From: Taeung Song <[email protected]>

When an error occurs an error value is just returned without freeing the session. So allocating and freeing session have to be matched as a pair even if an error occurs.

---
 tools/perf/builtin-report.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
tools/perf/builtin-report.c +4 -2
index 348bed4a2abf..95a47719aec3 100644
@@ -839,8 +839,10 @@ repeat:
 	if (report.header || report.header_only) {
 		perf_session__fprintf_info(session, stdout,
 					   report.show_full_info);
-		if (report.header_only)
-			return 0;
+		if (report.header_only) {
+			ret = 0;
+			goto error;
+		}
 	} else if (use_browser == 0) {
 		fputs("# To display the perf.data header info, please use --header/--header-only options.\n#\n",
 		      stdout);
Signature · 1 line
2.1.0
author maintainer
#5 lore raw

PATCH 5/8 perf kvm: Fill in the missing session freeing after an error occurs

In reply to Arnaldo Carvalho de Melo

From: Taeung Song <[email protected]>

When an error occurs an error value is just returned without freeing the session. So allocating and freeing session have to be matched as a pair even if an error occurs.

---
 tools/perf/builtin-kvm.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)
tools/perf/builtin-kvm.c +10 -4
index 74878cd75078..fc1cffb1b7a2 100644
@@ -1061,8 +1061,10 @@ static int read_events(struct perf_kvm_stat *kvm)
 
 	symbol__init(&kvm->session->header.env);
 
-	if (!perf_session__has_traces(kvm->session, "kvm record"))
-		return -EINVAL;
+	if (!perf_session__has_traces(kvm->session, "kvm record")) {
+		ret = -EINVAL;
+		goto out_delete;
+	}
 
 	/*
 	 * Do not use 'isa' recorded in kvm_exit tracepoint since it is not
@@ -1070,9 +1072,13 @@ static int read_events(struct perf_kvm_stat *kvm)
 	 */
 	ret = cpu_isa_config(kvm);
 	if (ret < 0)
-		return ret;
+		goto out_delete;
 
-	return perf_session__process_events(kvm->session);
+	ret = perf_session__process_events(kvm->session);
+
+out_delete:
+	perf_session__delete(kvm->session);
+	return ret;
 }
 
 static int parse_target_str(struct perf_kvm_stat *kvm)
Signature · 1 line
2.1.0
author maintainer
#6 lore raw

PATCH 6/8 perf mem: Fill in the missing session freeing after an error occurs

In reply to Arnaldo Carvalho de Melo

From: Taeung Song <[email protected]>

When an error occurs an error value is just returned without freeing the session. So allocating and freeing session have to be matched as a pair even if an error occurs.

---
 tools/perf/builtin-mem.c | 16 ++++++----------
 1 file changed, 6 insertions(+), 10 deletions(-)
tools/perf/builtin-mem.c +6 -10
index da2ec06f0742..80170aace5d4 100644
@@ -124,7 +124,6 @@ static int report_raw_events(struct perf_mem *mem)
 		.mode = PERF_DATA_MODE_READ,
 		.force = mem->force,
 	};
-	int err = -EINVAL;
 	int ret;
 	struct perf_session *session = perf_session__new(&file, false,
 							 &mem->tool);
@@ -135,24 +134,21 @@ static int report_raw_events(struct perf_mem *mem)
 	if (mem->cpu_list) {
 		ret = perf_session__cpu_bitmap(session, mem->cpu_list,
 					       mem->cpu_bitmap);
-		if (ret)
+		if (ret < 0)
 			goto out_delete;
 	}
 
-	if (symbol__init(&session->header.env) < 0)
-		return -1;
+	ret = symbol__init(&session->header.env);
+	if (ret < 0)
+		goto out_delete;
 
 	printf("# PID, TID, IP, ADDR, LOCAL WEIGHT, DSRC, SYMBOL\n");
 
-	err = perf_session__process_events(session);
-	if (err)
-		return err;
-
-	return 0;
+	ret = perf_session__process_events(session);
 
 out_delete:
 	perf_session__delete(session);
-	return err;
+	return ret;
 }
 
 static int report_events(int argc, const char **argv, struct perf_mem *mem)
Signature · 1 line
2.1.0
author maintainer
#7 lore raw

PATCH 7/8 perf tools: Create config.detected into OUTPUT directory

In reply to Arnaldo Carvalho de Melo

From: Aaro Koskinen <[email protected]>

Create config.detected into OUTPUT directory instead of source directory.

This fixes parallel builds that share the same source directory.

---
 tools/build/Makefile.build | 2 +-
 tools/perf/Makefile.perf   | 2 +-
 tools/perf/config/Makefile | 6 +++---
 3 files changed, 5 insertions(+), 5 deletions(-)
tools/build/Makefile.build +1 -1
index a51244a8022f..faca2bf6a430 100644
@@ -25,7 +25,7 @@ build-dir := $(srctree)/tools/build
 include $(build-dir)/Build.include
 
 # do not force detected configuration
--include .config-detected
+-include $(OUTPUT).config-detected
 
 # Init all relevant variables used in build files so
 # 1) they have correct type
tools/perf/Makefile.perf +1 -1
index 1af0cfeb7a57..0e0938afbbb1 100644
@@ -545,7 +545,7 @@ config-clean:
 clean: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean config-clean
 	$(call QUIET_CLEAN, core-objs)  $(RM) $(LIB_FILE) $(OUTPUT)perf-archive $(OUTPUT)perf-with-kcore $(LANG_BINDINGS)
 	$(Q)find . -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
-	$(Q)$(RM) .config-detected
+	$(Q)$(RM) $(OUTPUT).config-detected
 	$(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf perf-read-vdso32 perf-read-vdsox32
 	$(call QUIET_CLEAN, core-gen)   $(RM)  *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope* $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)FEATURE-DUMP $(OUTPUT)util/*-bison* $(OUTPUT)util/*-flex*
 	$(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) clean
tools/perf/config/Makefile +3 -3
index 317001c94660..094ddaee104c 100644
@@ -11,9 +11,9 @@ ifneq ($(obj-perf),)
 obj-perf := $(abspath $(obj-perf))/
 endif
 
-$(shell echo -n > .config-detected)
-detected     = $(shell echo "$(1)=y"       >> .config-detected)
-detected_var = $(shell echo "$(1)=$($(1))" >> .config-detected)
+$(shell echo -n > $(OUTPUT).config-detected)
+detected     = $(shell echo "$(1)=y"       >> $(OUTPUT).config-detected)
+detected_var = $(shell echo "$(1)=$($(1))" >> $(OUTPUT).config-detected)
 
 CFLAGS := $(EXTRA_CFLAGS) $(EXTRA_WARNINGS)
 
Signature · 1 line
2.1.0
author maintainer
#8 lore raw

PATCH 8/8 perf tools: Allow to specify custom linker command

In reply to Arnaldo Carvalho de Melo

From: Aaro Koskinen <[email protected]>

Allow to specify custom linker command. This fixes MIPS64 builds for 64-bit userspace as it will allow to pass a linker using the correct linker flags for 64-bit ABI (by default GNU binutils ld will assume N32).

---
 tools/perf/Makefile.perf | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/Makefile.perf +1 -1
index 0e0938afbbb1..7a4b549214e3 100644
@@ -110,7 +110,7 @@ $(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD
 	$(Q)touch $(OUTPUT)PERF-VERSION-FILE
 
 CC = $(CROSS_COMPILE)gcc
-LD = $(CROSS_COMPILE)ld
+LD ?= $(CROSS_COMPILE)ld
 AR = $(CROSS_COMPILE)ar
 PKG_CONFIG = $(CROSS_COMPILE)pkg-config
 
Signature · 1 line
2.1.0
#9 lore raw
In reply to Arnaldo Carvalho de Melo
Quoted 55 lines · Arnaldo Carvalho de Melo

Hi Ingo,

Please consider pulling,

- Arnaldo

The following changes since commit 93472aff802fd7b61f2209335207e9bd793012f7:

perf/x86: Fix 'active_events' imbalance (2015-06-30 13:08:46 +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

for you to fetch changes up to 5ef7bbb09f7b91ef06524c72e1ab1fc48e0d6682:

perf tools: Allow to specify custom linker command (2015-07-01 17:53:50 -0300)

----------------------------------------------------------------
perf/core fixes:

Build fixes:

- Create config.detected into OUTPUT directory, fixing parallel builds sharing the same source directory (Aaro Kiskinen)

- Allow to specify custom linker command, fixing some MIPS64 builds. (Aaro Kiskinen)

Infrastructure:

- Add missing break for PERF_RECORD_ITRACE_START, which caused those events samples to be parsed as well as PERF_RECORD_LOST_SAMPLES. ITRACE_START only appears when Intel PT or BTS are present, so (Jiri Olsa)

- Call the perf_session destructor when bailing out in the inject, kmem, report, kvm and mem tools (Taeung Song)

----------------------------------------------------------------
Aaro Koskinen (2):
perf tools: Create config.detected into OUTPUT directory perf tools: Allow to specify custom linker command

Jiri Olsa (1):
perf tools: Add missing break for PERF_RECORD_ITRACE_START

Taeung Song (5):
perf inject: Fill in the missing session freeing after an error occurs perf kmem: Fill in the missing session freeing after an error occurs perf report: Fill in the missing session freeing after an error occurs perf kvm: Fill in the missing session freeing after an error occurs perf mem: Fill in the missing session freeing after an error occurs

Quoted 10 lines
 tools/build/Makefile.build  |  2 +-
 tools/perf/Makefile.perf    |  4 ++--
 tools/perf/builtin-inject.c |  7 ++++---
 tools/perf/builtin-kmem.c   |  4 ++--
 tools/perf/builtin-kvm.c    | 14 ++++++++++----
 tools/perf/builtin-mem.c    | 16 ++++++----------
 tools/perf/builtin-report.c |  6 ++++--
 tools/perf/config/Makefile  |  6 +++---
 tools/perf/util/machine.c   |  3 +--
 9 files changed, 33 insertions(+), 29 deletions(-)

Pulled, thanks a lot Arnaldo!

Ingo

#10 lore raw
In reply to Arnaldo Carvalho de Melo

Hm, had to unpull it, due to:

make[3]: *** No rule to make target 'util/intel-pt.h', needed by 'util/auxtrace.o'. Stop. /home/mingo/tip/tools/build/Makefile.build:107: recipe for target 'util' failed make[2]: *** [util] Error 2
Makefile.perf:373: recipe for target 'libperf-in.o' failed
make[1]: *** [libperf-in.o] Error 2
Makefile:87: recipe for target 'install' failed
make: *** [install] Error 2

Thanks,

Ingo

#11 lore raw
Quoted 5 lines · Ingo Molnar

Hm, had to unpull it, due to:

make[3]: *** No rule to make target 'util/intel-pt.h', needed by 'util/auxtrace.o'. Stop. /home/mingo/tip/tools/build/Makefile.build:107: recipe for target 'util' failed

Any chance this is leftover from previous intel pt pull/revert?

And 'util/intel-pt.h' dependency stayed in the util/.auxtrace.o.cmd file? Removing the util/.auxtrace.o.cmd file should fix that.

I'm looking at this issue currently.. need somehow to check the dependency validity, need to check how kbuild deal with this ;-)

jirka

Quoted 9 lines

make[2]: *** [util] Error 2
Makefile.perf:373: recipe for target 'libperf-in.o' failed make[1]: *** [libperf-in.o] Error 2
Makefile:87: recipe for target 'install' failed
make: *** [install] Error 2

Thanks,

Ingo

#12 lore raw
Quoted 7 lines · Jiri Olsa
Quoted 5 lines · Ingo Molnar

Hm, had to unpull it, due to:

make[3]: *** No rule to make target 'util/intel-pt.h', needed by 'util/auxtrace.o'. Stop. /home/mingo/tip/tools/build/Makefile.build:107: recipe for target 'util' failed

Quoted 7 lines

Any chance this is leftover from previous intel pt pull/revert?

And 'util/intel-pt.h' dependency stayed in the util/.auxtrace.o.cmd file? Removing the util/.auxtrace.o.cmd file should fix that.

I'm looking at this issue currently.. need somehow to check the dependency validity, need to check how kbuild deal with this ;-)

That's exactly what happened - it now builds fine so I restored the pull, thanks Jiri!

Ingo