[PATCH 1/2] bpf: support new field in BPF_PROG_LOAD

Dmitry V. Levin ldv at altlinux.org
Tue Nov 26 22:53:07 UTC 2019


On Mon, Nov 25, 2019 at 05:48:47PM +0100, Paul Chaignon wrote:
> * bpf_attr.h (BPF_MAP_LOOKUP_ELEM_struct): New field introduced by Linux
> commit v5.1-rc1~178^2~375^2~4^2~3.
> * xlat/bpf_map_lookup_elem_flags.in: New file.
> * bpf.c: Include "xlat/bpf_map_lookup_elem_flags.h".
> (BEGIN_BPF_CMD_DECODER(BPF_MAP_LOOKUP_ELEM)): Decode the new field.
> * tests/bpf.c (BPF_PROG_LOAD_checks, BPF_MAP_LOOKUP_ELEM_checks): Update
> expected outputs.
> 
> Signed-off-by: Paul Chaignon <paul.chaignon at gmail.com>

Thanks!  I wonder how could we miss it before.

But why do you mention BPF_PROG_LOAD here?
Shouldn't it be BPF_MAP_LOOKUP_ELEM instead?

> ---
>  bpf.c                             | 6 ++++++
>  bpf_attr.h                        | 3 ++-
>  tests/bpf.c                       | 6 ++++--
>  xlat/bpf_map_lookup_elem_flags.in | 2 ++
>  4 files changed, 14 insertions(+), 3 deletions(-)
>  create mode 100644 xlat/bpf_map_lookup_elem_flags.in
> 
> diff --git a/bpf.c b/bpf.c
> index d376514d..9b6fb488 100644
> --- a/bpf.c
> +++ b/bpf.c
> @@ -23,6 +23,7 @@
>  #include "xlat/bpf_map_flags.h"
>  #include "xlat/bpf_prog_types.h"
>  #include "xlat/bpf_prog_flags.h"
> +#include "xlat/bpf_map_lookup_elem_flags.h"
>  #include "xlat/bpf_map_update_elem_flags.h"
>  #include "xlat/bpf_attach_type.h"
>  #include "xlat/bpf_attach_flags.h"
> @@ -231,6 +232,11 @@ BEGIN_BPF_CMD_DECODER(BPF_MAP_LOOKUP_ELEM)
>  	PRINT_FIELD_FD("{", attr, map_fd, tcp);
>  	PRINT_FIELD_ADDR64(", ", attr, key);
>  	PRINT_FIELD_ADDR64(", ", attr, value);
> +	/* flags field was added in Linux commit v5.1-rc1~178^2~375^2~4^2~3.  */
> +	if (len <= offsetof(struct BPF_MAP_LOOKUP_ELEM_struct, flags))
> +		break;
> +	PRINT_FIELD_FLAGS(", ", attr, flags, bpf_map_lookup_elem_flags,
> +			  "BPF_???");
>  }
>  END_BPF_CMD_DECODER(RVAL_DECODED)
>  
> diff --git a/bpf_attr.h b/bpf_attr.h
> index ac8c9210..6695a2fe 100644
> --- a/bpf_attr.h
> +++ b/bpf_attr.h
> @@ -59,11 +59,12 @@ struct BPF_MAP_LOOKUP_ELEM_struct {
>  	uint32_t map_fd;
>  	uint64_t ATTRIBUTE_ALIGNED(8) key;
>  	uint64_t ATTRIBUTE_ALIGNED(8) value;
> +	uint64_t ATTRIBUTE_ALIGNED(8) flags;
>  };
>  
>  # define BPF_MAP_LOOKUP_ELEM_struct_size \
>  	sizeof(struct BPF_MAP_LOOKUP_ELEM_struct)
> -# define expected_BPF_MAP_LOOKUP_ELEM_struct_size 24
> +# define expected_BPF_MAP_LOOKUP_ELEM_struct_size 32
>  
>  struct BPF_MAP_UPDATE_ELEM_struct {
>  	uint32_t map_fd;
> diff --git a/tests/bpf.c b/tests/bpf.c
> index 71c2f8d4..a1dad79a 100644
> --- a/tests/bpf.c
> +++ b/tests/bpf.c
> @@ -435,10 +435,12 @@ static const struct bpf_attr_check BPF_MAP_LOOKUP_ELEM_checks[] = {
>  		.data = { .BPF_MAP_LOOKUP_ELEM_data = {
>  			.map_fd = -1,
>  			.key = 0xdeadbeef,
> -			.value = 0xbadc0ded
> +			.value = 0xbadc0ded,
> +			.flags = 4
>  		} },
> -		.size = offsetofend(struct BPF_MAP_LOOKUP_ELEM_struct, value),
> +		.size = offsetofend(struct BPF_MAP_LOOKUP_ELEM_struct, flags),
>  		.str = "map_fd=-1, key=0xdeadbeef, value=0xbadc0ded"
> +		       ", flags=BPF_F_LOCK"
>  	}
>  };
>  
> diff --git a/xlat/bpf_map_lookup_elem_flags.in b/xlat/bpf_map_lookup_elem_flags.in
> new file mode 100644
> index 00000000..68c936b7
> --- /dev/null
> +++ b/xlat/bpf_map_lookup_elem_flags.in
> @@ -0,0 +1,2 @@
> +BPF_ANY 0
> +BPF_F_LOCK 4


-- 
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20191127/a9d47baf/attachment.bin>


More information about the Strace-devel mailing list