New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
libbpf: Implement BTFGen #2405
libbpf: Implement BTFGen #2405
Conversation
Master branch: 775a64e |
775a64e
to
86c7eca
Compare
Master branch: 86c7eca |
f81839f
to
e54c3a0
Compare
Master branch: 000daa0 |
e54c3a0
to
525008a
Compare
000daa0
to
71a3cdf
Compare
Master branch: 71a3cdf |
525008a
to
2e9efab
Compare
Master branch: 0e3a1c9 |
2e9efab
to
4133d3f
Compare
Master branch: e80f2a0 |
4133d3f
to
d6838c1
Compare
Master branch: 2a1aff6 |
d6838c1
to
075adda
Compare
BTFGen needs to run the core relocation logic in order to understand what are the types in the target BTF that involved in a given relocation. Currently bpf_core_apply_relo() calculates and **applies** a relocation to an instruction. Having both operations in the same function makes it difficult to only calculate the relocation without patching the instruction. This commit splits that logic in two different phases: (1) calculate the relocation and (2) patch the instruction. For the first phase bpf_core_apply_relo() is renamed to bpf_core_calc_relo_res() who is now only on charge of calculating the relocation, the second phase uses the already existing bpf_core_patch_insn(). bpf_object__relocate_core() uses both of them and the BTFGen will use only bpf_core_calc_relo_res(). Signed-off-by: Mauricio Vásquez <mauricio@kinvolk.io> Signed-off-by: Rafael David Tinoco <rafael.tinoco@aquasec.com> Signed-off-by: Lorenzo Fontana <lorenzo.fontana@elastic.co> Signed-off-by: Leonardo Di Donato <leonardo.didonato@elastic.co>
This commit extends libbpf with the features that are needed to implement BTFGen: - Implement bpf_core_create_cand_cache() and bpf_core_free_cand_cache() to handle candidates cache. - Expose bpf_core_add_cands() and bpf_core_free_cands to handle candidates list. - Expose bpf_core_calc_relo_insn() to bpftool. Signed-off-by: Mauricio Vásquez <mauricio@kinvolk.io> Signed-off-by: Rafael David Tinoco <rafael.tinoco@aquasec.com> Signed-off-by: Lorenzo Fontana <lorenzo.fontana@elastic.co> Signed-off-by: Leonardo Di Donato <leonardo.didonato@elastic.co>
This command is implemented under the "gen" command in bpftool and the syntax is the following: $ bpftool gen btf INPUT OUTPUT OBJECT(S) INPUT can be either a single BTF file or a folder containing BTF files, when it's a folder, a BTF file is generated for each BTF file contained in this folder. OUTPUT is the file (or folder) where generated files are stored and OBJECT(S) is the list of bpf objects we want to generate the BTF file(s) for (each generated BTF file contains all the types needed by all the objects). Signed-off-by: Mauricio Vásquez <mauricio@kinvolk.io> Signed-off-by: Rafael David Tinoco <rafael.tinoco@aquasec.com> Signed-off-by: Lorenzo Fontana <lorenzo.fontana@elastic.co> Signed-off-by: Leonardo Di Donato <leonardo.didonato@elastic.co>
Helper function to save a BTF object to a file. Signed-off-by: Mauricio Vásquez <mauricio@kinvolk.io> Signed-off-by: Rafael David Tinoco <rafael.tinoco@aquasec.com> Signed-off-by: Lorenzo Fontana <lorenzo.fontana@elastic.co> Signed-off-by: Leonardo Di Donato <leonardo.didonato@elastic.co> Acked-by: Andrii Nakryiko <andrii@kernel.org>
Add some structs and helpers that will be used by BTFGen in the next commits. Signed-off-by: Mauricio Vásquez <mauricio@kinvolk.io> Signed-off-by: Rafael David Tinoco <rafael.tinoco@aquasec.com> Signed-off-by: Lorenzo Fontana <lorenzo.fontana@elastic.co> Signed-off-by: Leonardo Di Donato <leonardo.didonato@elastic.co>
Master branch: 712d479 |
btfgen() receives the path of a source and destination BTF files and a list of BPF objects. This function records the relocations for all objects and then generates the BTF file by calling btfgen_get_btf() (implemented in the following commits). btfgen_record_obj() loads the BTF and BTF.ext sections of the BPF objects and loops through all CO-RE relocations. It uses bpf_core_calc_relo_insn() from libbpf and passes the target spec to btfgen_record_reloc() that saves the types involved in such relocation. Signed-off-by: Mauricio Vásquez <mauricio@kinvolk.io> Signed-off-by: Rafael David Tinoco <rafael.tinoco@aquasec.com> Signed-off-by: Lorenzo Fontana <lorenzo.fontana@elastic.co> Signed-off-by: Leonardo Di Donato <leonardo.didonato@elastic.co>
This commit implements the logic to record the relocation information for the different kind of relocations. btfgen_record_field_relo() uses the target specification to save all the types that are involved in a field-based CO-RE relocation. In this case types resolved and added recursively (using btfgen_put_type()). Only the struct and union members and their types) involved in the relocation are added to optimize the size of the generated BTF file. On the other hand, btfgen_record_type_relo() saves the types involved in a type-based CO-RE relocation. In this case all the members for the struct and union types are added. This is not strictly required since libbpf doesn't use them while performing this kind of relocation, however that logic could change on the future. Additionally, we expect that the number of this kind of relocations in an BPF object to be very low, hence the impact on the size of the generated BTF should be negligible. Finally, btfgen_record_enumval_relo() saves the whole enum type for enum-based relocations. Signed-off-by: Mauricio Vásquez <mauricio@kinvolk.io> Signed-off-by: Rafael David Tinoco <rafael.tinoco@aquasec.com> Signed-off-by: Lorenzo Fontana <lorenzo.fontana@elastic.co> Signed-off-by: Leonardo Di Donato <leonardo.didonato@elastic.co>
The last part of the BTFGen algorithm is to create a new BTF object with all the types that were recorded in the previous steps. This function performs two different steps: 1. Add the types to the new BTF object by using btf__add_type(). Some special logic around struct and unions is implemented to only add the members that are really used in the field-based relocations. The type ID on the new and old BTF objects is stored on a map. 2. Fix all the type IDs on the new BTF object by using the IDs saved in the previous step. Signed-off-by: Mauricio Vásquez <mauricio@kinvolk.io> Signed-off-by: Rafael David Tinoco <rafael.tinoco@aquasec.com> Signed-off-by: Lorenzo Fontana <lorenzo.fontana@elastic.co> Signed-off-by: Leonardo Di Donato <leonardo.didonato@elastic.co>
075adda
to
331684e
Compare
At least one diff in series https://patchwork.kernel.org/project/netdevbpf/list/?series=604884 expired. Closing PR. |
Pull request for series with
subject: libbpf: Implement BTFGen
version: 4
url: https://patchwork.kernel.org/project/netdevbpf/list/?series=604884