All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Vernet <void@manifault.com>
To: Eduard Zingerman <eddyz87@gmail.com>
Cc: bpf@vger.kernel.org, ast@kernel.org, andrii@kernel.org,
	daniel@iogearbox.net, martin.lau@linux.dev, kernel-team@fb.com,
	yonghong.song@linux.dev
Subject: Re: [PATCH bpf-next v1 5/8] selftests/bpf: bad_struct_ops test
Date: Wed, 28 Feb 2024 12:15:52 -0600	[thread overview]
Message-ID: <20240228181552.GG148327@maniforge> (raw)
In-Reply-To: <20240227204556.17524-6-eddyz87@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 5593 bytes --]

On Tue, Feb 27, 2024 at 10:45:53PM +0200, Eduard Zingerman wrote:
> When loading struct_ops programs kernel requires BTF id of the
> struct_ops type and member index for attachment point inside that
> type. This makes it not possible to have same BPF program used in
> struct_ops maps that have different struct_ops type.
> Check if libbpf rejects such BPF objects files.
> 
> Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
> ---
>  .../selftests/bpf/bpf_testmod/bpf_testmod.c   | 24 +++++++++++
>  .../selftests/bpf/bpf_testmod/bpf_testmod.h   |  4 ++
>  .../selftests/bpf/prog_tests/bad_struct_ops.c | 42 +++++++++++++++++++
>  .../selftests/bpf/progs/bad_struct_ops.c      | 17 ++++++++
>  4 files changed, 87 insertions(+)
>  create mode 100644 tools/testing/selftests/bpf/prog_tests/bad_struct_ops.c
>  create mode 100644 tools/testing/selftests/bpf/progs/bad_struct_ops.c
> 
> diff --git a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c
> index 0d8437e05f64..69f5eb9ad546 100644
> --- a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c
> +++ b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c
> @@ -601,6 +601,29 @@ struct bpf_struct_ops bpf_bpf_testmod_ops = {
>  	.owner = THIS_MODULE,
>  };
>  
> +static int bpf_dummy_reg2(void *kdata)
> +{
> +	struct bpf_testmod_ops2 *ops = kdata;
> +
> +	ops->test_1();
> +	return 0;
> +}
> +
> +static struct bpf_testmod_ops2 __bpf_testmod_ops2 = {
> +	.test_1 = bpf_testmod_test_1,
> +};
> +
> +struct bpf_struct_ops bpf_testmod_ops2 = {
> +	.verifier_ops = &bpf_testmod_verifier_ops,
> +	.init = bpf_testmod_ops_init,
> +	.init_member = bpf_testmod_ops_init_member,
> +	.reg = bpf_dummy_reg2,
> +	.unreg = bpf_dummy_unreg,
> +	.cfi_stubs = &__bpf_testmod_ops2,
> +	.name = "bpf_testmod_ops2",
> +	.owner = THIS_MODULE,
> +};
> +
>  extern int bpf_fentry_test1(int a);
>  
>  static int bpf_testmod_init(void)
> @@ -612,6 +635,7 @@ static int bpf_testmod_init(void)
>  	ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_TRACING, &bpf_testmod_kfunc_set);
>  	ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_SYSCALL, &bpf_testmod_kfunc_set);
>  	ret = ret ?: register_bpf_struct_ops(&bpf_bpf_testmod_ops, bpf_testmod_ops);
> +	ret = ret ?: register_bpf_struct_ops(&bpf_testmod_ops2, bpf_testmod_ops2);
>  	if (ret < 0)
>  		return ret;
>  	if (bpf_fentry_test1(0) < 0)
> diff --git a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.h b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.h
> index c3b0cf788f9f..3183fff7f246 100644
> --- a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.h
> +++ b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.h
> @@ -37,4 +37,8 @@ struct bpf_testmod_ops {
>  	int (*test_maybe_null)(int dummy, struct task_struct *task);
>  };
>  
> +struct bpf_testmod_ops2 {
> +	int (*test_1)(void);
> +};
> +
>  #endif /* _BPF_TESTMOD_H */
> diff --git a/tools/testing/selftests/bpf/prog_tests/bad_struct_ops.c b/tools/testing/selftests/bpf/prog_tests/bad_struct_ops.c
> new file mode 100644
> index 000000000000..9c689db4b05b
> --- /dev/null
> +++ b/tools/testing/selftests/bpf/prog_tests/bad_struct_ops.c
> @@ -0,0 +1,42 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +#include <test_progs.h>
> +#include "bad_struct_ops.skel.h"
> +
> +#define EXPECTED_MSG "libbpf: struct_ops reloc"
> +
> +static libbpf_print_fn_t old_print_cb;
> +static bool msg_found;
> +
> +static int print_cb(enum libbpf_print_level level, const char *fmt, va_list args)
> +{
> +	old_print_cb(level, fmt, args);
> +	if (level == LIBBPF_WARN && strncmp(fmt, EXPECTED_MSG, strlen(EXPECTED_MSG)) == 0)
> +		msg_found = true;
> +
> +	return 0;
> +}

