[PATCH 1/4] bpf: support new field for BPF_MAP_CREATE
Dmitry V. Levin
ldv at altlinux.org
Wed Mar 4 23:45:10 UTC 2020
On Sun, Feb 23, 2020 at 11:13:02AM +0100, Paul Chaignon wrote:
> * bpf_attr.h (BPF_MAP_CREATE_struct): New field introduced in Linux
> v5.6-rc1~151^2~46^2~37^2~5.
> * bpf.c (BEGIN_BPF_CMD_DECODER(BPF_MAP_CREATE)): Decode the new field.
> * NEWS: Mention this.
> * tests/bpf-obj_get_info_by_fd.c (print_map_create): Update expected
> output.
> * tests/bpf.c (BPF_MAP_CREATE_checks): Likewise.
>
> Signed-off-by: Paul Chaignon <paul.chaignon at gmail.com>
> ---
> NEWS | 1 +
> bpf.c | 8 ++++++++
> bpf_attr.h | 3 ++-
> tests/bpf-obj_get_info_by_fd.c | 4 ++++
> tests/bpf.c | 6 ++++--
> 5 files changed, 19 insertions(+), 3 deletions(-)
>
> diff --git a/NEWS b/NEWS
> index e27221df..1a4dbdda 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -2,6 +2,7 @@ Noteworthy changes in release ?.? (????-??-??)
> ==============================================
>
> * Improvements
> + * Enhanced decoding of BPF_MAP_CREATE bpf syscall command.
>
> * Bug fixes
> * Fixed build on csky abiv1 architecture.
> diff --git a/bpf.c b/bpf.c
> index b42cf29d..74d46f1b 100644
> --- a/bpf.c
> +++ b/bpf.c
> @@ -224,6 +224,14 @@ BEGIN_BPF_CMD_DECODER(BPF_MAP_CREATE)
> PRINT_FIELD_FD(", ", attr, btf_fd, tcp);
> PRINT_FIELD_U(", ", attr, btf_key_type_id);
> PRINT_FIELD_U(", ", attr, btf_value_type_id);
> +
> + /*
> + * The following field was introduced by Linux commit
> + * v5.6-rc1~151^2~46^2~37^2~5.
> + */
> + if (len <= offsetof(struct BPF_MAP_CREATE_struct, btf_vmlinux_value_type_id))
> + break;
> + PRINT_FIELD_U(", ", attr, btf_vmlinux_value_type_id);
> }
> END_BPF_CMD_DECODER(RVAL_DECODED | RVAL_FD)
>
> diff --git a/bpf_attr.h b/bpf_attr.h
> index 33dd54af..b569096b 100644
> --- a/bpf_attr.h
> +++ b/bpf_attr.h
> @@ -49,11 +49,12 @@ struct BPF_MAP_CREATE_struct {
> uint32_t btf_fd;
> uint32_t btf_key_type_id;
> uint32_t btf_value_type_id;
> + uint32_t btf_vmlinux_value_type_id;
> };
>
> # define BPF_MAP_CREATE_struct_size \
> sizeof(struct BPF_MAP_CREATE_struct)
> -# define expected_BPF_MAP_CREATE_struct_size 60
> +# define expected_BPF_MAP_CREATE_struct_size 64
>
> struct BPF_MAP_LOOKUP_ELEM_struct {
> uint32_t map_fd;
> diff --git a/tests/bpf-obj_get_info_by_fd.c b/tests/bpf-obj_get_info_by_fd.c
> index 36ab80e0..80196df3 100644
> --- a/tests/bpf-obj_get_info_by_fd.c
> +++ b/tests/bpf-obj_get_info_by_fd.c
> @@ -87,6 +87,10 @@ print_map_create(void *attr_void, size_t size, long rc)
> printf(", btf_fd=0</dev/null>"
> ", btf_key_type_id=0, btf_value_type_id=0");
> }
> + if (size > offsetof(struct BPF_MAP_CREATE_struct,
> + btf_vmlinux_value_type_id)) {
> + printf(", btf_vmlinux_value_type_id=0");
> + }
> printf("}, %zu) = ", size);
> if (rc >= 0)
> printf("%ld<anon_inode:bpf-map>\n", rc);
> diff --git a/tests/bpf.c b/tests/bpf.c
> index d21c0f10..a462d008 100644
> --- a/tests/bpf.c
> +++ b/tests/bpf.c
> @@ -417,10 +417,11 @@ static struct bpf_attr_check BPF_MAP_CREATE_checks[] = {
> .data = { .BPF_MAP_CREATE_data = {
> .btf_fd = 0xbadc0ded,
> .btf_key_type_id = 0xfacefeed,
> - .btf_value_type_id = 0xcafef00d
> + .btf_value_type_id = 0xcafef00d,
> + .btf_vmlinux_value_type_id = 0xdeadbeef,
> } },
> .size = offsetofend(struct BPF_MAP_CREATE_struct,
> - btf_value_type_id),
> + btf_vmlinux_value_type_id),
> .str = "map_type=BPF_MAP_TYPE_UNSPEC"
> ", key_size=0"
> ", value_size=0"
> @@ -432,6 +433,7 @@ static struct bpf_attr_check BPF_MAP_CREATE_checks[] = {
> ", btf_fd=-1159983635"
> ", btf_key_type_id=4207869677"
> ", btf_value_type_id=3405705229"
> + ", btf_vmlinux_value_type_id=3735928559"
> },
> };
Eugene suggested to add a new check to BPF_MAP_CREATE_checks instead
so that both variants of
"if (len <= offsetof(struct BPF_MAP_CREATE_struct, btf_vmlinux_value_type_id))"
condition are covered by the test.
I've pushed the following commit to ldv/next branch for testing,
please let me know if anything has to be changed.
--
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-bpf-implement-decoding-of-BPF_MAP_CREATE-btf_vmlinux.patch
Type: text/x-patch
Size: 4365 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20200305/231583df/attachment.bin>
More information about the Strace-devel
mailing list