linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] perf: add a dummy software event to keep tracking
@ 2013-08-07 13:30 Adrian Hunter
  2013-08-07 13:30 ` [PATCH 1/3] " Adrian Hunter
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Adrian Hunter @ 2013-08-07 13:30 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar
  Cc: Arnaldo Carvalho de Melo, linux-kernel, David Ahern,
	Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim,
	Paul Mackerras, Stephane Eranian

Hi

This is an alternative to the 'keep tracking' flag patch
which is here:

	http://marc.info/?l=linux-kernel&m=137242545521246&w=2

perf tools is updated and a test added to demonstrate the
new event.


Adrian Hunter (3):
      perf: add a dummy software event to keep tracking
      perf tools: add support for PERF_COUNT_SW_DUMMY
      perf tools: add 'keep tracking' test

 include/uapi/linux/perf_event.h  |   1 +
 tools/perf/Makefile              |   1 +
 tools/perf/tests/builtin-test.c  |   4 ++
 tools/perf/tests/keep-tracking.c | 150 +++++++++++++++++++++++++++++++++++++++
 tools/perf/tests/tests.h         |   1 +
 tools/perf/util/evlist.c         |  42 ++++++++++-
 tools/perf/util/evlist.h         |   5 ++
 tools/perf/util/parse-events.c   |   4 ++
 tools/perf/util/parse-events.l   |   1 +
 tools/perf/util/python.c         |   1 +
 10 files changed, 208 insertions(+), 2 deletions(-)
 create mode 100644 tools/perf/tests/keep-tracking.c

Regards
Adrian


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/3] perf: add a dummy software event to keep tracking
  2013-08-07 13:30 [PATCH 0/3] perf: add a dummy software event to keep tracking Adrian Hunter
@ 2013-08-07 13:30 ` Adrian Hunter
  2013-08-26 13:15   ` Adrian Hunter
  2013-08-07 13:30 ` [PATCH 2/3] perf tools: add support for PERF_COUNT_SW_DUMMY Adrian Hunter
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 10+ messages in thread
From: Adrian Hunter @ 2013-08-07 13:30 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar
  Cc: Arnaldo Carvalho de Melo, linux-kernel, David Ahern,
	Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim,
	Paul Mackerras, Stephane Eranian

When an event is disabled the "tracking" events
selected by the 'mmap', 'comm' and 'task' bits of
struct perf_event_attr, are also disabled.  However,
the information those events provide is necessary to
resolve symbols for when the main event is re-enabled.

The "tracking" events can be kept enabled by putting
them on another event, but that requires an event
that otherwise does nothing.  A new software event
PERF_COUNT_SW_DUMMY is added for that purpose.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
 include/uapi/linux/perf_event.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h
index 62c25a2..9e28422 100644
--- a/include/uapi/linux/perf_event.h
+++ b/include/uapi/linux/perf_event.h
@@ -109,6 +109,7 @@ enum perf_sw_ids {
 	PERF_COUNT_SW_PAGE_FAULTS_MAJ		= 6,
 	PERF_COUNT_SW_ALIGNMENT_FAULTS		= 7,
 	PERF_COUNT_SW_EMULATION_FAULTS		= 8,
+	PERF_COUNT_SW_DUMMY			= 9,
 
 	PERF_COUNT_SW_MAX,			/* non-ABI */
 };
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/3] perf tools: add support for PERF_COUNT_SW_DUMMY
  2013-08-07 13:30 [PATCH 0/3] perf: add a dummy software event to keep tracking Adrian Hunter
  2013-08-07 13:30 ` [PATCH 1/3] " Adrian Hunter
@ 2013-08-07 13:30 ` Adrian Hunter
  2013-08-07 13:30 ` [PATCH 3/3] perf tools: add 'keep tracking' test Adrian Hunter
  2013-08-13  2:28 ` [PATCH 0/3] perf: add a dummy software event to keep tracking Namhyung Kim
  3 siblings, 0 replies; 10+ messages in thread
From: Adrian Hunter @ 2013-08-07 13:30 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar
  Cc: Arnaldo Carvalho de Melo, linux-kernel, David Ahern,
	Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim,
	Paul Mackerras, Stephane Eranian

