[tip:perf/urgent] perf test: Add 'perf test BPF'

2015-11-07 Thread tip-bot for Wang Nan
Commit-ID:  ba1fae431e74bb427a699187434142fd3fe98390
Gitweb: http://git.kernel.org/tip/ba1fae431e74bb427a699187434142fd3fe98390
Author: Wang Nan 
AuthorDate: Fri, 6 Nov 2015 13:49:43 +
Committer:  Arnaldo Carvalho de Melo 
CommitDate: Fri, 6 Nov 2015 17:50:03 -0300

perf test: Add 'perf test BPF'

This patch adds BPF testcase for testing BPF event filtering.

By utilizing the result of 'perf test LLVM', this patch compiles the
eBPF sample program then test its ability. The BPF script in 'perf test
LLVM' lets only 50% samples generated by epoll_pwait() to be captured.
This patch runs that system call for 111 times, so the result should
contain 56 samples.

Signed-off-by: Wang Nan 
Tested-by: Arnaldo Carvalho de Melo 
Cc: Alexei Starovoitov 
Cc: Jiri Olsa 
Cc: Namhyung Kim 
Cc: Zefan Li 
Cc: pi3or...@163.com
Link: 
http://lkml.kernel.org/r/1446817783-86722-8-git-send-email-wangn...@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo 
---
 tools/perf/tests/Build  |   1 +
 tools/perf/tests/bpf.c  | 209 
 tools/perf/tests/builtin-test.c |   4 +
 tools/perf/tests/tests.h|   1 +
 tools/perf/util/bpf-loader.c|  24 -
 tools/perf/util/bpf-loader.h|  10 ++
 6 files changed, 248 insertions(+), 1 deletion(-)

diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
index a47b211..f41ebf8 100644
--- a/tools/perf/tests/Build
+++ b/tools/perf/tests/Build
@@ -32,6 +32,7 @@ perf-y += parse-no-sample-id-all.o
 perf-y += kmod-path.o
 perf-y += thread-map.o
 perf-y += llvm.o llvm-src-base.o llvm-src-kbuild.o
+perf-y += bpf.o
 perf-y += topology.o
 
 $(OUTPUT)tests/llvm-src-base.c: tests/bpf-script-example.c
