Re: [PATCHv2 03/25] perf tests: Add framework for automated perf_event_attr tests

2012-11-05 Thread Jiri Olsa
On Mon, Nov 05, 2012 at 11:29:11AM -0300, Arnaldo Carvalho de Melo wrote:
> Em Fri, Nov 02, 2012 at 11:40:52AM +0100, Jiri Olsa escreveu:
> > On Fri, Nov 02, 2012 at 11:18:56AM +0900, Namhyung Kim wrote:
> > > > +e = Event(section, parser_items, base_items)
> > > > +events[section] = e
> > > 
> > > And this too. :)
> > 
> > ok, will try ;)
> 
> Can you provide patches on top of what is in perf/core now?

ok, jirka
--
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: [PATCHv2 03/25] perf tests: Add framework for automated perf_event_attr tests

2012-11-05 Thread Arnaldo Carvalho de Melo
Em Fri, Nov 02, 2012 at 11:40:52AM +0100, Jiri Olsa escreveu:
> On Fri, Nov 02, 2012 at 11:18:56AM +0900, Namhyung Kim wrote:
> > > +e = Event(section, parser_items, base_items)
> > > +events[section] = e
> > 
> > And this too. :)
> 
> ok, will try ;)

Can you provide patches on top of what is in perf/core now?

- Arnaldo
--
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: [PATCHv2 03/25] perf tests: Add framework for automated perf_event_attr tests

2012-11-02 Thread Jiri Olsa
On Fri, Nov 02, 2012 at 11:18:56AM +0900, Namhyung Kim wrote:
> On Wed, 31 Oct 2012 15:52:47 +0100, Jiri Olsa wrote:
> > Adding automated test to check event's perf_event_attr values.
> > +#define WRITE_ASS(str, fmt, data)  \
> > +do {   
> > \
> > +   char buf[BUFSIZE];  \
> > +   size_t size;\
> > +   \
> > +   size = snprintf(buf, BUFSIZE, #str "=%"fmt "\n", data); \
> > +   if (1 != fwrite(buf, size, 1, file)) {  \
> > +   perror("test attr - failed to write event file");   \
> > +   fclose(file);   \
> > +   return -1;  \
> > +   }   \
> > +   \
> > +} while (0)
> 
> What is ASS?

short for assignment

> 
> > +
> > +static int store_event(struct perf_event_attr *attr, pid_t pid, int cpu,
> > +  int fd, int group_fd, unsigned long flags)
> > +{
> > +   FILE *file;
> > +   char path[PATH_MAX];
> > +

SNIP

> > +   WRITE_ASS(sample_regs_user,   "llu", attr->sample_regs_user);
> > +   WRITE_ASS(sample_stack_user,  PRIu32, attr->sample_stack_user);
> > +   WRITE_ASS(optional, "d", 0);
> 
> How about rename current WRITE_ASS to __WRITE_ASS and create a wrapper
> WRITE_ASS like this:
> 
>   #define WRITE_ASS(field, fmt)  __WRITE_ASS(field, fmt, attr->field)
> 
> and use __WRITE_ASS for 'optional'.

looks ok

> 
> > +
> > +   fclose(file);
> > +   return 0;
> > +}
> [snip]
> > +def compare_data(self, a, b):
> > +a_list = a.split('|')
> > +b_list = b.split('|')
> > +
> > +for a_item in a_list:
> > +for b_item in b_list:
> > +if (a_item == b_item):
> > +return True
> > +elif (a_item == '*') or (b_item == '*'):
> > +return True
> > +
> > +return False
> 
> I think it needs some comments about how it works.
> 
> > +
> [snip]
> > +def load_events(self, path, events):
> > +parser_event = ConfigParser.SafeConfigParser()
> > +parser_event.read(path)
> > +
> > +for section in filter(self.is_event, parser_event.sections()):
> > +
> > +parser_items = parser_event.items(section);
> > +base_items   = {}
> > +
> > +if (':' in section):
> > +base = section[section.index(':') + 1:]
> > +parser_base = ConfigParser.SafeConfigParser()
> > +parser_base.read(self.test_dir + '/' + base)
> > +base_items = parser_base.items('event')
> > +
> > +e = Event(section, parser_items, base_items)
> > +events[section] = e
> 
> And this too. :)

