On Fri, Sep 17, 2021 at 2:57 PM Alexei Starovoitov <alexei.starovoitov@xxxxxxxxx> wrote: > > From: Alexei Starovoitov <ast@xxxxxxxxxx> > > Given BPF program's BTF perform a linear search through kernel BTFs for > a possible candidate. > Then wire the result into bpf_core_apply_relo_insn(). > > Signed-off-by: Alexei Starovoitov <ast@xxxxxxxxxx> > --- > kernel/bpf/btf.c | 149 ++++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 147 insertions(+), 2 deletions(-) > [...] > + /* If candidate is not found in vmlinux's BTF then search in module's BTFs */ > + spin_lock_bh(&btf_idr_lock); > + idr_for_each_entry(&btf_idr, mod_btf, id) { > + if (!btf_is_module(mod_btf)) > + continue; > + /* linear search could be slow hence unlock/lock > + * the IDR to avoiding holding it for too long > + */ > + btf_get(mod_btf); > + spin_unlock_bh(&btf_idr_lock); > + err = bpf_core_add_cands(&local_cand, local_essent_len, > + mod_btf, > + btf_nr_types(main_btf), > + cands); > + if (err) > + btf_put(mod_btf); > + goto err_out; this couldn't have worked properly for modules, missing {} ? > + spin_lock_bh(&btf_idr_lock); > + btf_put(mod_btf); > + } > + spin_unlock_bh(&btf_idr_lock); > + > + return cands; > +err_out: > + bpf_core_free_cands(cands); > + return ERR_PTR(err); > +} > + [...]