diff --git a/tools/perf/tests/bpf.c b/tools/perf/tests/bpf.c
new file mode 100644
index 000..ec16f78
--- /dev/null
+++ b/tools/perf/tests/bpf.c
@@ -0,0 +1,209 @@
+#include 
+#include 
+#include 
+#include 
+#include "tests.h"
+#include "llvm.h"
+#include "debug.h"
+#define NR_ITERS   111
+
+#ifdef HAVE_LIBBPF_SUPPORT
+
+static int epoll_pwait_loop(void)
+{
+   int i;
+
+   /* Should fail NR_ITERS times */
+   for (i = 0; i < NR_ITERS; i++)
+   epoll_pwait(-(i + 1), NULL, 0, 0, NULL);
+   return 0;
+}
+
+static struct {
+   enum test_llvm__testcase prog_id;
+   const char *desc;
+   const char *name;
+   const char *msg_compile_fail;
+   const char *msg_load_fail;
+   int (*target_func)(void);
+   int expect_result;
+} bpf_testcase_table[] = {
+   {
+   LLVM_TESTCASE_BASE,
+   "Test basic BPF filtering",
+   "[basic_bpf_test]",
+   "fix 'perf test LLVM' first",
+   "load bpf object failed",
+   _pwait_loop,
+   (NR_ITERS + 1) / 2,
+   },
+};
+
+static int do_test(struct bpf_object *obj, int (*func)(void),
+  int expect)
+{
+   struct record_opts opts = {
+   .target = {
+   .uid = UINT_MAX,
+   .uses_mmap = true,
+   },
+   .freq = 0,
+   .mmap_pages   = 256,
+   .default_interval = 1,
+   };
+
+   char pid[16];
+   char sbuf[STRERR_BUFSIZE];
+   struct perf_evlist *evlist;
+   int i, ret = TEST_FAIL, err = 0, count = 0;
+
+   struct parse_events_evlist parse_evlist;
+   struct parse_events_error parse_error;
+
+   bzero(_error, sizeof(parse_error));
+   bzero(_evlist, sizeof(parse_evlist));
+   parse_evlist.error = _error;
+   INIT_LIST_HEAD(_evlist.list);
+
+   err = parse_events_load_bpf_obj(_evlist, _evlist.list, obj);
+   if (err || list_empty(_evlist.list)) {
+   pr_debug("Failed to add events selected by BPF\n");
+   if (!err)
+   return TEST_FAIL;
+   }
+
+   snprintf(pid, sizeof(pid), "%d", getpid());
+   pid[sizeof(pid) - 1] = '\0';
+   opts.target.tid = opts.target.pid = pid;
+
+   /* Instead of perf_evlist__new_default, don't add default events */
+   evlist = perf_evlist__new();
+   if (!evlist) {
+   pr_debug("No ehough memory to create evlist\n");
+   return TEST_FAIL;
+   }
+
+   err = perf_evlist__create_maps(evlist, );
+   if (err < 0) {
+   pr_debug("Not enough memory to create thread/cpu maps\n");
+   goto out_delete_evlist;
+   }
+
+   perf_evlist__splice_list_tail(evlist, _evlist.list);
+   evlist->nr_groups = parse_evlist.nr_groups;
+
+   perf_evlist__config(evlist, );
+
+   err = perf_evlist__open(evlist);
+   if (err < 0) {
+   pr_debug("perf_evlist__open: %s\n",
+strerror_r(errno, sbuf, sizeof(sbuf)));
+   goto out_delete_evlist;
+   }
+
+   err = perf_evlist__mmap(evlist, opts.mmap_pages, false);
+   if (err < 0) {
+   pr_debug("perf_evlist__mmap: %s\n",

[tip:perf/urgent] perf test: Add 'perf test BPF'

2015-11-07 Thread tip-bot for Wang Nan
Commit-ID:  ba1fae431e74bb427a699187434142fd3fe98390
Gitweb: http://git.kernel.org/tip/ba1fae431e74bb427a699187434142fd3fe98390
Author: Wang Nan 
AuthorDate: Fri, 6 Nov 2015 13:49:43 +
Committer:  Arnaldo Carvalho de Melo 
CommitDate: Fri, 6 Nov 2015 17:50:03 -0300

perf test: Add 'perf test BPF'

This patch adds BPF testcase for testing BPF event filtering.

By utilizing the result of 'perf test LLVM', this patch compiles the
eBPF sample program then test its ability. The BPF script in 'perf test
LLVM' lets only 50% samples generated by epoll_pwait() to be captured.
This patch runs that system call for 111 times, so the result should
contain 56 samples.

Signed-off-by: Wang Nan 
Tested-by: Arnaldo Carvalho de Melo 
Cc: Alexei Starovoitov 
Cc: Jiri Olsa 
Cc: Namhyung Kim 
Cc: Zefan Li 
Cc: pi3or...@163.com
Link: 
http://lkml.kernel.org/r/1446817783-86722-8-git-send-email-wangn...@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo 
---
 tools/perf/tests/Build  |   1 +
 tools/perf/tests/bpf.c  | 209 
 tools/perf/tests/builtin-test.c |   4 +
 tools/perf/tests/tests.h|   1 +
 tools/perf/util/bpf-loader.c|  24 -
 tools/perf/util/bpf-loader.h|  10 ++
 6 files changed, 248 insertions(+), 1 deletion(-)

diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
index a47b211..f41ebf8 100644
--- a/tools/perf/tests/Build
+++ b/tools/perf/tests/Build
@@ -32,6 +32,7 @@ perf-y += parse-no-sample-id-all.o
 perf-y += kmod-path.o
 perf-y += thread-map.o
 perf-y += llvm.o llvm-src-base.o llvm-src-kbuild.o
+perf-y += bpf.o
 perf-y += topology.o
 
 $(OUTPUT)tests/llvm-src-base.c: tests/bpf-script-example.c
diff --git a/tools/perf/tests/bpf.c b/tools/perf/tests/bpf.c
new file mode 100644
index 000..ec16f78
--- /dev/null
+++ b/tools/perf/tests/bpf.c
@@ -0,0 +1,209 @@
+#include 
+#include 
+#include 
+#include 
+#include "tests.h"
+#include "llvm.h"
+#include "debug.h"
+#define NR_ITERS   111
+
+#ifdef HAVE_LIBBPF_SUPPORT
+
+static int epoll_pwait_loop(void)
+{
+   int i;
+
+   /* Should fail NR_ITERS times */
+   for (i = 0; i < NR_ITERS; i++)
+   epoll_pwait(-(i + 1), NULL, 0, 0, NULL);
+   return 0;
+}
+
+static struct {
+   enum test_llvm__testcase prog_id;
+   const char *desc;
+   const char *name;
+   const char *msg_compile_fail;
+   const char *msg_load_fail;
+   int (*target_func)(void);
+   int expect_result;
+} bpf_testcase_table[] = {
+   {
+   LLVM_TESTCASE_BASE,
+   "Test basic BPF filtering",
+   "[basic_bpf_test]",
+   "fix 'perf test LLVM' first",
+   "load bpf object failed",
+   _pwait_loop,
+   (NR_ITERS + 1) / 2,
+   },
+};
+
+static int do_test(struct bpf_object *obj, int (*func)(void),
+  int expect)
+{
+   struct record_opts opts = {
+   .target = {
+   .uid = UINT_MAX,
+   .uses_mmap = true,
+   },
+   .freq = 0,
+   .mmap_pages   = 256,
+   .default_interval = 1,
+   };
+
+   char pid[16];
+   char sbuf[STRERR_BUFSIZE];
+   struct perf_evlist *evlist;
+   int i, ret = TEST_FAIL, err = 0, count = 0;
+
+   struct parse_events_evlist parse_evlist;
+   struct parse_events_error parse_error;
+
+   bzero(_error, sizeof(parse_error));
+   bzero(_evlist, sizeof(parse_evlist));
+   parse_evlist.error = _error;
+   INIT_LIST_HEAD(_evlist.list);
+
+   err = parse_events_load_bpf_obj(_evlist, _evlist.list, obj);
+   if (err || list_empty(_evlist.list)) {
+   pr_debug("Failed to add events selected by BPF\n");
+   if (!err)
+   return TEST_FAIL;
+   }
+
+   snprintf(pid, sizeof(pid), "%d", getpid());
+   pid[sizeof(pid) - 1] = '\0';
+   opts.target.tid = opts.target.pid = pid;
+
+   /* Instead of perf_evlist__new_default, don't add default events */
+   evlist = perf_evlist__new();
+   if (!evlist) {
+   pr_debug("No ehough memory to create evlist\n");
+   return TEST_FAIL;
+   }
+
+   err = perf_evlist__create_maps(evlist, );
+   if (err < 0) {
+   pr_debug("Not enough memory to create thread/cpu maps\n");
+   goto out_delete_evlist;
+   }
+
+   perf_evlist__splice_list_tail(evlist, _evlist.list);
+   evlist->nr_groups = parse_evlist.nr_groups;
+
+   perf_evlist__config(evlist, );
+
+   err = perf_evlist__open(evlist);
+   if (err < 0) {
+   pr_debug("perf_evlist__open: %s\n",
+strerror_r(errno, sbuf, sizeof(sbuf)));
+   goto