Re: [PATCH 18/31] perf test: Add 'perf test BPF'

2015-09-05 Thread Wang Nan



On 09/02/2015 08:45 PM, Namhyung Kim wrote:

On Sat, Aug 29, 2015 at 04:21:52AM +, Wang Nan wrote:

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 it ability. The BPF script in 'perf test
LLVM' collects half of execution of epoll_pwait(). This patch runs 111
times of it, so the resule should contains 56 samples.

Signed-off-by: Wang Nan 
Cc: Arnaldo Carvalho de Melo 
Cc: Alexei Starovoitov 
Cc: Brendan Gregg 
Cc: Daniel Borkmann 
Cc: David Ahern 
Cc: He Kuang 
Cc: Jiri Olsa 
Cc: Kaixu Xia 
Cc: Masami Hiramatsu 
Cc: Namhyung Kim 
Cc: Peter Zijlstra 
Cc: Zefan Li 
Cc: pi3or...@163.com
Link: 
http://lkml.kernel.org/n/1440151770-129878-16-git-send-email-wangn...@huawei.com
---


[SNIP]


+static int prepare_bpf(void *obj_buf, size_t obj_buf_sz)
+{
+   int err;
+   char errbuf[BUFSIZ];
+
+   err = bpf__prepare_load_buffer(obj_buf, obj_buf_sz, NULL);
+   if (err) {
+   bpf__strerror_prepare_load("[buffer]", false, err, errbuf,
+  sizeof(errbuf));
+   fprintf(stderr, " (%s)", errbuf);
+   return TEST_FAIL;
+   }
+
+   err = bpf__probe();
+   if (err) {
+   bpf__strerror_load(err, errbuf, sizeof(errbuf));
+   fprintf(stderr, " (%s)", errbuf);
+   if (getuid() != 0)


geteuid() ?

Thanks,
Namhyung



Already changed.

Thank you.




+   fprintf(stderr, " (try run as root)");
+   return TEST_FAIL;
+   }
+
+   err = bpf__load();
+   if (err) {
+   bpf__strerror_load(err, errbuf, sizeof(errbuf));
+   fprintf(stderr, " (%s)", errbuf);
+   return TEST_FAIL;
+   }
+
+   return 0;
+}


--
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 18/31] perf test: Add 'perf test BPF'

2015-09-02 Thread Namhyung Kim
On Sat, Aug 29, 2015 at 04:21:52AM +, Wang Nan wrote:
> 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 it ability. The BPF script in 'perf test
> LLVM' collects half of execution of epoll_pwait(). This patch runs 111
> times of it, so the resule should contains 56 samples.
> 
> Signed-off-by: Wang Nan 
> Cc: Arnaldo Carvalho de Melo 
> Cc: Alexei Starovoitov 
> Cc: Brendan Gregg 
> Cc: Daniel Borkmann 
> Cc: David Ahern 
> Cc: He Kuang 
> Cc: Jiri Olsa 
> Cc: Kaixu Xia 
> Cc: Masami Hiramatsu 
> Cc: Namhyung Kim 
> Cc: Peter Zijlstra 
> Cc: Zefan Li 
> Cc: pi3or...@163.com
> Link: 
> http://lkml.kernel.org/n/1440151770-129878-16-git-send-email-wangn...@huawei.com
> ---

[SNIP]

> +static int prepare_bpf(void *obj_buf, size_t obj_buf_sz)
> +{
> + int err;
> + char errbuf[BUFSIZ];
> +
> + err = bpf__prepare_load_buffer(obj_buf, obj_buf_sz, NULL);
> + if (err) {
> + bpf__strerror_prepare_load("[buffer]", false, err, errbuf,
> +sizeof(errbuf));
> + fprintf(stderr, " (%s)", errbuf);
> + return TEST_FAIL;
> + }
> +
> + err = bpf__probe();
> + if (err) {
> + bpf__strerror_load(err, errbuf, sizeof(errbuf));
> + fprintf(stderr, " (%s)", errbuf);
> + if (getuid() != 0)

geteuid() ?

Thanks,
Namhyung


> + fprintf(stderr, " (try run as root)");
> + return TEST_FAIL;
> + }
> +
> + err = bpf__load();
> + if (err) {
> + bpf__strerror_load(err, errbuf, sizeof(errbuf));
> + fprintf(stderr, " (%s)", errbuf);
> + return TEST_FAIL;
> + }
> +
> + return 0;
> +}
--
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 18/31] perf test: Add 'perf test BPF'

