[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