提交 f1dc7899 编写于 作者: A Andrii Nakryiko 提交者: Zheng Zengkai

selftests/bpf: Switch fexit_bpf2bpf selftest to set_attach_target() API

mainline inclusion
from mainline-5.16-rc1
commit 60aed220
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I5EUVD
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=60aed22076b0d0ec2b7c7f9dba3ccd642520e1f3

------------------------------------------------

Switch fexit_bpf2bpf selftest to bpf_program__set_attach_target()
instead of using bpf_object_open_opts.attach_prog_fd, which is going to
be deprecated. These changes also demonstrate the new mode of
set_attach_target() in which it allows NULL when the target is BPF
program (attach_prog_fd != 0).
Signed-off-by: NAndrii Nakryiko <andrii@kernel.org>
Signed-off-by: NAlexei Starovoitov <ast@kernel.org>
Acked-by: NYonghong Song <yhs@fb.com>
Link: https://lore.kernel.org/bpf/20210916015836.1248906-6-andrii@kernel.org
(cherry picked from commit 60aed220)
Signed-off-by: NWang Yufen <wangyufen@huawei.com>

Conflicts:
	tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c
Signed-off-by: NWang Yufen <wangyufen@huawei.com>
上级 1584c514
...@@ -58,7 +58,7 @@ static void test_fexit_bpf2bpf_common(const char *obj_file, ...@@ -58,7 +58,7 @@ static void test_fexit_bpf2bpf_common(const char *obj_file,
test_cb cb) test_cb cb)
{ {
struct bpf_object *obj = NULL, *tgt_obj; struct bpf_object *obj = NULL, *tgt_obj;
struct bpf_program **prog = NULL; struct bpf_program **prog = NULL, *p;
struct bpf_link **link = NULL; struct bpf_link **link = NULL;
__u32 duration = 0, retval; __u32 duration = 0, retval;
int err, tgt_fd, i; int err, tgt_fd, i;
...@@ -68,21 +68,23 @@ static void test_fexit_bpf2bpf_common(const char *obj_file, ...@@ -68,21 +68,23 @@ static void test_fexit_bpf2bpf_common(const char *obj_file,
if (CHECK(err, "tgt_prog_load", "file %s err %d errno %d\n", if (CHECK(err, "tgt_prog_load", "file %s err %d errno %d\n",
target_obj_file, err, errno)) target_obj_file, err, errno))
return; return;
DECLARE_LIBBPF_OPTS(bpf_object_open_opts, opts,
.attach_prog_fd = tgt_fd,
);
link = calloc(sizeof(struct bpf_link *), prog_cnt); link = calloc(sizeof(struct bpf_link *), prog_cnt);
prog = calloc(sizeof(struct bpf_program *), prog_cnt); prog = calloc(sizeof(struct bpf_program *), prog_cnt);
if (CHECK(!link || !prog, "alloc_memory", "failed to alloc memory")) if (CHECK(!link || !prog, "alloc_memory", "failed to alloc memory"))
goto close_prog; goto close_prog;
obj = bpf_object__open_file(obj_file, &opts); obj = bpf_object__open_file(obj_file, NULL);
if (CHECK(IS_ERR_OR_NULL(obj), "obj_open", if (CHECK(IS_ERR_OR_NULL(obj), "obj_open",
"failed to open %s: %ld\n", obj_file, "failed to open %s: %ld\n", obj_file,
PTR_ERR(obj))) PTR_ERR(obj)))
goto close_prog; goto close_prog;
bpf_object__for_each_program(p, obj) {
err = bpf_program__set_attach_target(p, tgt_fd, NULL);
ASSERT_OK(err, "set_attach_target");
}
err = bpf_object__load(obj); err = bpf_object__load(obj);
if (CHECK(err, "obj_load", "err %d\n", err)) if (CHECK(err, "obj_load", "err %d\n", err))
goto close_prog; goto close_prog;
...@@ -240,7 +242,7 @@ static void test_fmod_ret_freplace(void) ...@@ -240,7 +242,7 @@ static void test_fmod_ret_freplace(void)
struct bpf_link *freplace_link = NULL; struct bpf_link *freplace_link = NULL;
struct bpf_program *prog; struct bpf_program *prog;
__u32 duration = 0; __u32 duration = 0;
int err, pkt_fd; int err, pkt_fd, attach_prog_fd;
err = bpf_prog_load(tgt_name, BPF_PROG_TYPE_UNSPEC, err = bpf_prog_load(tgt_name, BPF_PROG_TYPE_UNSPEC,
&pkt_obj, &pkt_fd); &pkt_obj, &pkt_fd);
...@@ -248,26 +250,32 @@ static void test_fmod_ret_freplace(void) ...@@ -248,26 +250,32 @@ static void test_fmod_ret_freplace(void)
if (CHECK(err, "tgt_prog_load", "file %s err %d errno %d\n", if (CHECK(err, "tgt_prog_load", "file %s err %d errno %d\n",
tgt_name, err, errno)) tgt_name, err, errno))
return; return;
opts.attach_prog_fd = pkt_fd;
freplace_obj = bpf_object__open_file(freplace_name, &opts); freplace_obj = bpf_object__open_file(freplace_name, NULL);
if (!ASSERT_OK_PTR(freplace_obj, "freplace_obj_open")) if (!ASSERT_OK_PTR(freplace_obj, "freplace_obj_open"))
goto out; goto out;
prog = bpf_program__next(NULL, freplace_obj);
err = bpf_program__set_attach_target(prog, pkt_fd, NULL);
ASSERT_OK(err, "freplace__set_attach_target");
err = bpf_object__load(freplace_obj); err = bpf_object__load(freplace_obj);
if (CHECK(err, "freplace_obj_load", "err %d\n", err)) if (CHECK(err, "freplace_obj_load", "err %d\n", err))
goto out; goto out;
prog = bpf_program__next(NULL, freplace_obj);
freplace_link = bpf_program__attach_trace(prog); freplace_link = bpf_program__attach_trace(prog);
if (!ASSERT_OK_PTR(freplace_link, "freplace_attach_trace")) if (!ASSERT_OK_PTR(freplace_link, "freplace_attach_trace"))
goto out; goto out;
opts.attach_prog_fd = bpf_program__fd(prog); fmod_obj = bpf_object__open_file(fmod_ret_name, NULL);
fmod_obj = bpf_object__open_file(fmod_ret_name, &opts);
if (!ASSERT_OK_PTR(fmod_obj, "fmod_obj_open")) if (!ASSERT_OK_PTR(fmod_obj, "fmod_obj_open"))
goto out; goto out;
attach_prog_fd = bpf_program__fd(prog);
prog = bpf_program__next(NULL, fmod_obj);
err = bpf_program__set_attach_target(prog, attach_prog_fd, NULL);
ASSERT_OK(err, "fmod_ret_set_attach_target");
err = bpf_object__load(fmod_obj); err = bpf_object__load(fmod_obj);
if (CHECK(!err, "fmod_obj_load", "loading fmod_ret should fail\n")) if (CHECK(!err, "fmod_obj_load", "loading fmod_ret should fail\n"))
goto out; goto out;
...@@ -292,14 +300,14 @@ static void test_func_sockmap_update(void) ...@@ -292,14 +300,14 @@ static void test_func_sockmap_update(void)
} }
static void test_obj_load_failure_common(const char *obj_file, static void test_obj_load_failure_common(const char *obj_file,
const char *target_obj_file) const char *target_obj_file)
{ {
/* /*
* standalone test that asserts failure to load freplace prog * standalone test that asserts failure to load freplace prog
* because of invalid return code. * because of invalid return code.
*/ */
struct bpf_object *obj = NULL, *pkt_obj; struct bpf_object *obj = NULL, *pkt_obj;
struct bpf_program *prog;
int err, pkt_fd; int err, pkt_fd;
__u32 duration = 0; __u32 duration = 0;
...@@ -309,14 +317,15 @@ static void test_obj_load_failure_common(const char *obj_file, ...@@ -309,14 +317,15 @@ static void test_obj_load_failure_common(const char *obj_file,
if (CHECK(err, "tgt_prog_load", "file %s err %d errno %d\n", if (CHECK(err, "tgt_prog_load", "file %s err %d errno %d\n",
target_obj_file, err, errno)) target_obj_file, err, errno))
return; return;
DECLARE_LIBBPF_OPTS(bpf_object_open_opts, opts,
.attach_prog_fd = pkt_fd,
);
obj = bpf_object__open_file(obj_file, &opts); obj = bpf_object__open_file(obj_file, NULL);
if (!ASSERT_OK_PTR(obj, "obj_open")) if (!ASSERT_OK_PTR(obj, "obj_open"))
goto close_prog; goto close_prog;
prog = bpf_program__next(NULL, obj);
err = bpf_program__set_attach_target(prog, pkt_fd, NULL);
ASSERT_OK(err, "set_attach_target");
/* It should fail to load the program */ /* It should fail to load the program */
err = bpf_object__load(obj); err = bpf_object__load(obj);
if (CHECK(!err, "bpf_obj_load should fail", "err %d\n", err)) if (CHECK(!err, "bpf_obj_load should fail", "err %d\n", err))
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册