btf_encoder: Allow disabling BTF var encoding.

A new feature was introduced in commit f3d9054ba8 ("btf_encoder: Teach
pahole to store percpu variables in vmlinux BTF.") which encodes kernel
percpu variables into BTF. Add a flag --skip_encoding_btf_vars to allow
users to toggle this feature off, so that the rollout of pahole v1.18
can be protected by potential bugs in this feature.

Committer notes:

Added missing man page entry.

Signed-off-by: Hao Luo <haoluo@google.com>
Cc: Alexei Starovoitov <alexei.starovoitov@gmail.com>
Cc: Andrii Nakryiko <andrii.nakryiko@gmail.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: Yonghong Song <yhs@fb.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Hao Luo 2020-09-21 12:53:09 -07:00 committed by Arnaldo Carvalho de Melo
parent f5847773d9
commit da4ad2f650
4 changed files with 20 additions and 3 deletions

View File

@ -237,7 +237,8 @@ static struct variable *hashaddr__find_variable(const struct hlist_head hashtabl
return NULL;
}
int cu__encode_btf(struct cu *cu, int verbose, bool force)
int cu__encode_btf(struct cu *cu, int verbose, bool force,
bool skip_encoding_vars)
{
bool add_index_type = false;
uint32_t type_id_off;
@ -314,6 +315,8 @@ int cu__encode_btf(struct cu *cu, int verbose, bool force)
}
}
if (skip_encoding_vars)
goto out;
if (btfe->percpu_shndx == 0 || !btfe->symtab)
goto out;

View File

@ -13,6 +13,7 @@ struct cu;
int btf_encoder__encode();
int cu__encode_btf(struct cu *cu, int verbose, bool force);
int cu__encode_btf(struct cu *cu, int verbose, bool force,
bool skip_encoding_vars);
#endif /* _BTF_ENCODER_H_ */

View File

@ -177,6 +177,10 @@ Show only structs with at least NR_HOLES holes.
Show the file and line number where the tags were defined, if available in
the debugging information.
.TP
.B \-\-skip_encoding_btf_vars
Do not encode VARs in BTF.
.TP
.B \-l, \-\-show_first_biggest_size_base_type_member
Show first biggest size base_type member.

View File

@ -26,6 +26,7 @@
static bool btf_encode;
static bool ctf_encode;
static bool first_obj_only;
static bool skip_encoding_btf_vars;
static uint8_t class__include_anonymous;
static uint8_t class__include_nested_anonymous;
@ -809,6 +810,7 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = dwarves_print_version;
#define ARGP_header_type 314
#define ARGP_size_bytes 315
#define ARGP_range 316
#define ARGP_skip_encoding_btf_vars 317
static const struct argp_option pahole__options[] = {
{
@ -1087,6 +1089,11 @@ static const struct argp_option pahole__options[] = {
.key = 'J',
.doc = "Encode as BTF",
},
{
.name = "skip_encoding_btf_vars",
.key = ARGP_skip_encoding_btf_vars,
.doc = "Do not encode VARs in BTF."
},
{
.name = "force",
.key = 'j',
@ -1207,6 +1214,8 @@ static error_t pahole__options_parser(int key, char *arg,
conf.range = arg; break;
case ARGP_header_type:
conf.header_type = arg; break;
case ARGP_skip_encoding_btf_vars:
skip_encoding_btf_vars = true; break;
default:
return ARGP_ERR_UNKNOWN;
}
@ -2352,7 +2361,7 @@ static enum load_steal_kind pahole_stealer(struct cu *cu,
goto filter_it;
if (btf_encode) {
cu__encode_btf(cu, global_verbose, force);
cu__encode_btf(cu, global_verbose, force, skip_encoding_btf_vars);
return LSK__KEEPIT;
}