]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
perf test: Add libbpf pinning test
authorJoe Stringer <joe@ovn.org>
Thu, 26 Jan 2017 21:20:01 +0000 (13:20 -0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 31 Jan 2017 19:20:08 +0000 (16:20 -0300)
Add a test for the newly added BPF object pinning functionality.

For example:

  # tools/perf/perf test 37
    37: BPF filter                                 :
    37.1: Basic BPF filtering                      : Ok
    37.2: BPF pinning                              : Ok
    37.3: BPF prologue generation                  : Ok
    37.4: BPF relocation checker                   : Ok

  # tools/perf/perf test 37 -v 2>&1 | grep pinned
    libbpf: pinned map '/sys/fs/bpf/perf_test/flip_table'
    libbpf: pinned program '/sys/fs/bpf/perf_test/func=SyS_epoll_wait/0'

Signed-off-by: Joe Stringer <joe@ovn.org>
Requested-and-Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexei Starovoitov <ast@fb.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: netdev@vger.kernel.org
Link: http://lkml.kernel.org/r/20170126212001.14103-7-joe@ovn.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/tests/bpf.c

index 92343f43e44aa660e5ee1e37c2d721aabafc5fcf..1a04fe77487dc54512b3764f8a89961364c9ad45 100644 (file)
@@ -5,11 +5,13 @@
 #include <util/evlist.h>
 #include <linux/bpf.h>
 #include <linux/filter.h>
+#include <api/fs/fs.h>
 #include <bpf/bpf.h>
 #include "tests.h"
 #include "llvm.h"
 #include "debug.h"
 #define NR_ITERS       111
+#define PERF_TEST_BPF_PATH "/sys/fs/bpf/perf_test"
 
 #ifdef HAVE_LIBBPF_SUPPORT
 
@@ -54,6 +56,7 @@ static struct {
        const char *msg_load_fail;
        int (*target_func)(void);
        int expect_result;
+       bool    pin;
 } bpf_testcase_table[] = {
        {
                LLVM_TESTCASE_BASE,
@@ -63,6 +66,17 @@ static struct {
                "load bpf object failed",
                &epoll_wait_loop,
                (NR_ITERS + 1) / 2,
+               false,
+       },
+       {
+               LLVM_TESTCASE_BASE,
+               "BPF pinning",
+               "[bpf_pinning]",
+               "fix kbuild first",
+               "check your vmlinux setting?",
+               &epoll_wait_loop,
+               (NR_ITERS + 1) / 2,
+               true,
        },
 #ifdef HAVE_BPF_PROLOGUE
        {
@@ -73,6 +87,7 @@ static struct {
                "check your vmlinux setting?",
                &llseek_loop,
                (NR_ITERS + 1) / 4,
+               false,
        },
 #endif
        {
@@ -83,6 +98,7 @@ static struct {
                "libbpf error when dealing with relocation",
                NULL,
                0,
+               false,
        },
 };
 
@@ -226,10 +242,34 @@ static int __test__bpf(int idx)
                goto out;
        }
 
-       if (obj)
+       if (obj) {
                ret = do_test(obj,
                              bpf_testcase_table[idx].target_func,
                              bpf_testcase_table[idx].expect_result);
+               if (ret != TEST_OK)
+                       goto out;
+               if (bpf_testcase_table[idx].pin) {
+                       int err;
+
+                       if (!bpf_fs__mount()) {
+                               pr_debug("BPF filesystem not mounted\n");
+                               ret = TEST_FAIL;
+                               goto out;
+                       }
+                       err = mkdir(PERF_TEST_BPF_PATH, 0777);
+                       if (err && errno != EEXIST) {
+                               pr_debug("Failed to make perf_test dir: %s\n",
+                                        strerror(errno));
+                               ret = TEST_FAIL;
+                               goto out;
+                       }
+                       if (bpf_object__pin(obj, PERF_TEST_BPF_PATH))
+                               ret = TEST_FAIL;
+                       if (rm_rf(PERF_TEST_BPF_PATH))
+                               ret = TEST_FAIL;
+               }
+       }
+
 out:
        bpf__clear();
        return ret;