Re: [PATCH 3/3] perf tools: add 'keep tracking' test

2013-08-26 Thread Adrian Hunter
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;
>> +}
> 
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 3/3] perf tools: add 'keep tracking' test

2013-08-12 Thread Namhyung Kim
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;
> +}
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 3/3] perf tools: add 'keep tracking' test

2013-08-07 Thread Adrian Hunter
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 
---
 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 000..74abe00
--- /dev/null
+++ b/tools/perf/tests/keep-tracking.c
@@ -0,0 +1,150 @@
+#include 
+#include 
+#include 
+
+#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