From 2791badd947e3abb459e5339a23a66d0a56c42d0 Mon Sep 17 00:00:00 2001 From: Dave Tucker Date: Fri, 1 Nov 2024 15:30:23 +0000 Subject: [PATCH] Release aya v0.13.1 Signed-off-by: Dave Tucker --- aya-log/Cargo.toml | 2 +- aya/CHANGELOG.md | 300 ++++++++++++++++++++++++++++++- aya/Cargo.toml | 2 +- test/integration-test/Cargo.toml | 2 +- 4 files changed, 297 insertions(+), 9 deletions(-) diff --git a/aya-log/Cargo.toml b/aya-log/Cargo.toml index 069a257d..01be1922 100644 --- a/aya-log/Cargo.toml +++ b/aya-log/Cargo.toml @@ -12,7 +12,7 @@ homepage.workspace = true edition.workspace = true [dependencies] -aya = { path = "../aya", version = "^0.13.0", features = ["async_tokio"] } +aya = { path = "../aya", version = "^0.13.1", features = ["async_tokio"] } aya-log-common = { path = "../aya-log-common", version = "^0.1.15", default-features = false } bytes = { workspace = true } log = { workspace = true } diff --git a/aya/CHANGELOG.md b/aya/CHANGELOG.md index 29729ebe..beacdef0 100644 --- a/aya/CHANGELOG.md +++ b/aya/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## 0.13.0 (2024-10-09) +## 0.13.1 (2024-11-01) ### Chore @@ -37,6 +37,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Bug Fixes + - Fill bss maps with zeros + The loader should fill bss maps with zeros according to the size of the + ELF section. + Failure to do so yields weird verifier messages as follows: + + ``` + cannot access ptr member ops with moff 0 in struct bpf_map with off 0 size 4 + ``` + + Reference to this in the cilium/ebpf code is here [1]. + I could not find a reference in libbpf. - Fix PerfEventArray resize logic There was a logic bug in the previously merged patch where we set the correctly calculated max_entries size with the original. @@ -262,9 +273,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 65 commits contributed to the release. - - 223 days passed between releases. - - 31 commits were understood as [conventional](https://www.conventionalcommits.org). + - 69 commits contributed to the release over the course of 241 calendar days. + - 247 days passed between releases. + - 32 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages ### Commit Details @@ -274,6 +285,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release aya-obj v0.2.1 ([`c6a34ca`](https://github.com/aya-rs/aya/commit/c6a34cade195d682e1eece5b71e3ab48e48f3cda)) + - Merge pull request #1073 from dave-tucker/reloc-bug ([`b2ac9fe`](https://github.com/aya-rs/aya/commit/b2ac9fe85db6c25d0b8155a75a2df96a80a19811)) + - Fill bss maps with zeros ([`ca0c32d`](https://github.com/aya-rs/aya/commit/ca0c32d1076af81349a52235a4b6fb3937a697b3)) + - Release aya-obj v0.2.0, aya v0.13.0, safety bump aya v0.13.0 ([`c169b72`](https://github.com/aya-rs/aya/commit/c169b727e6b8f8c2dda57f54b8c77f8b551025c6)) - Implement TCX ([`5478cac`](https://github.com/aya-rs/aya/commit/5478cac008471bdb80aa30733e4456b70ec1a5bd)) - Cache `nr_cpus` in a thread_local ([`d05110f`](https://github.com/aya-rs/aya/commit/d05110fd86f9b317d47ffb7cf5c00e588635d4cd)) - Clarify `Arc` usage ([`afd777b`](https://github.com/aya-rs/aya/commit/afd777b705312b7bafec2a116041a2318d3aa70f)) @@ -341,6 +356,279 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Appease new nightly clippy lints ([`e38eac6`](https://github.com/aya-rs/aya/commit/e38eac6352ccb5c2b44d621161a27898744ea397))
+## 0.13.0 (2024-10-09) + + + + + + + + + + + + + + + + + + + + + +### Chore + + - Add comments in `*_wrong_map` tests + - Rename bpf -> ebpf + - Fix unused_qualifications lints + This was failing the docs build. + +### Documentation + + - fix typo + - Use `Ebpf` instead of `Bpf` + +### New Features + + - Implement TCX + This commit adds the initial support for TCX + bpf links. This is a new, multi-program, attachment + type allows for the caller to specify where + they would like to be attached relative to other + programs at the attachment point using the LinkOrder + type. + - Provide a deprecated `BpfError` alias + - Rename Bpf to Ebpf + And BpfLoader to EbpfLoader. + This also adds type aliases to preserve the use of the old names, making + updating to a new Aya release less of a burden. These aliases are marked + as deprecated since we'll likely remove them in a later release. + +### Bug Fixes + + - Fix PerfEventArray resize logic + There was a logic bug in the previously merged patch where we + set the correctly calculated max_entries size with the original. + + To fix this and prevent regressions a unit test was added. + This highlighted that the original map definition needs to be + mutated in order for the max_entries change to be properly applied. + + As such, this resize logic moved out of aya::sys into aya::maps + - Set PerfEventArray max_entries to nCPUs + Both libbpf and cilium/ebpf have will set the max_entries of a + BPF_MAP_TYPE_PERF_EVENT_ARRAY to the number of online CPUs if + it was omitted at map definition time. This adds that same + logic to Aya. + - fix panic when creating map on custom ubuntu kernel + - fix rustdocs-args ordering in taplo to -D warnings + This fixes the current rustdoc build error by correcting the ordering of + `rustdoc-args` to `-D warnings`. Additionally, this also removes the + `recorder_arrays` field (defaults to false) so that the order is not + modified, which is what caused the error in the first place. + +### Other + + - use FdLink in SockOps programs + - remove unwrap and NonZero* in info + Addresses the feedback from #1007: + - remove panic from `unwrap` and `expect` + - Option => Option with `0` mapping to `None` + - revamp MapInfo be more friendly with older kernels + Adds detection for whether a field is available in `MapInfo`: + - For `map_type()`, we treturn new enum `MapType` instead of the integer + representation. + - For fields that can't be zero, we return `Option` type. + - For `name_as_str()`, it now uses the feature probe `bpf_name()` to + detect if field is available. + Although the feature probe checks for program name, it can also be + used for map name since they were both introduced in the same commit. + - revamp ProgramInfo be more friendly with older kernels + Purpose of this commit is to add detections for whether a field is + available in `ProgramInfo`. + - For `program_type()`, we return the new enum `ProgramType` instead of + the integer representation. + - For fields that we know cannot be zero, we return `Option` + type. + - For `name_as_str()`, it now also uses the feature probe `bpf_name()` + to detect if field is available or not. + - Two additional feature probes are added for the fields: + - `prog_info_map_ids()` probe -> `map_ids()` field + - `prog_info_gpl_compatible()` probe -> `gpl_compatible()` field + + With the `prog_info_map_ids()` probe, the previous implementation that + I had for `bpf_prog_get_info_by_fd()` is shortened to use the probe + instead of having to make 2 potential syscalls. + + The `test_loaded_at()` test is also moved into info tests since it is + better related to the info tests. + - add conversion u32 to enum type for prog, link, & attach type + Add conversion from u32 to program type, link type, and attach type. + Additionally, remove duplicate match statement for u32 conversion to + `BPF_MAP_TYPE_BLOOM_FILTER` & `BPF_MAP_TYPE_CGRP_STORAGE`. + + New error `InvalidTypeBinding` is created to represent when a + parsed/received value binding to a type is invalid. + This is used in the new conversions added here, and also replaces + `InvalidMapTypeError` in `TryFrom` for `bpf_map_type`. + - improve integration tests for info API + Improves the existing integraiton tests for `loaded_programs()` and + `loaded_maps()` in consideration for older kernels: + - Opt for `SocketFilter` program in tests since XDP requires v4.8 and + fragments requires v5.18. + - For assertion tests, first perform the assertion, if the assertion + fails, then it checks the host kernel version to see if it is above + the minimum version requirement. If not, then continue with test, + otherwise fail. + For assertions that are skipped, they're logged in stderr which can + be observed with `-- --nocapture`. + + This also fixes the `bpf_prog_get_info_by_fd()` call for kernels below + v4.15. If calling syscall on kernels below v4.15, it can produce an + `E2BIG` error because `check_uarg_tail_zero()` expects the entire + struct to all-zero bytes (which is caused from the map info). + + Instead, we first attempt the syscall with the map info filled, if it + returns `E2BIG`, then perform syscall again with empty closure. + + Also adds doc for which version a kernel feature was introduced for + better awareness. + + The tests have been verified kernel versions: + - 4.13.0 + - 4.15.0 + - 6.1.0 + - adjust bpf programs for big endian + In aya/src/sys/bpf.rs, there are several simple bpf programs written as + byte arrays. These need to be adjusted to account for big endian. + - expose run_time_ns and run_cnt fields in ProgramInfo + Added functions to expose `run_time_ns` & `run_cnt` statistics from + ProgramInfo/bpf_prog_info. + - add BPF_ENABLE_STATS syscall function + Add bpf syscall function for BPF_ENABLE_STATS to enable stats tracking + for benchmarking purposes. + + Additionally, move `#[cfg(test)]` annotation around the `Drop` trait + instead. Having separate functions causes some complications when + needing ownership/moving of the inner value `OwnedFd` when `Drop` is + manually implemented. + - :programs::uprobe: fix bad variable name + The variable fn_name was very much *not* the fn_name, but rather the + object file path. + - adjust symbol lookup tests for object crate alignment requirements + The object::File::parse API requires parameter to be aligned with 8 bytes. + Adjusted the Vec in the tests with miri to meet this requirement. + - add symbol lookup in associated debug files + This change enhances the logic for symbol lookup in uprobe or uretprobe. + If the symbol is not found in the original binary, the search continues + in the debug file associated through the debuglink section. Before + searching the symbol table, it compares the build IDs of the two files. + The symbol lookup will only be terminated if both build IDs exist and do + not match. This modification does not affect the existing symbol lookup + logic. + - Generate new bindings + - include license in crate workspace + This PR includes the licenses files in the crate workspace subdirectory. + Without this, they won't be showing on crates.io and would be giving out + errors on tooling such as rust2rpm. + - appease new nightly clippy lints + ``` + error: unnecessary qualification + --> aya/src/maps/ring_buf.rs:434:22 + | + 434 | ptr: ptr::NonNull::new(ptr).ok_or( + | ^^^^^^^^^^^^^^^^^ + | + note: the lint level is defined here + --> aya/src/lib.rs:72:5 + | + 72 | unused_qualifications, + | ^^^^^^^^^^^^^^^^^^^^^ + help: remove the unnecessary path segments + | + 434 - ptr: ptr::NonNull::new(ptr).ok_or( + 434 + ptr: NonNull::new(ptr).ok_or( + | + + error: unnecessary qualification + --> aya/src/maps/mod.rs:225:21 + | + 225 | let mut limit = std::mem::MaybeUninit::::uninit(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + help: remove the unnecessary path segments + | + 225 - let mut limit = std::mem::MaybeUninit::::uninit(); + 225 + let mut limit = mem::MaybeUninit::::uninit(); + | + + error: unnecessary qualification + --> aya/src/programs/mod.rs:614:9 + | + 614 | crate::obj::Program { + | ^^^^^^^^^^^^^^^^^^^ + | + help: remove the unnecessary path segments + | + 614 - crate::obj::Program { + 614 + obj::Program { + | + + error: unnecessary qualification + --> aya/src/util.rs:373:14 + | + 373 | unsafe { std::slice::from_raw_parts(bpf_name.as_ptr() as + *const _, length) } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + help: remove the unnecessary path segments + | + 373 - unsafe { std::slice::from_raw_parts(bpf_name.as_ptr() as + *const _, length) } + 373 + unsafe { slice::from_raw_parts(bpf_name.as_ptr() as *const _, + length) } + | + + error: unnecessary qualification + --> aya/src/maps/mod.rs:1130:47 + | + 1130 | .copy_from_slice(unsafe { + std::mem::transmute(TEST_NAME) }); + | ^^^^^^^^^^^^^^^^^^^ + | + note: the lint level is defined here + --> aya/src/lib.rs:72:5 + | + 72 | unused_qualifications, + | ^^^^^^^^^^^^^^^^^^^^^ + help: remove the unnecessary path segments + | + 1130 - .copy_from_slice(unsafe { + std::mem::transmute(TEST_NAME) }); + 1130 + .copy_from_slice(unsafe { + mem::transmute(TEST_NAME) }); + | + ``` + +### Performance + + - cache `nr_cpus` in a thread_local + +### Test + + - adjust test byte arrays for big endian + Adding support for s390x (big endian architecture) and found that some + of the unit tests have structures and files implemented as byte arrays. + They are all coded as little endian and need a bug endian version to + work properly. + +### New Features (BREAKING) + + - Rename BpfRelocationError -> EbpfRelocationError + - Rename BpfSectionKind to EbpfSectionKind + ## 0.12.0 (2024-02-28) @@ -1713,7 +2001,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 45 commits contributed to the release. + - 45 commits contributed to the release over the course of 57 calendar days. - 79 days passed between releases. - 13 commits were understood as [conventional](https://www.conventionalcommits.org). - 3 unique issues were worked on: [#256](https://github.com/aya-rs/aya/issues/256), [#264](https://github.com/aya-rs/aya/issues/264), [#268](https://github.com/aya-rs/aya/issues/268) @@ -2704,7 +2992,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 121 commits contributed to the release. + - 121 commits contributed to the release over the course of 110 calendar days. - 102 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages diff --git a/aya/Cargo.toml b/aya/Cargo.toml index bafe5f14..14099ff3 100644 --- a/aya/Cargo.toml +++ b/aya/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aya" -version = "0.13.0" +version = "0.13.1" description = "An eBPF library with a focus on developer experience and operability." keywords = ["bpf", "ebpf", "kernel", "linux"] readme = "README.md" diff --git a/test/integration-test/Cargo.toml b/test/integration-test/Cargo.toml index a481bf14..8901d2c4 100644 --- a/test/integration-test/Cargo.toml +++ b/test/integration-test/Cargo.toml @@ -11,7 +11,7 @@ edition.workspace = true [dependencies] anyhow = { workspace = true, features = ["std"] } assert_matches = { workspace = true } -aya = { path = "../../aya", version = "^0.13.0", default-features = false } +aya = { path = "../../aya", version = "^0.13.1", default-features = false } aya-log = { path = "../../aya-log", version = "^0.2.1", default-features = false } aya-obj = { path = "../../aya-obj", version = "^0.2.1", default-features = false } env_logger = { workspace = true }