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; 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; bool add_index_type = false;
uint32_t type_id_off; 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) if (btfe->percpu_shndx == 0 || !btfe->symtab)
goto out; goto out;

View File

@ -13,6 +13,7 @@ struct cu;
int btf_encoder__encode(); 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_ */ #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 Show the file and line number where the tags were defined, if available in
the debugging information. the debugging information.
.TP
.B \-\-skip_encoding_btf_vars
Do not encode VARs in BTF.
.TP .TP
.B \-l, \-\-show_first_biggest_size_base_type_member .B \-l, \-\-show_first_biggest_size_base_type_member
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 btf_encode;
static bool ctf_encode; static bool ctf_encode;
static bool first_obj_only; static bool first_obj_only;
static bool skip_encoding_btf_vars;
static uint8_t class__include_anonymous; static uint8_t class__include_anonymous;
static uint8_t class__include_nested_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_header_type 314
#define ARGP_size_bytes 315 #define ARGP_size_bytes 315
#define ARGP_range 316 #define ARGP_range 316
#define ARGP_skip_encoding_btf_vars 317
static const struct argp_option pahole__options[] = { static const struct argp_option pahole__options[] = {
{ {
@ -1087,6 +1089,11 @@ static const struct argp_option pahole__options[] = {
.key = 'J', .key = 'J',
.doc = "Encode as BTF", .doc = "Encode as BTF",
}, },
{
.name = "skip_encoding_btf_vars",
.key = ARGP_skip_encoding_btf_vars,
.doc = "Do not encode VARs in BTF."
},
{ {
.name = "force", .name = "force",
.key = 'j', .key = 'j',
@ -1207,6 +1214,8 @@ static error_t pahole__options_parser(int key, char *arg,
conf.range = arg; break; conf.range = arg; break;
case ARGP_header_type: case ARGP_header_type:
conf.header_type = arg; break; conf.header_type = arg; break;
case ARGP_skip_encoding_btf_vars:
skip_encoding_btf_vars = true; break;
default: default:
return ARGP_ERR_UNKNOWN; return ARGP_ERR_UNKNOWN;
} }
@ -2352,7 +2361,7 @@ static enum load_steal_kind pahole_stealer(struct cu *cu,
goto filter_it; goto filter_it;
if (btf_encode) { if (btf_encode) {
cu__encode_btf(cu, global_verbose, force); cu__encode_btf(cu, global_verbose, force, skip_encoding_btf_vars);
return LSK__KEEPIT; return LSK__KEEPIT;
} }