Add support for the new dummy software event
PERF_COUNT_SW_DUMMY.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
 tools/perf/util/parse-events.c | 4 ++++
 tools/perf/util/parse-events.l | 1 +
 tools/perf/util/python.c       | 1 +
 3 files changed, 6 insertions(+)

diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index dba877d..1ef81ea 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -108,6 +108,10 @@ static struct event_symbol event_symbols_sw[PERF_COUNT_SW_MAX] = {
 		.symbol = "emulation-faults",
 		.alias  = "",
 	},
+	[PERF_COUNT_SW_DUMMY] = {
+		.symbol = "dummy",
+		.alias  = "",
+	},
 };
 
 #define __PERF_EVENT_FIELD(config, name) \
diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l
index b36115f..29c5d24 100644
--- a/tools/perf/util/parse-events.l
+++ b/tools/perf/util/parse-events.l
@@ -144,6 +144,7 @@ context-switches|cs				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW
 cpu-migrations|migrations			{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS); }
 alignment-faults				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); }
 emulation-faults				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); }
+dummy						{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); }
 
 L1-dcache|l1-d|l1d|L1-data		|
 L1-icache|l1-i|l1i|L1-instruction	|
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
index 925e0c3..2fa83c0 100644
--- a/tools/perf/util/python.c
+++ b/tools/perf/util/python.c
@@ -967,6 +967,7 @@ static struct {
 	{ "COUNT_SW_PAGE_FAULTS_MAJ",  PERF_COUNT_SW_PAGE_FAULTS_MAJ },
 	{ "COUNT_SW_ALIGNMENT_FAULTS", PERF_COUNT_SW_ALIGNMENT_FAULTS },
 	{ "COUNT_SW_EMULATION_FAULTS", PERF_COUNT_SW_EMULATION_FAULTS },
+	{ "COUNT_SW_DUMMY",            PERF_COUNT_SW_DUMMY },
 
 	{ "SAMPLE_IP",	      PERF_SAMPLE_IP },
 	{ "SAMPLE_TID",	      PERF_SAMPLE_TID },
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/3] perf tools: add 'keep tracking' test
  2013-08-07 13:30 [PATCH 0/3] perf: add a dummy software event to keep tracking Adrian Hunter
  2013-08-07 13:30 ` [PATCH 1/3] " Adrian Hunter
  2013-08-07 13:30 ` [PATCH 2/3] perf tools: add support for PERF_COUNT_SW_DUMMY Adrian Hunter
