Re: [PATCH 7/9] bpf: Compile the BTF id whitelist data in vmlinux
From: Andrii Nakryiko <hidden>
Date: 2020-05-29 20:49:12
Also in:
bpf
On Thu, May 28, 2020 at 10:24 AM Jiri Olsa [off-list ref] wrote:
On Thu, May 14, 2020 at 03:46:26PM -0700, Andrii Nakryiko wrote: SNIPquoted
quoted
I was thinking of putting the names in __init section and generate the BTF ids on kernel start, but the build time generation seemed more convenient.. let's see the linking times with 'real size' whitelist and we can reconsiderBeing able to record such places where to put BTF ID in code would be really nice, as Alexei mentioned. There are many potential use cases where it would be good to have BTF IDs just put into arbitrary variables/arrays. This would trigger compilation error, if someone screws up the name, or function is renamed, or if function can be compiled out under some configuration. E.g., assuming some reasonable implementation of the macrohi, I'm struggling with this part.. to get some reasonable reference to function/name into 32 bits? any idea? ;-)
Well, you don't have to store actual pointer, right? E.g, emitting
something like this in assembly:
.global __BTF_ID___some_function
.type __BTF_ID___some_function, @object
.size __BTF_ID___some_function, 4
__BTF_ID___some_function:
.zero 4
Would reserve 4 bytes and emit __BTF_ID___some_function symbol. If we
can then post-process vmlinux image and for all symbols starting with
__BTF_ID___ find some_function BTF type id and put it into those 4
bytes, that should work, no?
Maybe generalize it to __BTF_ID__{func,struct,typedef}__some_function,
whatever, not sure. Just an idea.
jirkaquoted
static const u32 d_path_whitelist[] = { BTF_ID_FUNC(vfs_fallocate), #ifdef CONFIG_WHATEVER BTF_ID_FUNC(do_truncate), #endif }; Would be nice and very explicit. Given this is not going to be sorted, you won't be able to use binary search, but if whitelists are generally small, it should be fine as is. If not, hashmap could be built in runtime and would be, probably, faster than binary search for longer sets of BTF IDs. I wonder if we can do some assembly magic with generating extra symbols and/or relocations to achieve this? What do you think? Is it doable/desirable/better?quoted
thanks, jirka