ok, will try ;)

thanks,
jirka
--
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: [PATCHv2 03/25] perf tests: Add framework for automated perf_event_attr tests

2012-11-01 Thread Namhyung Kim
On Wed, 31 Oct 2012 15:52:47 +0100, Jiri Olsa wrote:
> Adding automated test to check event's perf_event_attr values.
>
> The idea is run perf session with kidnapping sys_perf_event_open
> function. For each sys_perf_event_open call we store the
> perf_event_attr data to the file to be checked later against what
> we expect.
>
> You can run this by:
>   $ python ./tests/attr.py -d ./tests/attr/ -p ./perf -v
>
> v2 changes:
>   - preserve errno value in the hook
>
> Signed-off-by: Jiri Olsa 
> Cc: Arnaldo Carvalho de Melo 
> Cc: Peter Zijlstra 
> Cc: Ingo Molnar 
> Cc: Paul Mackerras 
> Cc: Corey Ashford 
> Cc: Frederic Weisbecker 
> ---
>  tools/perf/Makefile  |   1 +
>  tools/perf/perf.c|   2 +
>  tools/perf/perf.h|  16 ++-
>  tools/perf/tests/attr.c  | 140 +
>  tools/perf/tests/attr.py | 313 
> +++
>  5 files changed, 470 insertions(+), 2 deletions(-)
>  create mode 100644 tools/perf/tests/attr.c
>  create mode 100644 tools/perf/tests/attr.py
>
> diff --git a/tools/perf/Makefile b/tools/perf/Makefile
> index 2d3427f..1da87a3 100644
> --- a/tools/perf/Makefile
> +++ b/tools/perf/Makefile
> @@ -430,6 +430,7 @@ LIB_OBJS += $(OUTPUT)arch/common.o
>  
>  LIB_OBJS += $(OUTPUT)tests/parse-events.o
>  LIB_OBJS += $(OUTPUT)tests/dso-data.o
> +LIB_OBJS += $(OUTPUT)tests/attr.o

It'd better if it has more specific name like 'event-attr' but it'd not
a big deal so no strong objection. :)