2015-08-28 Thread Wang Nan
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 it ability. The BPF script in 'perf test
LLVM' collects half of execution of epoll_pwait(). This patch runs 111
times of it, so the resule should contains 56 samples.

Signed-off-by: Wang Nan 
Cc: Arnaldo Carvalho de Melo 
Cc: Alexei Starovoitov 
Cc: Brendan Gregg 
Cc: Daniel Borkmann 
Cc: David Ahern 
Cc: He Kuang 
Cc: Jiri Olsa 
Cc: Kaixu Xia 
Cc: Masami Hiramatsu 
Cc: Namhyung Kim 
Cc: Peter Zijlstra 
Cc: Zefan Li 
Cc: pi3or...@163.com
Link: 
http://lkml.kernel.org/n/1440151770-129878-16-git-send-email-wangn...@huawei.com
---
 tools/perf/tests/Build  |   1 +
 tools/perf/tests/bpf.c  | 170 
 tools/perf/tests/builtin-test.c |   4 +
 tools/perf/tests/llvm.c |  19 +
 tools/perf/tests/llvm.h |   1 +
 tools/perf/tests/tests.h|   1 +
 tools/perf/util/bpf-loader.c|  14 
 tools/perf/util/bpf-loader.h|   8 ++
 8 files changed, 218 insertions(+)
 create mode 100644 tools/perf/tests/bpf.c

diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
index 8c98409..7ceb448 100644
--- a/tools/perf/tests/Build
+++ b/tools/perf/tests/Build
@@ -33,6 +33,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.o
+perf-y += bpf.o
 
 $(OUTPUT)tests/llvm-src.c: tests/bpf-script-example.c
$(Q)echo '#include ' > $@
diff --git a/tools/perf/tests/bpf.c b/tools/perf/tests/bpf.c
new file mode 100644
index 000..6c238ca
--- /dev/null
+++ b/tools/perf/tests/bpf.c
@@ -0,0 +1,170 @@
+#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 int prepare_bpf(void *obj_buf, size_t obj_buf_sz)
+{
+   int err;
+   char errbuf[BUFSIZ];
+
+   err = bpf__prepare_load_buffer(obj_buf, obj_buf_sz, NULL);
+   if (err) {
+   bpf__strerror_prepare_load("[buffer]", false, err, errbuf,
+  sizeof(errbuf));
+   fprintf(stderr, " (%s)", errbuf);
+   return TEST_FAIL;
+   }
+
+   err = bpf__probe();
+   if (err) {
+   bpf__strerror_load(err, errbuf, sizeof(errbuf));
+   fprintf(stderr, " (%s)", errbuf);
+   if (getuid() != 0)
+   fprintf(stderr, " (try run as root)");
+   return TEST_FAIL;
+   }
+
+   err = bpf__load();
+   if (err) {
+   bpf__strerror_load(err, errbuf, sizeof(errbuf));
+   fprintf(stderr, " (%s)", errbuf);
+   return TEST_FAIL;
+   }
+
+   return 0;
+}
+
+static int do_test(void)
+{
+   struct record_opts opts = {
+   .target = {
+   .uid = UINT_MAX,
+   .uses_mmap = true,
+   },
+   .freq = 0,
+   .mmap_pages   = 256,
+   .default_interval = 1,
+   };
+
+   int err, i, count = 0;
+   char pid[16];
+   char sbuf[STRERR_BUFSIZE];
+   struct perf_evlist *evlist;
+
+   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 -ENOMEM;
+   }
+
+   err = perf_evlist__create_maps(evlist, &opts.target);
+   if (err < 0) {
+   pr_debug("Not enough memory to create thread/cpu maps\n");
+   goto out_delete_evlist;
+   }
+
+   err = perf_evlist__add_bpf(evlist);
+   if (err) {
+   fprintf(stderr, " (Failed to add events selected by BPF)");
+   goto out_delete_evlist;
+   }
+
+   perf_evlist__config(evlist, &opts);
+
+   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",
+strerror_r(errno, sbuf, sizeof(sbuf)));
+   goto out_delete_evlist;
+   }
+
+   perf_evlist__enable(evlist);
+   epoll_pwait_loop();
+   perf_evlist__disable(evlist);
+
+   for (i = 0; i < evlist->nr_mmaps; i++) {
+   union perf_even