Not necessary at all for this patch set / just an observation, but it would be
nice to have this be something offered by the core prog_tests framework
(meaning, the ability to assert libbpf output for a testcase).

> +
> +static void test_bad_struct_ops(void)
> +{
> +	struct bad_struct_ops *skel;
> +	int err;
> +
> +	old_print_cb = libbpf_set_print(print_cb);
> +	skel = bad_struct_ops__open_and_load();
> +	err = errno;
> +	libbpf_set_print(old_print_cb);
> +	if (!ASSERT_NULL(skel, "bad_struct_ops__open_and_load"))
> +		return;
> +
> +	ASSERT_EQ(err, EINVAL, "errno should be EINVAL");
> +	ASSERT_TRUE(msg_found, "expected message");
> +
> +	bad_struct_ops__destroy(skel);
> +}
> +
> +void serial_test_bad_struct_ops(void)
> +{
> +	if (test__start_subtest("test_bad_struct_ops"))
> +		test_bad_struct_ops();
> +}
> diff --git a/tools/testing/selftests/bpf/progs/bad_struct_ops.c b/tools/testing/selftests/bpf/progs/bad_struct_ops.c
> new file mode 100644
> index 000000000000..9c103afbfdb1
> --- /dev/null
> +++ b/tools/testing/selftests/bpf/progs/bad_struct_ops.c
> @@ -0,0 +1,17 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +#include <vmlinux.h>
> +#include <bpf/bpf_helpers.h>
> +#include <bpf/bpf_tracing.h>
> +#include "../bpf_testmod/bpf_testmod.h"
> +
> +char _license[] SEC("license") = "GPL";
> +
> +SEC("struct_ops/test_1")
> +int BPF_PROG(test_1) { return 0; }
> +
> +SEC(".struct_ops.link")
> +struct bpf_testmod_ops testmod_1 = { .test_1 = (void *)test_1 };

Just to make be 100% sure that we're isolating the issue under test, should we
also add a .test_2 prog and add it to the struct bpf_testmod_ops map?

