From: Martin KaFai Lau <martin.lau@linux.dev>
To: Andrey Grafin <conquistador@yandex-team.ru>
Cc: andrii@kernel.org, bpf@vger.kernel.org,
Yonghong Song <yonghong.song@linux.dev>
Subject: Re: [PATCH bpf v2] libbpf: Apply map_set_def_max_entries() for inner_maps on creation
Date: Fri, 12 Jan 2024 11:47:48 -0800 [thread overview]
Message-ID: <ee2f4fb3-12b5-41ef-b3bf-b67a73f0105d@linux.dev> (raw)
In-Reply-To: <20240112121051.17325-1-conquistador@yandex-team.ru>
On 1/12/24 4:10 AM, Andrey Grafin wrote:
> This patch allows to create BPF_MAP_TYPE_ARRAY_OF_MAPS and
> BPF_MAP_TYPE_HASH_OF_MAPS with values of BPF_MAP_TYPE_PERF_EVENT_ARRAY.
>
> Previous behaviour created a zero filled btf_map_def for inner maps and
> tried to use it for a map creation but the linux kernel forbids to create
> a BPF_MAP_TYPE_PERF_EVENT_ARRAY map with max_entries=0.
>
> A simple bpf snippet to reproduce:
> struct inner_map {
> __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
> __uint(key_size, sizeof(int));
> __uint(value_size, sizeof(u32));
> } inner_map0 SEC(".maps"), inner_map1 SEC(".maps");
>
> struct {
> __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS);
> __uint(max_entries, 2);
> __type(key, u32);
> __array(values, struct inner_map);
> } outer_map SEC(".maps") = {
> .values = {&inner_map0, &inner_map1}};
> ...
>
> Previous behaviour:
> # sudo bpftool prog load ./bpf_sample.elf /sys/fs/bpf/test
> libbpf: map 'outer_map': failed to create inner map: -22
> libbpf: map 'outer_map': failed to create: Invalid argument(-22)
> libbpf: failed to load object './bpf_sample.elf'
> Error: failed to load object file
>
> # sudo strace -e bpf bpftool prog load ./bpf_sample.elf /sys/fs/bpf/test
> ...
> bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_PERF_EVENT_ARRAY, key_size=4,
> value_size=4, max_entries=16, map_flags=0, inner_map_fd=0,
> map_name="inner_map0", map_ifindex=0, btf_fd=0, btf_key_type_id=0,
> btf_value_type_id=0, btf_vmlinux_value_type_id=0, map_extra=0}, 72) = 4
> bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_PERF_EVENT_ARRAY, key_size=4,
> value_size=4, max_entries=16, map_flags=0, inner_map_fd=0,
> map_name="inner_map1", map_ifindex=0, btf_fd=0, btf_key_type_id=0,
> btf_value_type_id=0, btf_vmlinux_value_type_id=0, map_extra=0}, 72) = 5
> bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_PERF_EVENT_ARRAY, key_size=4,
> value_size=4, max_entries=0, map_flags=0, inner_map_fd=0,
> map_name="outer_map.inner", map_ifindex=0, btf_fd=0,
> btf_key_type_id=0, btf_value_type_id=0, btf_vmlinux_value_type_id=0,
> map_extra=0}, 72) = -1 EINVAL (Invalid argument)
The change makes sense. Please help to add a real selftest to catch future
regression. I believe it is what Yonghong has already asked in v1. Some of the
existing "progs/*map_in_map*.c" may be a good candidate to add this test case.
pw-bot: cr
prev parent reply other threads:[~2024-01-12 19:47 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-12 12:10 [PATCH bpf v2] libbpf: Apply map_set_def_max_entries() for inner_maps on creation Andrey Grafin
2024-01-12 19:39 ` Yonghong Song
2024-01-12 19:47 ` Martin KaFai Lau [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=ee2f4fb3-12b5-41ef-b3bf-b67a73f0105d@linux.dev \
--to=martin.lau@linux.dev \
--cc=andrii@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=conquistador@yandex-team.ru \
--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.