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