> +
> +SEC(".struct_ops.link")
> +struct bpf_testmod_ops2 testmod_2 = { .test_1 = (void *)test_1 };
> -- 
> 2.43.0
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

  reply	other threads:[~2024-02-28 18:15 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-27 20:45 [PATCH bpf-next v1 0/8] libbpf: type suffixes and autocreate flag for struct_ops maps Eduard Zingerman
2024-02-27 20:45 ` [PATCH bpf-next v1 1/8] libbpf: allow version suffixes (___smth) for struct_ops types Eduard Zingerman
2024-02-27 21:47   ` Kui-Feng Lee
2024-02-27 21:49     ` Eduard Zingerman
2024-02-28 16:29   ` David Vernet
2024-02-28 17:28     ` Eduard Zingerman
2024-02-28 17:30       ` David Vernet
2024-02-28 23:21       ` Andrii Nakryiko
2024-02-28 23:37         ` Eduard Zingerman
2024-02-27 20:45 ` [PATCH bpf-next v1 2/8] libbpf: tie struct_ops programs to kernel BTF ids, not to local ids Eduard Zingerman
2024-02-28  7:41   ` Martin KaFai Lau
2024-02-28 17:23   ` David Vernet
2024-02-28 17:40     ` Eduard Zingerman
2024-02-28 17:50       ` David Vernet
2024-02-28 23:28   ` Andrii Nakryiko
2024-02-28 23:31     ` Eduard Zingerman
2024-02-28 23:34       ` Andrii Nakryiko
2024-02-27 20:45 ` [PATCH bpf-next v1 3/8] libbpf: honor autocreate flag for struct_ops maps Eduard Zingerman
2024-02-28 17:44   ` David Vernet
2024-02-27 20:45 ` [PATCH bpf-next v1 4/8] selftests/bpf: test struct_ops map definition with type suffix Eduard Zingerman
2024-02-28 18:03   ` David Vernet
2024-02-27 20:45 ` [PATCH bpf-next v1 5/8] selftests/bpf: bad_struct_ops test Eduard Zingerman
2024-02-28 18:15   ` David Vernet [this message]
2024-02-28 20:06     ` Eduard Zingerman
2024-02-28 20:11       ` David Vernet
2024-02-28 23:40   ` Andrii Nakryiko
2024-02-28 23:44     ` Eduard Zingerman
2024-02-28 23:56       ` Andrii Nakryiko
2024-02-29  0:06         ` Eduard Zingerman
2024-02-27 20:45 ` [PATCH bpf-next v1 6/8] selftests/bpf: test autocreate behavior for struct_ops maps Eduard Zingerman
2024-02-28 18:29   ` David Vernet
2024-02-28 18:34     ` David Vernet
2024-02-28 19:31     ` Eduard Zingerman
2024-02-28 23:43   ` Andrii Nakryiko
2024-02-28 23:55     ` Eduard Zingerman
2024-02-29  0:02       ` Andrii Nakryiko
2024-02-29  0:56         ` Martin KaFai Lau
2024-03-01  1:28         ` Eduard Zingerman
2024-03-01 18:03           ` Andrii Nakryiko
2024-03-01 18:07             ` Eduard Zingerman
2024-02-27 20:45 ` [PATCH bpf-next v1 7/8] libbpf: sync progs autoload with maps autocreate " Eduard Zingerman
2024-02-27 22:55   ` Kui-Feng Lee
2024-02-27 23:09     ` Eduard Zingerman
2024-02-27 23:16       ` Kui-Feng Lee
2024-02-27 23:30         ` Eduard Zingerman
2024-02-27 23:40           ` Kui-Feng Lee
2024-02-27 23:43             ` Eduard Zingerman
2024-02-28  0:12           ` Kui-Feng Lee
2024-02-28  0:50             ` Eduard Zingerman
2024-02-28  2:10   ` Martin KaFai Lau
2024-02-28 12:36     ` Eduard Zingerman
2024-02-28 23:55     ` Andrii Nakryiko
2024-02-29  0:04       ` Eduard Zingerman
2024-02-29  0:14         ` Andrii Nakryiko
2024-02-29  0:25       ` Martin KaFai Lau
2024-02-29  0:30         ` Andrii Nakryiko
2024-02-29  0:37           ` Martin KaFai Lau
2024-02-29  0:40             ` Eduard Zingerman
2024-02-27 20:45 ` [PATCH bpf-next v1 8/8] selftests/bpf: tests for struct_ops autoload/autocreate toggling Eduard Zingerman
2024-02-28 18:36   ` David Vernet
2024-02-28 20:10     ` Eduard Zingerman

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=20240228181552.GG148327@maniforge \
    --to=void@manifault.com \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=eddyz87@gmail.com \
    --cc=kernel-team@fb.com \
    --cc=martin.lau@linux.dev \
    --cc=yonghong.song@linux.dev \
    /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.