All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jiri Olsa <jolsa@redhat.com>
To: Shuyi Cheng <chengshuyi@linux.alibaba.com>
Cc: Andrii Nakryiko <andrii.nakryiko@gmail.com>,
	Arnaldo Carvalho de Melo <arnaldo.melo@gmail.com>,
	dwarves@vger.kernel.org, wenan.mao@linux.alibaba.com,
	Jiri Olsa <jolsa@kernel.org>
Subject: Re: [PATCH v2] pahole: Add --kabi_prefix flag
Date: Wed, 19 May 2021 22:07:03 +0200	[thread overview]
Message-ID: <YKVv57HsgJYmCTFi@krava> (raw)
In-Reply-To: <ec80d351-ac2f-5c48-c339-c2c503d36d68@linux.alibaba.com>

On Wed, May 19, 2021 at 10:44:44AM +0800, Shuyi Cheng wrote:
> To solve problems similar to _RH_KABI_REPLACE. The _RH_KABI_REPLACE(_orig,
> _new) macros perserve size alignment and kabi agreement between _orig and
> _new.Below is the definition of this macro:
> 
> # define _RH_KABI_REPLACE(_orig, _new)            \
>     union {                        \
>         _new;                    \
>         struct {                \
>             _orig;                \
>         } __UNIQUE_ID(rh_kabi_hide);        \
>         __RH_KABI_CHECK_SIZE_ALIGN(_orig, _new);    \
>     }

hi,
that macro sounds familiar ;-) I think this should be already
solved directly in the header file by this one:

  https://gitlab.com/cki-project/kernel-ark/-/commit/331be9c5a436057ee852075c102d9d90a9046a30

jirka