@ 2013-08-07 13:30 ` Adrian Hunter
  2013-08-13  2:33   ` Namhyung Kim
  2013-08-13  2:28 ` [PATCH 0/3] perf: add a dummy software event to keep tracking Namhyung Kim
  3 siblings, 1 reply; 10+ messages in thread
From: Adrian Hunter @ 2013-08-07 13:30 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar
  Cc: Arnaldo Carvalho de Melo, linux-kernel, David Ahern,
	Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim,
	Paul Mackerras, Stephane Eranian

Add a test for the newly added PERF_COUNT_SW_DUMMY event.
The test checks that tracking events continue when an
event is disabled but a dummy software event is not
disabled.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
 tools/perf/Makefile              |   1 +
 tools/perf/tests/builtin-test.c  |   4 ++
 tools/perf/tests/keep-tracking.c | 150 +++++++++++++++++++++++++++++++++++++++
 tools/perf/tests/tests.h         |   1 +
 tools/perf/util/evlist.c         |  42 ++++++++++-
 tools/perf/util/evlist.h         |   5 ++
 6 files changed, 201 insertions(+), 2 deletions(-)
 create mode 100644 tools/perf/tests/keep-tracking.c

diff --git a/tools/perf/Makefile b/tools/perf/Makefile
index bfd12d0..0193e7c 100644
--- a/tools/perf/Makefile
+++ b/tools/perf/Makefile
@@ -392,6 +392,7 @@ LIB_OBJS += $(OUTPUT)tests/sw-clock.o
 ifeq ($(ARCH),x86)
 LIB_OBJS += $(OUTPUT)tests/perf-time-to-tsc.o
 endif
+LIB_OBJS += $(OUTPUT)tests/keep-tracking.o
 
 BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o
 BUILTIN_OBJS += $(OUTPUT)builtin-bench.o
diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index b7b4049..2a468a1 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -100,6 +100,10 @@ static struct test {
 	},
 #endif
 	{
+		.desc = "Test using a dummy software event to keep tracking",
+		.func = test__keep_tracking,
+	},
+	{
 		.func = NULL,
 	},
 };
diff --git a/tools/perf/tests/keep-tracking.c b/tools/perf/tests/keep-tracking.c
new file mode 100644
index 0000000..74abe00
--- /dev/null
+++ b/tools/perf/tests/keep-tracking.c
@@ -0,0 +1,150 @@
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/prctl.h>
+
+#include "parse-events.h"
+#include "evlist.h"
+#include "evsel.h"
+#include "thread_map.h"
+#include "cpumap.h"
+#include "tests.h"
+
+#define CHECK__(x) {				\
+	while ((x) < 0) {			\
+		pr_debug(#x " failed!\n");	\
+		goto out_err;			\
+	}					\
+}
+
+#define CHECK_NOT_NULL__(x) {			\
+	while ((x) == NULL) {			\
+		pr_debug(#x " failed!\n");	\
+		goto out_err;			\
+	}					\
+}
+
+static int find_comm(struct perf_evlist *evlist, const char *comm)
+{
+	union perf_event *event;
+	int i, found;
+
+	found = 0;
+	for (i = 0; i < evlist->nr_mmaps; i++) {
+		while ((event = perf_evlist__mmap_read(evlist, i)) != NULL) {
+			if (event->header.type == PERF_RECORD_COMM &&
+			    (pid_t)event->comm.pid == getpid() &&
+			    (pid_t)event->comm.tid == getpid() &&
+			    strcmp(event->comm.comm, comm) == 0)
+				found += 1;
+		}
+	}
+	return found;
+}
+
+/**
+ * test__keep_tracking - test using a dummy software event to keep tracking.
+ *
+ * This function implements a test that checks that tracking events continue
+ * when an event is disabled but a dummy software event is not disabled.  If the
+ * test passes %0 is returned, otherwise %-1 is returned.
+ */
+int test__keep_tracking(void)
+{
+	struct perf_record_opts opts = {
+		.mmap_pages	     = UINT_MAX,
+		.user_freq	     = UINT_MAX,
+		.user_interval	     = ULLONG_MAX,
+		.freq		     = 4000,
+		.target		     = {
+			.uses_mmap   = true,
+		},
+	};
+	struct thread_map *threads = NULL;
+	struct cpu_map *cpus = NULL;
+	struct perf_evlist *evlist = NULL;
+	struct perf_evsel *evsel = NULL;
+	int found, err = -1;
+	const char *comm;
+
+	threads = thread_map__new(-1, getpid(), UINT_MAX);
+	CHECK_NOT_NULL__(threads);
+
+	cpus = cpu_map__new(NULL);
+	CHECK_NOT_NULL__(cpus);
+
+	evlist = perf_evlist__new();
+	CHECK_NOT_NULL__(evlist);
+
+	perf_evlist__set_maps(evlist, cpus, threads);
+
+	CHECK__(parse_events(evlist, "dummy:u"));
+	CHECK__(parse_events(evlist, "cycles:u"));
+
+	perf_evlist__config(evlist, &opts);
+
+	evsel = perf_evlist__first(evlist);
+
+	evsel->attr.comm = 1;
+	evsel->attr.disabled = 1;
+	evsel->attr.enable_on_exec = 0;
+
+	CHECK__(perf_evlist__open(evlist));
+
+	CHECK__(perf_evlist__mmap(evlist, UINT_MAX, false));
+
+	/*
+	 * First, test that a 'comm' event can be found when the event is
+	 * enabled.
+	 */
+
+	perf_evlist__enable(evlist);
+
+	comm = "Test COMM 1";
+	CHECK__(prctl(PR_SET_NAME, (unsigned long)comm, 0, 0, 0));
+
+	perf_evlist__disable(evlist);
+
+	found = find_comm(evlist, comm);
+	if (found != 1) {
+		pr_debug("First time, failed to find tracking event.\n");
+		goto out_err;
+	}
+
+	/*
+	 * Secondly, test that a 'comm' event can be found when the event is
+	 * disabled with the dummy event still enabled.
+	 */
+
+	perf_evlist__enable(evlist);
+
+	evsel = perf_evlist__last(evlist);
+
+	CHECK__(perf_evlist__disable_event(evlist, evsel));
+
+	comm = "Test COMM 2";
+	CHECK__(prctl(PR_SET_NAME, (unsigned long)comm, 0, 0, 0));
+
+	perf_evlist__disable(evlist);
+
+	found = find_comm(evlist, comm);
+	if (found != 1) {
+		pr_debug("Seconf time, failed to find tracking event.\n");
+		goto out_err;
+	}
+
+	err = 0;
+
+out_err:
+	if (evlist) {
+		perf_evlist__disable(evlist);
+		perf_evlist__munmap(evlist);
+		perf_evlist__close(evlist);
+		perf_evlist__delete(evlist);
+	}
+	if (cpus)
+		cpu_map__delete(cpus);
+	if (threads)
+		thread_map__delete(threads);
+
+	return err;
+}
diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
index d22202a..3cf420c 100644
--- a/tools/perf/tests/tests.h
+++ b/tools/perf/tests/tests.h
@@ -36,5 +36,6 @@ int test__bp_signal_overflow(void);
 int test__task_exit(void);
 int test__sw_clock_freq(void);
 int test__perf_time_to_tsc(void);
+int test__keep_tracking(void);
 
 #endif /* TESTS_H */
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index da2dd92..c9b4ef3 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -232,7 +232,7 @@ void perf_evlist__disable(struct perf_evlist *evlist)
 
 	for (cpu = 0; cpu < nr_cpus; cpu++) {
 		list_for_each_entry(pos, &evlist->entries, node) {
-			if (!perf_evsel__is_group_leader(pos))
+			if (!perf_evsel__is_group_leader(pos) || !pos->fd)
 				continue;
 			for (thread = 0; thread < nr_threads; thread++)
 				ioctl(FD(pos, cpu, thread),
@@ -250,7 +250,7 @@ void perf_evlist__enable(struct perf_evlist *evlist)
 
 	for (cpu = 0; cpu < nr_cpus; cpu++) {
 		list_for_each_entry(pos, &evlist->entries, node) {
-			if (!perf_evsel__is_group_leader(pos))
+			if (!perf_evsel__is_group_leader(pos) || !pos->fd)
 				continue;
 			for (thread = 0; thread < nr_threads; thread++)
 				ioctl(FD(pos, cpu, thread),
@@ -259,6 +259,44 @@ void perf_evlist__enable(struct perf_evlist *evlist)
 	}
 }
 
+int perf_evlist__disable_event(struct perf_evlist *evlist,
+			       struct perf_evsel *evsel)
+{
+	int cpu, thread, err;
+
+	if (!evsel->fd)
+		return 0;
+
+	for (cpu = 0; cpu < evlist->cpus->nr; cpu++) {
+		for (thread = 0; thread < evlist->threads->nr; thread++) {
+			err = ioctl(FD(evsel, cpu, thread),
+				    PERF_EVENT_IOC_DISABLE, 0);
+			if (err)
+				return err;
+		}
+	}
+	return 0;
+}
+
+int perf_evlist__enable_event(struct perf_evlist *evlist,
+			      struct perf_evsel *evsel)
+{
+	int cpu, thread, err;
+
+	if (!evsel->fd)
+		return -EINVAL;
+
+	for (cpu = 0; cpu < evlist->cpus->nr; cpu++) {
+		for (thread = 0; thread < evlist->threads->nr; thread++) {
+			err = ioctl(FD(evsel, cpu, thread),
+				    PERF_EVENT_IOC_ENABLE, 0);
+			if (err)
+				return err;
+		}
+	}
+	return 0;
+}
+
 static int perf_evlist__alloc_pollfd(struct perf_evlist *evlist)
 {
 	int nr_cpus = cpu_map__nr(evlist->cpus);
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
index 327abab..825c90a 100644
--- a/tools/perf/util/evlist.h
+++ b/tools/perf/util/evlist.h
@@ -101,6 +101,11 @@ void perf_evlist__munmap(struct perf_evlist *evlist);
 void perf_evlist__disable(struct perf_evlist *evlist);
 void perf_evlist__enable(struct perf_evlist *evlist);
 
+int perf_evlist__disable_event(struct perf_evlist *evlist,
+			       struct perf_evsel *evsel);
+int perf_evlist__enable_event(struct perf_evlist *evlist,
+			      struct perf_evsel *evsel);
+
 void perf_evlist__set_selected(struct perf_evlist *evlist,
 			       struct perf_evsel *evsel);
 
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 0/3] perf: add a dummy software event to keep tracking
  2013-08-07 13:30 [PATCH 0/3] perf: add a dummy software event to keep tracking Adrian Hunter
                   ` (2 preceding siblings ...)
  2013-08-07 13:30 ` [PATCH 3/3] perf tools: add 'keep tracking' test Adrian Hunter
@ 2013-08-13  2:28 ` Namhyung Kim
  3 siblings, 0 replies; 10+ messages in thread