>  
>  BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o
>  BUILTIN_OBJS += $(OUTPUT)builtin-bench.o
[snip]
> +#define WRITE_ASS(str, fmt, data)\
> +do { \
> + char buf[BUFSIZE];  \
> + size_t size;\
> + \
> + size = snprintf(buf, BUFSIZE, #str "=%"fmt "\n", data); \
> + if (1 != fwrite(buf, size, 1, file)) {  \
> + perror("test attr - failed to write event file");   \
> + fclose(file);   \
> + return -1;  \
> + }   \
> + \
> +} while (0)

What is ASS?

> +
> +static int store_event(struct perf_event_attr *attr, pid_t pid, int cpu,
> +int fd, int group_fd, unsigned long flags)
> +{
> + FILE *file;
> + char path[PATH_MAX];
> +
> + snprintf(path, PATH_MAX, "%s/event-%d-%llu-%d", dir,
> +  attr->type, attr->config, fd);
> +
> + file = fopen(path, "w+");
> + if (!file) {
> + perror("test attr - failed to open event file");
> + return -1;
> + }
> +
> + if (fprintf(file, "[event-%d-%llu-%d]\n",
> + attr->type, attr->config, fd) < 0) {
> + perror("test attr - failed to write event file");
> + fclose(file);
> + return -1;
> + }
> +
> + /* syscall arguments */
> + WRITE_ASS(fd,   "d", fd);
> + WRITE_ASS(group_fd, "d", group_fd);
> + WRITE_ASS(cpu,  "d", cpu);
> + WRITE_ASS(pid,  "d", pid);
> + WRITE_ASS(flags,   "lu", flags);
> +
> + /* struct perf_event_attr */
> + WRITE_ASS(type,   PRIu32,  attr->type);
> + WRITE_ASS(size,   PRIu32,  attr->size);
> + WRITE_ASS(config,  "llu",  attr->config);
> + WRITE_ASS(sample_period, "llu", attr->sample_period);
> + WRITE_ASS(sample_type,   "llu", attr->sample_type);
> + WRITE_ASS(read_format,   "llu", attr->read_format);
> + WRITE_ASS(disabled,   "d", attr->disabled);
> + WRITE_ASS(inherit,"d", attr->inherit);
> + WRITE_ASS(pinned, "d", attr->pinned);
> + WRITE_ASS(exclusive,  "d", attr->exclusive);
> + WRITE_ASS(exclude_user,   "d", attr->exclude_user);
> + WRITE_ASS(exclude_kernel, "d", attr->exclude_kernel);
> + WRITE_ASS(exclude_hv, "d", attr->exclude_hv);
> + WRITE_ASS(exclude_idle,   "d", attr->exclude_idle);
> + WRITE_ASS(mmap,   "d", attr->mmap);
> + WRITE_ASS(comm,   "d", attr->comm);
> + WRITE_ASS(freq,   "d", attr->freq);
> + WRITE_ASS(inherit_stat,   "d", attr->inherit_stat);
> + WRITE_ASS(enable_on_exec, "d", attr->enable_on_exec);
> + WRITE_ASS(task,   "d", attr->task);
> + WRITE_ASS(watermask,  "d", attr->watermark);
> + WRITE_ASS(precise_ip, "d", attr->precise_ip);
> + WRITE_ASS(mmap_data,  "d", attr->mmap_data);
> + WRITE_ASS(sample_id_all,  "d", attr->sample_id_all);
> + WRITE_ASS(exclude_host,   "d", attr->exclude_host);
> + WRITE_ASS(exclude_guest,  "d", attr->exclude_guest);
> + WRITE_ASS(exclu

[PATCHv2 03/25] perf tests: Add framework for automated perf_event_attr tests

2012-10-31 Thread Jiri Olsa
On Wed, Oct 31, 2012 at 07:26:00AM -0700, Arnaldo Carvalho de Melo wrote:
> Em Wed, Oct 31, 2012 at 12:01:20AM +0100, Jiri Olsa escreveu:
> > On Tue, Oct 30, 2012 at 11:01:44PM +0100, Jiri Olsa wrote:
> > > Adding automated test to check event's perf_event_attr values.
> > 
> > SNIP
> > 
> > > +
> > > +void test_attr__open(struct perf_event_attr *attr, pid_t pid, int cpu,
> > > +  int fd, int group_fd, unsigned long flags)
> > > +{
> > > + if (store_event(attr, pid, cpu, fd, group_fd, flags))
> > > + die("test attr FAILED");
> > > +}
> > 
> > ahh crap, I forgot the errno value preservation fix.. 
> > 
> > I'd send it later with another fix I have for perf stat or v2 if needed ;-)
> 
> Send just a v2 for this specific patch.

attached, might cause some hunks moving a little in 
  perf tests: Add attr tests under builtin test command

but should be no problem..

whole v2 patchset available here:
git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/linux.git
perf/test5

thanks,
jirka


---
Adding automated test to check event's perf_event_attr values.

The idea is run perf session with kidnapping sys_perf_event_open
function. For each sys_perf_event_open call we store the
perf_event_attr data to the file to be checked later against what
we expect.

You can run this by:
  $ python ./tests/attr.py -d ./tests/attr/ -p ./perf -v

v2 changes:
  - preserve errno value in the hook

Signed-off-by: Jiri Olsa 
Cc: Arnaldo Carvalho de Melo 
Cc: Peter Zijlstra 
Cc: Ingo Molnar 
Cc: Paul Mackerras 
Cc: Corey Ashford 
Cc: Frederic Weisbecker 
---
 tools/perf/Makefile  |   1 +
 tools/perf/perf.c|   2 +
 tools/perf/perf.h|  16 ++-
 tools/perf/tests/attr.c  | 140 +
 tools/perf/tests/attr.py | 313 +++
 5 files changed, 470 insertions(+), 2 deletions(-)
 create mode 100644 tools/perf/tests/attr.c
 create mode 100644 tools/perf/tests/attr.py

diff --git a/tools/perf/Makefile b/tools/perf/Makefile
index 2d3427f..1da87a3 100644
--- a/tools/perf/Makefile
+++ b/tools/perf/Makefile
@@ -430,6 +430,7 @@ LIB_OBJS += $(OUTPUT)arch/common.o
 
 LIB_OBJS += $(OUTPUT)tests/parse-events.o
 LIB_OBJS += $(OUTPUT)tests/dso-data.o
+LIB_OBJS += $(OUTPUT)tests/attr.o
 
 BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o
 BUILTIN_OBJS += $(OUTPUT)builtin-bench.o
diff --git a/tools/perf/perf.c b/tools/perf/perf.c
index e968373..a0ae290 100644
--- a/tools/perf/perf.c
+++ b/tools/perf/perf.c
@@ -484,6 +484,8 @@ int main(int argc, const char **argv)
}
cmd = argv[0];
 
+   test_attr__init();
+
/*
 * We use PATH to find perf commands, but we prepend some higher
 * precedence paths: the "--exec-path" option, the PERF_EXEC_PATH
diff --git a/tools/perf/perf.h b/tools/perf/perf.h
index 469fbf2..0047264 100644
--- a/tools/perf/perf.h
+++ b/tools/perf/perf.h
@@ -174,13 +174,25 @@ static inline unsigned long long rdclock(void)
(void) (&_min1 == &_min2);  \
_min1 < _min2 ? _min1 : _min2; })
 
+extern bool test_attr__enabled;
+void test_attr__init(void);
+void test_attr__open(struct perf_event_attr *attr, pid_t pid, int cpu,
+int fd, int group_fd, unsigned long flags);
+
 static inline int
 sys_perf_event_open(struct perf_event_attr *attr,
  pid_t pid, int cpu, int group_fd,
  unsigned long flags)
 {
-   return syscall(__NR_perf_event_open, attr, pid, cpu,
-  group_fd, flags);
+   int fd;
+
+   fd = syscall(__NR_perf_event_open, attr, pid, cpu,
+group_fd, flags);
+
+   if (unlikely(test_attr__enabled))
+   test_attr__open(attr, pid, cpu, fd, group_fd, flags);
+
+   return fd;
 }
 
 #define MAX_COUNTERS   256
diff --git a/tools/perf/tests/attr.c b/tools/perf/tests/attr.c
new file mode 100644
index 000..55e9a87
--- /dev/null
+++ b/tools/perf/tests/attr.c
@@ -0,0 +1,140 @@
+
+/*
+ * The struct perf_event_attr test support.
+ *
+ * This test is embedded inside into perf directly and is governed
+ * by the PERF_TEST_ATTR environment variable and hook inside
+ * sys_perf_event_open function.
+ *
+ * The general idea is to store 'struct perf_event_attr' details for
+ * each event created within single perf command. Each event details
+ * are stored into separate text file. Once perf command is finished
+ * these files can be checked for values we expect for command.
+ *
+ * Besides 'struct perf_event_attr' values we also store 'fd' and
+ * 'group_fd' values to allow checking for groups created.
+ *
+ * This all is triggered by setting PERF_TEST_ATTR environment variable.
+ * It must contain name of existing directory with access and write
+ * permissions. All the event text files are stored there.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include "../perf.h"
+#include "util.h"
+
+#define ENV "PERF_TEST_ATTR"
+
+bool test_attr__enabled;