From: "Toke Høiland-Jørgensen" <toke@redhat.com>
To: Andrii Nakryiko <andrii.nakryiko@gmail.com>
Cc: Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
"David S. Miller" <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>,
Jesper Dangaard Brouer <hawk@kernel.org>,
John Fastabend <john.fastabend@gmail.com>,
Yonghong Song <yhs@fb.com>, Andrii Nakryiko <andrii@kernel.org>,
Mykola Lysenko <mykolal@fb.com>,
Martin KaFai Lau <martin.lau@linux.dev>,
Song Liu <song@kernel.org>, KP Singh <kpsingh@kernel.org>,
Stanislav Fomichev <sdf@google.com>, Hao Luo <haoluo@google.com>,
Jiri Olsa <jolsa@kernel.org>, Shuah Khan <shuah@kernel.org>,
bpf@vger.kernel.org, netdev@vger.kernel.org
Subject: Re: [PATCH bpf v4 2/2] selftests/bpf: Add a test for using a cpumap from an freplace-to-XDP program
Date: Wed, 14 Dec 2022 23:58:32 +0100 [thread overview]
Message-ID: <87359hfv8n.fsf@toke.dk> (raw)
In-Reply-To: <CAEf4BzYMNgfmnKzAo==Rs8E-S6cTsVv4mj_17yfKmQ5S_KzXuQ@mail.gmail.com>
Andrii Nakryiko <andrii.nakryiko@gmail.com> writes:
> On Tue, Dec 13, 2022 at 5:05 PM Toke Høiland-Jørgensen <toke@redhat.com> wrote:
>>
>> This adds a simple test for inserting an XDP program into a cpumap that is
>> "owned" by an XDP program that was loaded as PROG_TYPE_EXT (as libxdp
>> does). Prior to the kernel fix this would fail because the map type
>> ownership would be set to PROG_TYPE_EXT instead of being resolved to
>> PROG_TYPE_XDP.
>>
>> v4:
>> - Use skeletons for selftest
>> v3:
>> - Update comment to better explain the cause
>> - Add Yonghong's ACK
>>
>> Acked-by: Yonghong Song <yhs@fb.com>
>> Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
>> ---
>> .../selftests/bpf/prog_tests/fexit_bpf2bpf.c | 54 +++++++++++++++++++
>> .../selftests/bpf/progs/freplace_progmap.c | 24 +++++++++
>> 2 files changed, 78 insertions(+)
>> create mode 100644 tools/testing/selftests/bpf/progs/freplace_progmap.c
>>
>> diff --git a/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c b/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c
>> index d1e32e792536..efa1fc65840d 100644
>> --- a/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c
>> +++ b/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c
>> @@ -4,6 +4,8 @@
>> #include <network_helpers.h>
>> #include <bpf/btf.h>
>> #include "bind4_prog.skel.h"
>> +#include "freplace_progmap.skel.h"
>> +#include "xdp_dummy.skel.h"
>>
>> typedef int (*test_cb)(struct bpf_object *obj);
>>
>> @@ -500,6 +502,56 @@ static void test_fentry_to_cgroup_bpf(void)
>> bind4_prog__destroy(skel);
>> }
>>
>> +static void test_func_replace_progmap(void)
>> +{
>> + struct bpf_cpumap_val value = { .qsize = 1 };
>> + struct freplace_progmap *skel = NULL;
>> + struct xdp_dummy *tgt_skel = NULL;
>> + int err, tgt_fd;
>> + __u32 key = 0;
>> +
>> + skel = freplace_progmap__open();
>> + if (!ASSERT_OK_PTR(skel, "prog_open"))
>> + return;
>> +
>> + tgt_skel = xdp_dummy__open_and_load();
>> + if (!ASSERT_OK_PTR(tgt_skel, "tgt_prog_load"))
>> + goto out;
>> +
>> + tgt_fd = bpf_program__fd(tgt_skel->progs.xdp_dummy_prog);
>> +
>> + /* Change the 'redirect' program type to be a PROG_TYPE_EXT
>> + * with an XDP target
>> + */
>> + bpf_program__set_type(skel->progs.xdp_cpumap_prog, BPF_PROG_TYPE_EXT);
>> + bpf_program__set_expected_attach_type(skel->progs.xdp_cpumap_prog, 0);
>
> you shouldn't need this manual override if you mark xdp_cpumap_prog as
> SEC("freplace"), or am I missing something?
No, you're right; I guess I was just too focused on recreating the flow
we use in libxdp. Will fix!
>> + err = bpf_program__set_attach_target(skel->progs.xdp_cpumap_prog,
>> + tgt_fd, "xdp_dummy_prog");
>> + if (!ASSERT_OK(err, "set_attach_target"))
>> + goto out;
>> +
>> + err = freplace_progmap__load(skel);
>> + if (!ASSERT_OK(err, "obj_load"))
>> + goto out;
>> +
>> + /* Prior to fixing the kernel, loading the PROG_TYPE_EXT 'redirect'
>> + * program above will cause the map owner type of 'cpumap' to be set to
>> + * PROG_TYPE_EXT. This in turn will cause the bpf_map_update_elem()
>> + * below to fail, because the program we are inserting into the map is
>> + * of PROG_TYPE_XDP. After fixing the kernel, the initial ownership will
>> + * be correctly resolved to the *target* of the PROG_TYPE_EXT program
>> + * (i.e., PROG_TYPE_XDP) and the map update will succeed.
>> + */
>> + value.bpf_prog.fd = bpf_program__fd(skel->progs.xdp_drop_prog);
>> + err = bpf_map_update_elem(bpf_map__fd(skel->maps.cpu_map),
>> + &key, &value, 0);
>> + ASSERT_OK(err, "map_update");
>> +
>> +out:
>> + xdp_dummy__destroy(tgt_skel);
>> + freplace_progmap__destroy(skel);
>> +}
>> +
>> /* NOTE: affect other tests, must run in serial mode */
>> void serial_test_fexit_bpf2bpf(void)
>> {
>> @@ -525,4 +577,6 @@ void serial_test_fexit_bpf2bpf(void)
>> test_func_replace_global_func();
>> if (test__start_subtest("fentry_to_cgroup_bpf"))
>> test_fentry_to_cgroup_bpf();
>> + if (test__start_subtest("func_replace_progmap"))
>> + test_func_replace_progmap();
>> }
>> diff --git a/tools/testing/selftests/bpf/progs/freplace_progmap.c b/tools/testing/selftests/bpf/progs/freplace_progmap.c
>> new file mode 100644
>> index 000000000000..68174c3d7b37
>> --- /dev/null
>> +++ b/tools/testing/selftests/bpf/progs/freplace_progmap.c
>> @@ -0,0 +1,24 @@
>> +// SPDX-License-Identifier: GPL-2.0
>> +#include <linux/bpf.h>
>> +#include <bpf/bpf_helpers.h>
>> +
>> +struct {
>> + __uint(type, BPF_MAP_TYPE_CPUMAP);
>> + __uint(key_size, sizeof(__u32));
>> + __uint(value_size, sizeof(struct bpf_cpumap_val));
>
> ok, another minor nit which you ignored, libbpf should be smart enough to accept
>
> __type(key, __u32);
> __type(value, struct bpf_cpumap_val);
>
> And if it's not it would be good to know that it's not (and trivially
> fix it).
Ah, actually saw that comment on the previous version, and then
completely forgot about it when I was fixing things up. Sorry about
that; will change!
-Toke
prev parent reply other threads:[~2022-12-14 22:59 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-14 1:05 [PATCH bpf v4 1/2] bpf: Resolve fext program type when checking map compatibility Toke Høiland-Jørgensen
2022-12-14 1:05 ` [PATCH bpf v4 2/2] selftests/bpf: Add a test for using a cpumap from an freplace-to-XDP program Toke Høiland-Jørgensen
2022-12-14 19:35 ` Andrii Nakryiko
2022-12-14 22:58 ` Toke Høiland-Jørgensen [this message]
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=87359hfv8n.fsf@toke.dk \
--to=toke@redhat.com \
--cc=andrii.nakryiko@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=haoluo@google.com \
--cc=hawk@kernel.org \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=kpsingh@kernel.org \
--cc=kuba@kernel.org \
--cc=martin.lau@linux.dev \
--cc=mykolal@fb.com \
--cc=netdev@vger.kernel.org \
--cc=sdf@google.com \
--cc=shuah@kernel.org \
--cc=song@kernel.org \
--cc=yhs@fb.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.