From: Namhyung Kim @ 2013-08-13  2:28 UTC (permalink / raw)
  To: Adrian Hunter
  Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	linux-kernel, David Ahern, Frederic Weisbecker, Jiri Olsa,
	Mike Galbraith, Paul Mackerras, Stephane Eranian

Hi Adrian,

On Wed,  7 Aug 2013 16:30:28 +0300, Adrian Hunter wrote:
> Hi
>
> This is an alternative to the 'keep tracking' flag patch
> which is here:
>
> 	http://marc.info/?l=linux-kernel&m=137242545521246&w=2
>
> perf tools is updated and a test added to demonstrate the
> new event.

It looks like a perfect fit for tracking fork/mmap events on
perf-ftrace. :)

Thanks,
Namhyung

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/3] perf tools: add 'keep tracking' test
  2013-08-07 13:30 ` [PATCH 3/3] perf tools: add 'keep tracking' test Adrian Hunter
@ 2013-08-13  2:33   ` Namhyung Kim
  2013-08-26 13:13     ` Adrian Hunter
  0 siblings, 1 reply; 10+ messages in thread
From: Namhyung Kim @ 2013-08-13  2:33 UTC (permalink / raw)
  To: Adrian Hunter
  Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	linux-kernel, David Ahern, Frederic Weisbecker, Jiri Olsa,
	Mike Galbraith, Paul Mackerras, Stephane Eranian

On Wed,  7 Aug 2013 16:30:31 +0300, Adrian Hunter wrote:
> Add a test for the newly added PERF_COUNT_SW_DUMMY event.
> The test checks that tracking events continue when an
> event is disabled but a dummy software event is not
> disabled.

[SNIP]

> +int test__keep_tracking(void)
> +{
> +	struct perf_record_opts opts = {
> +		.mmap_pages	     = UINT_MAX,
> +		.user_freq	     = UINT_MAX,
> +		.user_interval	     = ULLONG_MAX,
> +		.freq		     = 4000,
> +		.target		     = {
> +			.uses_mmap   = true,
> +		},
> +	};
> +	struct thread_map *threads = NULL;
> +	struct cpu_map *cpus = NULL;
> +	struct perf_evlist *evlist = NULL;
> +	struct perf_evsel *evsel = NULL;
> +	int found, err = -1;
> +	const char *comm;
> +
> +	threads = thread_map__new(-1, getpid(), UINT_MAX);
> +	CHECK_NOT_NULL__(threads);
> +
> +	cpus = cpu_map__new(NULL);
> +	CHECK_NOT_NULL__(cpus);
> +
> +	evlist = perf_evlist__new();
> +	CHECK_NOT_NULL__(evlist);
> +
> +	perf_evlist__set_maps(evlist, cpus, threads);
> +
> +	CHECK__(parse_events(evlist, "dummy:u"));
> +	CHECK__(parse_events(evlist, "cycles:u"));
> +
> +	perf_evlist__config(evlist, &opts);
> +
> +	evsel = perf_evlist__first(evlist);
> +
> +	evsel->attr.comm = 1;
> +	evsel->attr.disabled = 1;
> +	evsel->attr.enable_on_exec = 0;
> +
> +	CHECK__(perf_evlist__open(evlist));
> +
> +	CHECK__(perf_evlist__mmap(evlist, UINT_MAX, false));
> +
> +	/*
> +	 * First, test that a 'comm' event can be found when the event is
> +	 * enabled.
> +	 */
> +
> +	perf_evlist__enable(evlist);
> +
> +	comm = "Test COMM 1";
> +	CHECK__(prctl(PR_SET_NAME, (unsigned long)comm, 0, 0, 0));
> +
> +	perf_evlist__disable(evlist);
> +
> +	found = find_comm(evlist, comm);
> +	if (found != 1) {
> +		pr_debug("First time, failed to find tracking event.\n");
> +		goto out_err;
> +	}
> +
> +	/*
> +	 * Secondly, test that a 'comm' event can be found when the event is
> +	 * disabled with the dummy event still enabled.
> +	 */
> +
> +	perf_evlist__enable(evlist);
> +
> +	evsel = perf_evlist__last(evlist);
> +
> +	CHECK__(perf_evlist__disable_event(evlist, evsel));
> +
> +	comm = "Test COMM 2";
> +	CHECK__(prctl(PR_SET_NAME, (unsigned long)comm, 0, 0, 0));
> +
> +	perf_evlist__disable(evlist);
> +
> +	found = find_comm(evlist, comm);
> +	if (found != 1) {
> +		pr_debug("Seconf time, failed to find tracking event.\n");
> +		goto out_err;
> +	}
> +
> +	err = 0;
> +
> +out_err:
> +	if (evlist) {
> +		perf_evlist__disable(evlist);

It seems the both of goto out_err already called perf_evlist__disable().

Thanks,
Namhyung


> +		perf_evlist__munmap(evlist);
> +		perf_evlist__close(evlist);
> +		perf_evlist__delete(evlist);
> +	}
> +	if (cpus)
> +		cpu_map__delete(cpus);
> +	if (threads)
> +		thread_map__delete(threads);
> +
> +	return err;
> +}

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/3] perf tools: add 'keep tracking' test
  2013-08-13  2:33   ` Namhyung Kim
