* [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
* 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
* [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 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 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
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