On Fri, Dec 8, 2023 at 2:04 PM Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx> wrote: > > > I feel like embedding some sort of ID inside the instruction is very.. > unusual, shall we say? yeah. no magic numbers inside insns pls. I don't like JA_CFG name, since I read CFG as control flow graph, while you probably meant CFG as configurable. How about BPF_JA_OR_NOP ? Then in combination with BPF_JMP or BPF_JMP32 modifier the insn->off|imm will be used. 1st bit in src_reg can indicate the default action: nop or jmp. In asm it may look like asm("goto_or_nop +5") > 2. bpf_static_branch_{likely,unlikely}() macro accepts a reference to > one such special global variable and and instructs compiler to emit > relocation between static key variable and JMP_CFG instruction. > > Libbpf will properly update these relocations during static linking > and subprog rearrangement, just like we do it for map references > today. Right. libbpf has RELO_SUBPROG_ADDR. This new relo will be pretty much that. And we have proper C syntax for taking an address: &&label. The bpf_static_branch macro can use it. We wanted to add it for a long time to support proper switch() and jmp tables. I don't like IDs and new map type for this. The macro can have 'branch_name' as one of the arguments and it will populate addresses of insns into "name.static_branch" section. >From libbpf pov it will be yet another global section which is represented as a traditional bpf array of one element. No extra handling on the libbpf side. The question is how to represent the "address" of the insn. I think 4 byte prog_id + 4 byte insn_idx will do. Then bpf prog can pass such "address" into bpf_static_branch_enable/disable kfunc. The user space can iterate over 8 byte "addresses" in that 1 element array map and call BPF_STATIC_BRANCH_ENABLE/DISABLE syscall cmds. We can have a helper on libbpf side for that. I see no need to introduce a new map type just to reuse map_update_elem cmd.