@ 2013-08-26 13:13     ` Adrian Hunter
  0 siblings, 0 replies; 10+ messages in thread
From: Adrian Hunter @ 2013-08-26 13:13 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	linux-kernel, David Ahern, Frederic Weisbecker, Jiri Olsa,
	Mike Galbraith, Paul Mackerras, Stephane Eranian

On 13/08/13 05:33, Namhyung Kim wrote:
> On Wed,  7 Aug 2013 16:30:31 +0300, Adrian Hunter wrote:
>> Add a test for the newly added PERF_COUNT_SW_DUMMY event.
>> The test checks that tracking events continue when an
>> event is disabled but a dummy software event is not
>> disabled.
> 
> [SNIP]
> 
>> +int test__keep_tracking(void)
>> +{
>> +	struct perf_record_opts opts = {
>> +		.mmap_pages	     = UINT_MAX,
>> +		.user_freq	     = UINT_MAX,
>> +		.user_interval	     = ULLONG_MAX,
>> +		.freq		     = 4000,
>> +		.target		     = {
>> +			.uses_mmap   = true,
>> +		},
>> +	};
>> +	struct thread_map *threads = NULL;
>> +	struct cpu_map *cpus = NULL;
>> +	struct perf_evlist *evlist = NULL;
>> +	struct perf_evsel *evsel = NULL;
>> +	int found, err = -1;
>> +	const char *comm;
>> +
>> +	threads = thread_map__new(-1, getpid(), UINT_MAX);
>> +	CHECK_NOT_NULL__(threads);
>> +
>> +	cpus = cpu_map__new(NULL);
>> +	CHECK_NOT_NULL__(cpus);
>> +
>> +	evlist = perf_evlist__new();
>> +	CHECK_NOT_NULL__(evlist);
>> +
>> +	perf_evlist__set_maps(evlist, cpus, threads);
>> +
>> +	CHECK__(parse_events(evlist, "dummy:u"));
>> +	CHECK__(parse_events(evlist, "cycles:u"));
>> +
>> +	perf_evlist__config(evlist, &opts);
>> +
>> +	evsel = perf_evlist__first(evlist);
>> +
>> +	evsel->attr.comm = 1;
>> +	evsel->attr.disabled = 1;
>> +	evsel->attr.enable_on_exec = 0;
>> +
>> +	CHECK__(perf_evlist__open(evlist));
>> +
>> +	CHECK__(perf_evlist__mmap(evlist, UINT_MAX, false));
>> +
>> +	/*
>> +	 * First, test that a 'comm' event can be found when the event is
>> +	 * enabled.
>> +	 */
>> +
>> +	perf_evlist__enable(evlist);
>> +
>> +	comm = "Test COMM 1";
>> +	CHECK__(prctl(PR_SET_NAME, (unsigned long)comm, 0, 0, 0));
>> +
>> +	perf_evlist__disable(evlist);
>> +
>> +	found = find_comm(evlist, comm);
>> +	if (found != 1) {
>> +		pr_debug("First time, failed to find tracking event.\n");
>> +		goto out_err;
>> +	}
>> +
>> +	/*
>> +	 * Secondly, test that a 'comm' event can be found when the event is
>> +	 * disabled with the dummy event still enabled.
>> +	 */
>> +
>> +	perf_evlist__enable(evlist);
>> +
>> +	evsel = perf_evlist__last(evlist);
>> +
>> +	CHECK__(perf_evlist__disable_event(evlist, evsel));
>> +
>> +	comm = "Test COMM 2";
>> +	CHECK__(prctl(PR_SET_NAME, (unsigned long)comm, 0, 0, 0));
>> +
>> +	perf_evlist__disable(evlist);
>> +
>> +	found = find_comm(evlist, comm);
>> +	if (found != 1) {
>> +		pr_debug("Seconf time, failed to find tracking event.\n");
>> +		goto out_err;
>> +	}
>> +
>> +	err = 0;
>> +
>> +out_err:
>> +	if (evlist) {
>> +		perf_evlist__disable(evlist);
> 
> It seems the both of goto out_err already called perf_evlist__disable().

There are more "goto out_err"s in the CHECK__ macro

> 
> Thanks,
> Namhyung
> 
> 
>> +		perf_evlist__munmap(evlist);
>> +		perf_evlist__close(evlist);
>> +		perf_evlist__delete(evlist);
>> +	}
>> +	if (cpus)
>> +		cpu_map__delete(cpus);
>> +	if (threads)
>> +		thread_map__delete(threads);
>> +
>> +	return err;
>> +}
> 
> 


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/3] perf: add a dummy software event to keep tracking
  2013-08-07 13:30 ` [PATCH 1/3] " Adrian Hunter