> 
> 
> __UNIQUE_ID uses the __COUNTER__ macro, and the __COUNTER__ macro is
> automatically incremented by 1 every time it is precompiled. Therefore, in
> different compilation units, the same structure has different names.Here is
> a concrete example:
> 
> struct acpi_dev_node {
>     union {
>         struct acpi_device *companion;
>         struct {
>             void *handle;
>         } __UNIQUE_ID_rh_kabi_hide29;
>         union {        };
>     };
> };
> struct acpi_dev_node {
>     union {
>         struct acpi_device *companion;
>         struct {
>             void *handle;
>         } __UNIQUE_ID_rh_kabi_hide31;
>         union {        };
>     };
> };
> 
> Finally, it will cause the btf algorithm to de-duplication efficiency is not
> high, and time-consuming. For example, running ./pahole -J
> vmlinux-3.10.0-1160.el7.x86_64 without --kabi_prefix flag, the running time
> is:
>                 real 8m28.912s
>                 user 8m27.271s
>                 sys 0m1.471s
> And the size of the generated btf segment is 30678240 bytes.
> 
> After adding the patch, running ./pahole
> --kabi_prefix=__UNIQUE_ID_rh_kabi_hide -J vmlinux-3.10.0-1160.el7.x86_64.
> The running time of the command is:
>                 real 0m19.634s
>                 user 0m18.457s
>                 sys 0m1.169s
> And the size of the generated btf segment is 3117719 bytes.
> 
> ---
> 
> v1:https://lore.kernel.org/dwarves/CAEf4Bzazh4RNCY3rGRRXfO2wJ7DSiMx8w+61B_hjhu9FrOffpQ@mail.gmail.com
> v1->v2:
> --Change btf_prefix to --kabi_prefix.
> --Add man page.
> --Add space after if and comma.
> 
>  man-pages/pahole.1 |  4 ++++
>  pahole.c           | 10 ++++++++++
>  pahole_strings.h   |  2 ++
>  strings.c          |  9 ++++++++-
>  4 files changed, 24 insertions(+), 1 deletion(-)
> 
> diff --git a/man-pages/pahole.1 b/man-pages/pahole.1
> index a10738f..2659fe6 100644
> --- a/man-pages/pahole.1
> +++ b/man-pages/pahole.1
> @@ -340,6 +340,10 @@ Show a traditional string version, i.e.: "v1.18".
>  Show a numeric only version, suitable for use in Makefiles and scripts
> where
>  one wants to know what if the installed version has some feature, i.e.: 118
> instead of "v1.18".
> 
> +.TP
> +.B \-\-kabi_prefix=STRING
> +When the prefix of the string is STRING, treat the string as STRING.
> +
>  .SH NOTES
> 
>  To enable the generation of debugging information in the Linux kernel build
> diff --git a/pahole.c b/pahole.c
> index dc40ccf..6a700d9 100644
> --- a/pahole.c
> +++ b/pahole.c
> @@ -24,6 +24,7 @@
>  #include "btf_encoder.h"
>  #include "libbtf.h"
>  #include "lib/bpf/src/libbpf.h"
> +#include "pahole_strings.h"
> 
>  static bool btf_encode;
>  static bool ctf_encode;
> @@ -855,6 +856,7 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = dwarves_print_version;
>  #define ARGP_btf_gen_floats	   322
>  #define ARGP_btf_gen_all	   323
>  #define ARGP_with_flexible_array   324
> +#define ARGP_kabi_prefix   325
> 
>  static const struct argp_option pahole__options[] = {
>  	{
> @@ -1140,6 +1142,12 @@ static const struct argp_option pahole__options[] = {
>  		.doc  = "Path to the base BTF file",
>  	},
>  	{
> +		.name = "kabi_prefix",
> +		.key = ARGP_kabi_prefix,
> +		.arg = "STRING",
> +		.doc = "When the prefix of the string is STRING, treat the string as
> STRING.",
> +	},
> +	{
>  		.name = "btf_encode",
>  		.key  = 'J',
>  		.doc  = "Encode as BTF",
> @@ -1297,6 +1305,8 @@ static error_t pahole__options_parser(int key, char
> *arg,
>  		btf_encode_force = true;		break;
>  	case ARGP_btf_base:
>  		base_btf_file = arg;			break;
> +	case ARGP_kabi_prefix:
> +		kabi_prefix = arg;		break;
>  	case ARGP_numeric_version:
>  		print_numeric_version = true;		break;
>  	case ARGP_btf_gen_floats:
> diff --git a/pahole_strings.h b/pahole_strings.h
> index 522fbf2..a836ba8 100644
> --- a/pahole_strings.h
> +++ b/pahole_strings.h
> @@ -14,6 +14,8 @@ struct strings {
>  	struct btf *btf;
>  };
> 
> +extern const char *kabi_prefix;
> +
>  struct strings *strings__new(void);
> 
>  void strings__delete(struct strings *strings);
> diff --git a/strings.c b/strings.c
> index d37f49d..d1a54ec 100644
> --- a/strings.c
> +++ b/strings.c
> @@ -17,6 +17,8 @@
>  #include "dutil.h"
>  #include "lib/bpf/src/libbpf.h"
> 
> +const char *kabi_prefix;
> +
>  struct strings *strings__new(void)
>  {
>  	struct strings *strs = malloc(sizeof(*strs));
> @@ -48,7 +50,12 @@ strings_t strings__add(struct strings *strs, const char
> *str)
>  	if (str == NULL)
>  		return 0;
> 
> -	index = btf__add_str(strs->btf, str);
> +	if (kabi_prefix &&
> +		strncmp(str, kabi_prefix, strlen(kabi_prefix)) == 0)
> +		index = btf__add_str(strs->btf, kabi_prefix);
> +	else
> +		index = btf__add_str(strs->btf, str);
> +		
>  	if (index < 0)
>  		return 0;
> 
> -- 
> 1.8.3.1
> 


  reply	other threads:[~2021-05-19 20:07 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-17 12:06 [PATCH] btf: Add --btf_prefix flag 程书意
2021-05-17 14:42 ` Arnaldo Carvalho de Melo
2021-05-18  9:02   ` chengshuyi
2021-05-18 12:49     ` Arnaldo Carvalho de Melo
2021-05-18 18:30       ` Andrii Nakryiko
2021-05-19  2:44         ` [PATCH v2] pahole: Add --kabi_prefix flag Shuyi Cheng
2021-05-19 20:07           ` Jiri Olsa [this message]
     [not found]             ` <5D76A4F3-6F5A-4061-A274-34FFE5CBA338@gmail.com>
2021-05-19 21:18               ` Jiri Olsa
2021-05-19 21:36                 ` Arnaldo
2021-05-20 10:27             ` Shuyi Cheng
2021-05-20 11:49               ` Jiri Olsa
2021-05-20 12:08                 ` Shuyi Cheng
2021-05-20 12:18                   ` Jiri Olsa
2021-05-20 12:30                     ` Shuyi Cheng
2021-05-20 15:25           ` Jiri Olsa
2021-05-21  1:44             ` [PATCH v3] " Shuyi Cheng
2021-05-27 16:43               ` Arnaldo Carvalho de Melo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YKVv57HsgJYmCTFi@krava \
    --to=jolsa@redhat.com \
    --cc=andrii.nakryiko@gmail.com \
    --cc=arnaldo.melo@gmail.com \
    --cc=chengshuyi@linux.alibaba.com \
    --cc=dwarves@vger.kernel.org \
    --cc=jolsa@kernel.org \
    --cc=wenan.mao@linux.alibaba.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.