mirror of
https://github.com/torvalds/linux.git
synced 2026-04-27 11:02:31 -04:00
perf test: Add libbpf pinning test
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>
This commit is contained in:
committed by
Arnaldo Carvalho de Melo
parent
71dc4c3068
commit
a26305363d
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user