@ 2013-08-26 13:15   ` Adrian Hunter
  2013-08-26 13:53     ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 10+ messages in thread
From: Adrian Hunter @ 2013-08-26 13:15 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar
  Cc: Arnaldo Carvalho de Melo, linux-kernel, David Ahern,
	Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim,
	Paul Mackerras, Stephane Eranian

On 07/08/13 16:30, Adrian Hunter wrote:
> When an event is disabled the "tracking" events
> selected by the 'mmap', 'comm' and 'task' bits of
> struct perf_event_attr, are also disabled.  However,
> the information those events provide is necessary to
> resolve symbols for when the main event is re-enabled.
> 
> The "tracking" events can be kept enabled by putting
> them on another event, but that requires an event
> that otherwise does nothing.  A new software event
> PERF_COUNT_SW_DUMMY is added for that purpose.
> 
> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>

Any comments?

> ---
>  include/uapi/linux/perf_event.h | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h
> index 62c25a2..9e28422 100644
> --- a/include/uapi/linux/perf_event.h
> +++ b/include/uapi/linux/perf_event.h
> @@ -109,6 +109,7 @@ enum perf_sw_ids {
>  	PERF_COUNT_SW_PAGE_FAULTS_MAJ		= 6,
>  	PERF_COUNT_SW_ALIGNMENT_FAULTS		= 7,
>  	PERF_COUNT_SW_EMULATION_FAULTS		= 8,
> +	PERF_COUNT_SW_DUMMY			= 9,
>  
>  	PERF_COUNT_SW_MAX,			/* non-ABI */
>  };
> 


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/3] perf: add a dummy software event to keep tracking
  2013-08-26 13:15   ` Adrian Hunter
