Re: [PATCH dwarves 3/3] pahole: introduce --btf_feature=attributes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 07/02/2025 02:14, Ihor Solodrai wrote:
> Add a feature flag "attributes" (default: false) controlling whether
> pahole is allowed to generate BTF attributes: type tags and decl tags
> with kind_flag = 1.
> 
> This is necessary for backward compatibility, as BPF verifier does not
> recognize tags with kind_flag = 1 prior to (at least) 6.14-rc1 [1].
> 
> [1] https://lore.kernel.org/bpf/20250130201239.1429648-1-ihor.solodrai@xxxxxxxxx/
> 
> Signed-off-by: Ihor Solodrai <ihor.solodrai@xxxxxxxxx>

Needs update to pahole man page describing the new "attributes"
btf_feature, but aside from that LGTM.

Reviewed-by: Alan Maguire <alan.maguire@xxxxxxxxxx>

> ---
>  btf_encoder.c |  6 ++++--
>  dwarves.h     |  1 +
>  pahole.c      | 11 +++++++++++
>  3 files changed, 16 insertions(+), 2 deletions(-)
> 
> diff --git a/btf_encoder.c b/btf_encoder.c
> index d7837c2..0a734d4 100644
> --- a/btf_encoder.c
> +++ b/btf_encoder.c
> @@ -142,7 +142,8 @@ struct btf_encoder {
>  			  gen_floats,
>  			  skip_encoding_decl_tag,
>  			  tag_kfuncs,
> -			  gen_distilled_base;
> +			  gen_distilled_base,
> +			  encode_attributes;
>  	uint32_t	  array_index_id;
>  	struct elf_secinfo *secinfo;
>  	size_t             seccnt;
> @@ -800,7 +801,7 @@ static int btf_encoder__add_bpf_arena_type_tags(struct btf_encoder *encoder, str
>  	int ret_type_id;
>  	int err = 0;
>  
> -	if (!state || !state->elf || !state->elf->kfunc)
> +	if (!encoder->encode_attributes || !state || !state->elf || !state->elf->kfunc)
>  		goto out;
>  
>  	kfunc = btf_encoder__kfunc_by_name(encoder, state->elf->name);
> @@ -2553,6 +2554,7 @@ struct btf_encoder *btf_encoder__new(struct cu *cu, const char *detached_filenam
>  		encoder->skip_encoding_decl_tag	 = conf_load->skip_encoding_btf_decl_tag;
>  		encoder->tag_kfuncs	 = conf_load->btf_decl_tag_kfuncs;
>  		encoder->gen_distilled_base = conf_load->btf_gen_distilled_base;
> +		encoder->encode_attributes = conf_load->btf_attributes;
>  		encoder->verbose	 = verbose;
>  		encoder->has_index_type  = false;
>  		encoder->need_index_type = false;
> diff --git a/dwarves.h b/dwarves.h
> index 8234e1a..99ed783 100644
> --- a/dwarves.h
> +++ b/dwarves.h
> @@ -89,6 +89,7 @@ struct conf_load {
>  	bool			reproducible_build;
>  	bool			btf_decl_tag_kfuncs;
>  	bool			btf_gen_distilled_base;
> +	bool			btf_attributes;
>  	uint8_t			hashtable_bits;
>  	uint8_t			max_hashtable_bits;
>  	uint16_t		kabi_prefix_len;
> diff --git a/pahole.c b/pahole.c
> index af3e1cf..0bda249 100644
> --- a/pahole.c
> +++ b/pahole.c
> @@ -1152,6 +1152,7 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = dwarves_print_version;
>  #define ARG_padding_ge		   347
>  #define ARG_padding		   348
>  #define ARGP_with_embedded_flexible_array 349
> +#define ARGP_btf_attributes	   350
>  
>  /* --btf_features=feature1[,feature2,..] allows us to specify
>   * a list of requested BTF features or "default" to enable all default
> @@ -1210,6 +1211,9 @@ struct btf_feature {
>  	BTF_NON_DEFAULT_FEATURE(distilled_base, btf_gen_distilled_base, false),
>  #endif
>  	BTF_NON_DEFAULT_FEATURE(global_var, encode_btf_global_vars, false),
> +#if LIBBPF_MAJOR_VERSION >= 1 && LIBBPF_MINOR_VERSION >= 6
> +	BTF_NON_DEFAULT_FEATURE(attributes, btf_attributes, false),
> +#endif
>  };
>  
>  #define BTF_MAX_FEATURE_STR	1024
> @@ -1785,6 +1789,11 @@ static const struct argp_option pahole__options[] = {
>  		.key = ARGP_running_kernel_vmlinux,
>  		.doc = "Search for, possibly getting from a debuginfo server, a vmlinux matching the running kernel build-id (from /sys/kernel/notes)"
>  	},
> +	{
> +		.name = "btf_attributes",
> +		.key  = ARGP_btf_attributes,
> +		.doc  = "Allow generation of attributes in BTF. Attributes are the type tags and decl tags with the kind_flag set to 1.",
> +	},
>  	{
>  		.name = NULL,
>  	}
> @@ -1979,6 +1988,8 @@ static error_t pahole__options_parser(int key, char *arg,
>  		show_supported_btf_features(stdout);	exit(0);
>  	case ARGP_btf_features_strict:
>  		parse_btf_features(arg, true);		break;
> +	case ARGP_btf_attributes:
> +		conf_load.btf_attributes = true;	break;
>  	default:
>  		return ARGP_ERR_UNKNOWN;
>  	}





[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux