On Mon, Jul 18, 2022 at 12:07 PM Stanislav Fomichev <sdf@xxxxxxxxxx> wrote: > > Motivation: > > Our bpf programs have a bunch of options which are set at the loading > time. After loading, they don't change. We currently use array map > to store them and bpf program does the following: > > val = bpf_map_lookup_elem(&config_map, &key); > if (likely(val && *val)) { > // do some optional feature > } > > Since the configuration is static and we have a lot of those features, > I feel like we're wasting precious cycles doing dynamic lookups > (and stalling on memory loads). > > I was assuming that converting those to some fake kconfig options > would solve it, but it still seems like kconfig is stored in the > global map and kconfig entries are resolved dynamically. > > Proposal: > > Resolve kconfig options statically upon loading. Basically rewrite > ld+ldx to two nops and 'mov val, x'. > > I'm also trying to rewrite conditional jump when the condition is > !imm. This seems to be catching all the cases in my program, but > it's probably too hacky. > > I've attached very raw RFC patch to demonstrate the idea. Anything > I'm missing? Any potential problems with this approach? Have you considered using global variables for that? With skeleton the user space has a natural way to set all of these knobs after doing skel_open and before skel_load. Then the verifier sees them as readonly vars and automatically converts LDX into fixed constants and if the code looks like if (my_config_var) then the verifier will remove all the dead code too.