@ 2013-08-26 13:53     ` Arnaldo Carvalho de Melo
  2013-08-26 16:16       ` Peter Zijlstra
  0 siblings, 1 reply; 10+ messages in thread
From: Arnaldo Carvalho de Melo @ 2013-08-26 13:53 UTC (permalink / raw)
  To: Adrian Hunter
  Cc: Peter Zijlstra, Ingo Molnar, linux-kernel, David Ahern,
	Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim,
	Paul Mackerras, Stephane Eranian

Em Mon, Aug 26, 2013 at 04:15:34PM +0300, Adrian Hunter escreveu:
> On 07/08/13 16:30, Adrian Hunter wrote:
> > When an event is disabled the "tracking" events
> > selected by the 'mmap', 'comm' and 'task' bits of
> > struct perf_event_attr, are also disabled.  However,
> > the information those events provide is necessary to
> > resolve symbols for when the main event is re-enabled.
> > 
> > The "tracking" events can be kept enabled by putting
> > them on another event, but that requires an event
> > that otherwise does nothing.  A new software event
> > PERF_COUNT_SW_DUMMY is added for that purpose.
> > 
> > Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
> 
> Any comments?

Ok with me, Peter?

- Arnaldo
 
> > ---
> >  include/uapi/linux/perf_event.h | 1 +
> >  1 file changed, 1 insertion(+)
> > 
> > diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h
> > index 62c25a2..9e28422 100644
> > --- a/include/uapi/linux/perf_event.h
> > +++ b/include/uapi/linux/perf_event.h
> > @@ -109,6 +109,7 @@ enum perf_sw_ids {
> >  	PERF_COUNT_SW_PAGE_FAULTS_MAJ		= 6,
> >  	PERF_COUNT_SW_ALIGNMENT_FAULTS		= 7,
> >  	PERF_COUNT_SW_EMULATION_FAULTS		= 8,
> > +	PERF_COUNT_SW_DUMMY			= 9,
> >  
> >  	PERF_COUNT_SW_MAX,			/* non-ABI */
> >  };
> > 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/3] perf: add a dummy software event to keep tracking
  2013-08-26 13:53     ` Arnaldo Carvalho de Melo
@ 2013-08-26 16:16       ` Peter Zijlstra
  0 siblings, 0 replies; 10+ messages in thread
