From: Martin KaFai Lau <martin.lau@linux.dev>
To: thinker.li@gmail.com
Cc: sinquersw@gmail.com, kuifeng@meta.com, bpf@vger.kernel.org,
ast@kernel.org, song@kernel.org, kernel-team@meta.com,
andrii@kernel.org, drosen@google.com
Subject: Re: [PATCH bpf-next v13 13/14] selftests/bpf: test case for register_bpf_struct_ops().
Date: Thu, 14 Dec 2023 23:17:43 -0800 [thread overview]
Message-ID: <83daf2e3-6e2e-45f2-9a54-32fac1c98cde@linux.dev> (raw)
In-Reply-To: <20231209002709.535966-14-thinker.li@gmail.com>
On 12/8/23 4:27 PM, thinker.li@gmail.com wrote:
> diff --git a/tools/testing/selftests/bpf/prog_tests/test_struct_ops_module.c b/tools/testing/selftests/bpf/prog_tests/test_struct_ops_module.c
> new file mode 100644
> index 000000000000..55a4c6ed92aa
> --- /dev/null
> +++ b/tools/testing/selftests/bpf/prog_tests/test_struct_ops_module.c
> @@ -0,0 +1,92 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/* Copyright (c) 2023 Meta Platforms, Inc. and affiliates. */
> +#include <test_progs.h>
> +#include <time.h>
> +
> +#include "struct_ops_module.skel.h"
> +#include "testmod_unload.skel.h"
> +
> +static void test_regular_load(void)
> +{
> + DECLARE_LIBBPF_OPTS(bpf_object_open_opts, opts);
> + struct struct_ops_module *skel;
> + struct testmod_unload *skel_unload;
> + struct bpf_link *link_map_free = NULL;
> + struct bpf_link *link;
> + int err, i;
> +
> + skel = struct_ops_module__open_opts(&opts);
> + if (!ASSERT_OK_PTR(skel, "struct_ops_module_open"))
> + return;
> +
> + err = struct_ops_module__load(skel);
> + if (!ASSERT_OK(err, "struct_ops_module_load"))
> + goto cleanup;
> +
> + link = bpf_map__attach_struct_ops(skel->maps.testmod_1);
> + ASSERT_OK_PTR(link, "attach_test_mod_1");
> +
> + /* test_2() will be called from bpf_dummy_reg() in bpf_testmod.c */
> + ASSERT_EQ(skel->bss->test_2_result, 7, "test_2_result");
> +
> + bpf_link__destroy(link);
> +
> +cleanup:
> + skel_unload = testmod_unload__open_and_load();
> +
> + if (ASSERT_OK_PTR(skel_unload, "testmod_unload_open"))
> + link_map_free = bpf_program__attach(skel_unload->progs.trace_map_free);
> + struct_ops_module__destroy(skel);
> +
> + if (!ASSERT_OK_PTR(link_map_free, "create_link_map_free"))
> + return;
> +
> + /* Wait for the struct_ops map to be freed. Struct_ops maps hold a
> + * refcount to the module btf. And, this function unloads and then
> + * loads bpf_testmod. Without waiting the map to be freed, the next
> + * test may fail to unload the bpf_testmod module since the map is
> + * still holding a refcnt to the module.
> + */
> + for (i = 0; i < 10; i++) {
> + if (skel_unload->bss->bpf_testmod_put)
> + break;
> + usleep(100000);
> + }
> + ASSERT_EQ(skel_unload->bss->bpf_testmod_put, 1, "map_free");
> +
> + bpf_link__destroy(link_map_free);
> + testmod_unload__destroy(skel_unload);
> +}
> +
> +static void test_load_without_module(void)
> +{
> + DECLARE_LIBBPF_OPTS(bpf_object_open_opts, opts);
> + struct struct_ops_module *skel;
> + int err;
> +
> + err = unload_bpf_testmod(false);
> + if (!ASSERT_OK(err, "unload_bpf_testmod"))
> + return;
> +
> + skel = struct_ops_module__open_opts(&opts);
> + if (!ASSERT_OK_PTR(skel, "struct_ops_module_open"))
> + goto cleanup;
> + err = struct_ops_module__load(skel);
Both the module btf and the .ko itself are gone from the kernel now?
This is basically testing libbpf cannot find 'struct bpf_testmod_ops' from the
running kernel?
How about create another struct_ops_module_notfound.c bpf program:
SEC(".struct_ops.link")
struct bpf_testmod_ops_notfound testmod_1 = {
.test_1 = (void *)test_1,
.test_2 = (void *)test_2,
};
and avoid the usleep() wait and the unload_bpf_testmod()?
> + ASSERT_ERR(err, "struct_ops_module_load");
> +
> + struct_ops_module__destroy(skel);
> +
> +cleanup:
> + /* Without this, the next test may fail */
> + load_bpf_testmod(false);
> +}
> +
> +void serial_test_struct_ops_module(void)
> +{
> + if (test__start_subtest("regular_load"))
> + test_regular_load();
> +
> + if (test__start_subtest("load_without_module"))
> + test_load_without_module();
> +}
> +
next prev parent reply other threads:[~2023-12-15 7:17 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-09 0:26 [PATCH bpf-next v13 00/14] Registrating struct_ops types from modules thinker.li
2023-12-09 0:26 ` [PATCH bpf-next v13 01/14] bpf: refactory struct_ops type initialization to a function thinker.li
2023-12-09 0:26 ` [PATCH bpf-next v13 02/14] bpf: get type information with BPF_ID_LIST thinker.li
2023-12-15 1:59 ` Martin KaFai Lau
2023-12-09 0:26 ` [PATCH bpf-next v13 03/14] bpf, net: introduce bpf_struct_ops_desc thinker.li
2023-12-15 2:05 ` Martin KaFai Lau
2023-12-09 0:26 ` [PATCH bpf-next v13 04/14] bpf: add struct_ops_tab to btf thinker.li
2023-12-15 2:22 ` Martin KaFai Lau
2023-12-15 21:42 ` Kui-Feng Lee
2023-12-16 1:19 ` Martin KaFai Lau
2023-12-16 5:43 ` Kui-Feng Lee
2023-12-16 16:48 ` Martin KaFai Lau
2023-12-17 7:09 ` Kui-Feng Lee
2023-12-09 0:27 ` [PATCH bpf-next v13 05/14] bpf: make struct_ops_map support btfs other than btf_vmlinux thinker.li
2023-12-09 0:27 ` [PATCH bpf-next v13 06/14] bpf: lookup struct_ops types from a given module BTF thinker.li
2023-12-09 0:27 ` [PATCH bpf-next v13 07/14] bpf: pass attached BTF to the bpf_struct_ops subsystem thinker.li
2023-12-15 2:44 ` Martin KaFai Lau
2023-12-15 22:10 ` Kui-Feng Lee
2023-12-16 0:19 ` Martin KaFai Lau
2023-12-16 5:55 ` Kui-Feng Lee
2023-12-16 6:07 ` Kui-Feng Lee
2023-12-16 16:41 ` Martin KaFai Lau
2023-12-16 19:38 ` Kui-Feng Lee
2023-12-09 0:27 ` [PATCH bpf-next v13 08/14] bpf: hold module for bpf_struct_ops_map thinker.li
2023-12-15 5:54 ` Martin KaFai Lau
2023-12-15 23:25 ` Kui-Feng Lee
2023-12-09 0:27 ` [PATCH bpf-next v13 09/14] bpf: validate value_type thinker.li
2023-12-15 6:02 ` Martin KaFai Lau
2023-12-15 23:52 ` Kui-Feng Lee
2023-12-09 0:27 ` [PATCH bpf-next v13 10/14] bpf, net: switch to dynamic registration thinker.li
2023-12-15 6:51 ` Martin KaFai Lau
2023-12-09 0:27 ` [PATCH bpf-next v13 11/14] libbpf: Find correct module BTFs for struct_ops maps and progs thinker.li
2023-12-09 0:27 ` [PATCH bpf-next v13 12/14] bpf: export btf_ctx_access to modules thinker.li
2023-12-09 0:27 ` [PATCH bpf-next v13 13/14] selftests/bpf: test case for register_bpf_struct_ops() thinker.li
2023-12-15 7:17 ` Martin KaFai Lau [this message]
2023-12-17 7:32 ` Kui-Feng Lee
2023-12-09 0:27 ` [PATCH bpf-next v13 14/14] bpf: pass btf object id in bpf_map_info thinker.li
2023-12-15 7:46 ` Martin KaFai Lau
2023-12-17 7:35 ` Kui-Feng Lee
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=83daf2e3-6e2e-45f2-9a54-32fac1c98cde@linux.dev \
--to=martin.lau@linux.dev \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=drosen@google.com \
--cc=kernel-team@meta.com \
--cc=kuifeng@meta.com \
--cc=sinquersw@gmail.com \
--cc=song@kernel.org \
--cc=thinker.li@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.