On Fri, Apr 23, 2021 at 2:37 PM Martin KaFai Lau <kafai@xxxxxx> wrote: > > BTF is currently generated for functions that are in ftrace list > or extern. > > A recent use case also needs BTF generated for functions included in > allowlist. In particular, the kernel > commit e78aea8b2170 ("bpf: tcp: Put some tcp cong functions in allowlist for bpf-tcp-cc") > allows bpf program to directly call a few tcp cc kernel functions. Those > functions are specified under an ELF section .BTF_ids. The symbols > in this ELF section is like __BTF_ID__func__<kernel_func>__[digit]+. > For example, __BTF_ID__func__cubictcp_init__1. Those kernel > functions are currently allowed only if CONFIG_DYNAMIC_FTRACE is > set to ensure they are in the ftrace list but this kconfig dependency > is unnecessary. > > pahole can generate BTF for those kernel functions if it knows they > are in the allowlist. This patch is to capture those symbols > in the .BTF_ids section and generate BTF for them. > > Cc: Andrii Nakryiko <andrii@xxxxxxxxxx> > Signed-off-by: Martin KaFai Lau <kafai@xxxxxx> > --- I wonder if we just record all functions how bad that would be. Jiri, do you remember from the time you were experimenting with static functions how much more functions we'd be recording if we didn't do ftrace filtering? > btf_encoder.c | 136 +++++++++++++++++++++++++++++++++++++++++++++++--- > libbtf.c | 10 ++++ > libbtf.h | 2 + > 3 files changed, 142 insertions(+), 6 deletions(-) > > diff --git a/btf_encoder.c b/btf_encoder.c > index 80e896961d4e..48c183915ddd 100644 > --- a/btf_encoder.c > +++ b/btf_encoder.c > @@ -106,6 +106,121 @@ static int collect_function(struct btf_elf *btfe, GElf_Sym *sym, > return 0; > } > > +#define BTF_ID_FUNC_PREFIX "__BTF_ID__func__" > +#define BTF_ID_FUNC_PREFIX_LEN (sizeof(BTF_ID_FUNC_PREFIX) - 1) > + > +static char **listed_functions; > +static int listed_functions_alloc; > +static int listed_functions_cnt; maybe just use struct btf as a container of strings, which is what you need here? You can do btf__add_str() and btf__find_str(), which are both fast and memory-efficient, and you won't have to manage all the memory and do sorting, etc, etc. [...]