From: Peter Zijlstra @ 2013-08-26 16:16 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Adrian Hunter, Ingo Molnar, linux-kernel, David Ahern,
	Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim,
	Paul Mackerras, Stephane Eranian

On Mon, Aug 26, 2013 at 10:53:05AM -0300, Arnaldo Carvalho de Melo wrote:
> Em Mon, Aug 26, 2013 at 04:15:34PM +0300, Adrian Hunter escreveu:
> > On 07/08/13 16:30, Adrian Hunter wrote:
> > > When an event is disabled the "tracking" events
> > > selected by the 'mmap', 'comm' and 'task' bits of
> > > struct perf_event_attr, are also disabled.  However,
> > > the information those events provide is necessary to
> > > resolve symbols for when the main event is re-enabled.
> > > 
> > > The "tracking" events can be kept enabled by putting
> > > them on another event, but that requires an event
> > > that otherwise does nothing.  A new software event
> > > PERF_COUNT_SW_DUMMY is added for that purpose.
> > > 
> > > Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
> > 
> > Any comments?
> 
> Ok with me, Peter?

Yeah I suppose so.. I don't really like it and I've made a start at
looking at the problem twice now but never got anywhere, so sure lets go
with this.

Acked-by: Peter Zijlstra <peterz@infradead.org>

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2013-08-26 16:16 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-08-07 13:30 [PATCH 0/3] perf: add a dummy software event to keep tracking Adrian Hunter
2013-08-07 13:30 ` [PATCH 1/3] " Adrian Hunter
2013-08-26 13:15   ` Adrian Hunter
2013-08-26 13:53     ` Arnaldo Carvalho de Melo
2013-08-26 16:16       ` Peter Zijlstra
2013-08-07 13:30 ` [PATCH 2/3] perf tools: add support for PERF_COUNT_SW_DUMMY Adrian Hunter
2013-08-07 13:30 ` [PATCH 3/3] perf tools: add 'keep tracking' test Adrian Hunter
2013-08-13  2:33   ` Namhyung Kim
2013-08-26 13:13     ` Adrian Hunter
2013-08-13  2:28 ` [PATCH 0/3] perf: add a dummy software event to keep tracking Namhyung Kim

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).