On Tue, Dec 10, 2024 at 7:57 AM Alexei Starovoitov <alexei.starovoitov@xxxxxxxxx> wrote: > > On Tue, Dec 10, 2024 at 12:56 AM Anton Protopopov <aspsk@xxxxxxxxxxxxx> wrote: > > > > > > > > This makes total sense to treat all BPF objects in fd_array the same > > > way. With BTFs the problem is that, currently, a btf fd can end up > > > either in used_btfs or kfunc_btf_tab. I will take a look at how easy > > > it is to merge those two. > > > > So, currently during program load BTFs are parsed from file > > descriptors and are stored in two places: env->used_btfs and > > env->prog->aux->kfunc_btf_tab: > > > > 1) env->used_btfs populated only when a DW load with the > > (src_reg == BPF_PSEUDO_BTF_ID) flag set is performed > > > > 2) kfunc_btf_tab is populated by __find_kfunc_desc_btf(), > > and the source is attr->fd_array[offset]. The kfunc_btf_tab is > > sorted by offset to allow faster search > > > > So, to merge them something like this might be done: > > > > 1) If fd_array_cnt != 0, then on load create a [sorted by offset] > > table "used_btfs", formatted similar to kfunc_btf_tab in (2) > > above. > > > > 2) On program load change (1) to add a btf to this new sorted > > used_btfs. As there is no corresponding offset, just use > > offset=-1 (not literally like this, as bsearch() wants unique > > keys, so by offset=-1 an array of btfs, aka, old used_maps, > > should be stored) > > > > Looks like this, conceptually, doesn't change things too much: kfuncs > > btfs will still be searchable in log(n) time, the "normal" btfs will > > still be searched in used_btfs in linear time. > > > > (The other way is to just allow kfunc btfs to be loaded from fd_array > > if fd_array_cnt != 0, as it is done now, but as you've mentioned > > before, you had other use cases in mind, so this won't work.) > > This is getting a bit too complex. > I think Andrii is asking to keep BTFs if they are in fd_array. > No need to combine kfunc_btf_tab and used_btfs. > I think adding BTFs from fd_array to prog->aux->used_btfs > should do it. Exactly, no need to do major changes, let's just add those BTFs into used_btfs, that's all.