Re: [PATCH v1] pahole: Add --skip_missing option

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

 



Em Tue, Oct 19, 2021 at 11:42:00AM +0100, Douglas RAILLARD escreveu:
> From: Douglas Raillard <douglas.raillard@xxxxxxx>
> 
> Add a --skip_missing option that allows pahole to keep going in case one
> of the type passed to -C (e.g. via a file) does not exist.
> 
> This is useful for intropsection software such as debugging kernel
> modules that can handle various kernel configurations and versions for
> which some recently added types are missing. The consumer of the header
> becomes responsible of gating the uses of the type with #ifdef
> CONFIG_XXX, rather than pahole bailing out on the first unknown type.

Cherry picking this out of order, as its easy to review:

Committer testing:

Before:

  $ pahole tcp_splice_state,xxfrm_policy_queue,list_head tcp.o
  struct tcp_splice_state {
        struct pipe_inode_info *   pipe;                 /*     0     8 */
        size_t                     len;                  /*     8     8 */
        unsigned int               flags;                /*    16     4 */

        /* size: 24, cachelines: 1, members: 3 */
        /* padding: 4 */
        /* last cacheline: 24 bytes */
  };
  pahole: type 'xxfrm_policy_queue' not found
  $

After:

  $ pahole --help |& grep skip
        --skip=COUNT           Skip COUNT input records
        --skip_encoding_btf_tag   Do not encode TAGs in BTF.
        --skip_encoding_btf_vars   Do not encode VARs in BTF.
        --skip_missing         skip missing types passed to -C rather than stop
  $ pahole --skip_missing tcp_splice_state,xxfrm_policy_queue,list_head tcp.o
  struct tcp_splice_state {
        struct pipe_inode_info *   pipe;                 /*     0     8 */
        size_t                     len;                  /*     8     8 */
        unsigned int               flags;                /*    16     4 */

        /* size: 24, cachelines: 1, members: 3 */
        /* padding: 4 */
        /* last cacheline: 24 bytes */
  };
  struct list_head {
        struct list_head *         next;                 /*     0     8 */
        struct list_head *         prev;                 /*     8     8 */

        /* size: 16, cachelines: 1, members: 2 */
        /* last cacheline: 16 bytes */
  };
  pahole: type 'xxfrm_policy_queue' not found
  $

Signed-off-by: Douglas Raillard <douglas.raillard@xxxxxxx>
Tested-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
 
> Signed-off-by: Douglas Raillard <douglas.raillard@xxxxxxx>
> ---
>  dwarves.h |  2 ++
>  pahole.c  | 17 +++++++++++++++--
>  2 files changed, 17 insertions(+), 2 deletions(-)
> 
> diff --git a/dwarves.h b/dwarves.h
> index 30d33fa..6be6094 100644
> --- a/dwarves.h
> +++ b/dwarves.h
> @@ -43,6 +43,7 @@ struct conf_fprintf;
>   * @get_addr_info - wheter to load DW_AT_location and other addr info
>   * @nr_jobs - -j argument, number of threads to use
>   * @ptr_table_stats - print developer oriented ptr_table statistics.
> + * @skip_missing - skip missing types rather than bailing out.
>   */
>  struct conf_load {
>  	enum load_steal_kind	(*steal)(struct cu *cu,
> @@ -59,6 +60,7 @@ struct conf_load {
>  	bool			ignore_labels;
>  	bool			ptr_table_stats;
>  	bool			skip_encoding_btf_tag;
> +	bool			skip_missing;
>  	uint8_t			hashtable_bits;
>  	uint8_t			max_hashtable_bits;
>  	uint16_t		kabi_prefix_len;
> diff --git a/pahole.c b/pahole.c
> index 80271b5..68e3c8a 100644
> --- a/pahole.c
> +++ b/pahole.c
> @@ -1125,6 +1125,7 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = dwarves_print_version;
>  #define ARGP_hashbits		   329
>  #define ARGP_devel_stats	   330
>  #define ARGP_skip_encoding_btf_tag 331
> +#define ARGP_skip_missing          332
>  
>  static const struct argp_option pahole__options[] = {
>  	{
> @@ -1500,6 +1501,11 @@ static const struct argp_option pahole__options[] = {
>  		.key  = ARGP_skip_encoding_btf_tag,
>  		.doc  = "Do not encode TAGs in BTF."
>  	},
> +	{
> +		.name = "skip_missing",
> +		.key  = ARGP_skip_missing,
> +		.doc = "skip missing types passed to -C rather than stop",
> +	},
>  	{
>  		.name = NULL,
>  	}
> @@ -1650,6 +1656,8 @@ static error_t pahole__options_parser(int key, char *arg,
>  		conf_load.ptr_table_stats = true;	break;
>  	case ARGP_skip_encoding_btf_tag:
>  		conf_load.skip_encoding_btf_tag = true;	break;
> +	case ARGP_skip_missing:
> +		conf_load.skip_missing = true;          break;
>  	default:
>  		return ARGP_ERR_UNKNOWN;
>  	}
> @@ -2879,8 +2887,13 @@ out_btf:
>  		static type_id_t class_id;
>  		struct tag *class = cu__find_type_by_name(cu, prototype->name, include_decls, &class_id);
>  
> -		if (class == NULL)
> -			return ret; // couldn't find that class name in this CU, continue to the next one.
> +		// couldn't find that class name in this CU, continue to the next one.
> +		if (class == NULL) {
> +			if (conf_load->skip_missing)
> +				continue;
> +			else
> +				return ret;
> +		}
>  
>  		if (prototype->nr_args != 0 && !tag__is_struct(class)) {
>  			fprintf(stderr, "pahole: attributes are only supported with 'class' and 'struct' types\n");
> -- 
> 2.25.1

-- 

- Arnaldo




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux