diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3e21cff5f..4ce0abfb3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ on: env: CARGO_TERM_COLOR: always - LLVM_VERSION: 18 + LLVM_VERSION: 19 jobs: lint: @@ -183,19 +183,51 @@ jobs: strategy: fail-fast: false matrix: - runner: + include: # macos-14 is arm64 per # https://github.com/actions/runner-images#available-images which # doesn't support nested virtualization per # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#limitations-for-arm64-macos-runners - - macos-13 - - ubuntu-22.04 - runs-on: ${{ matrix.runner }} + - target: x86_64-apple-darwin + os: macos-13 + - target: x86_64-unknown-linux-gnu + os: ubuntu-22.04 + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 with: submodules: recursive + - uses: dtolnay/rust-toolchain@master + with: + toolchain: nightly + components: rust-src + targets: aarch64-unknown-linux-musl,x86_64-unknown-linux-musl + + - uses: Swatinem/rust-cache@v2 + + - name: Install LLVM + run: | + set -euxo pipefail + # Use LLVM tarball from Rust CI, for two reasons: + # + # - LLVM packaged in brew or any other package repository for macOS + # is usually too old for bpf-linker. + # - Packages from apt.llvm.org, even though they follow new LLVM + # releases, are are often buggy. + + # Get the partial SHA from Rust nightly. + rustc_sha=$(rustc +nightly --version | grep -oE '[a-f0-9]{7,40}') + # Get the full SHA from GitHub. + rustc_sha=$(curl -s https://api.github.com/repos/rust-lang/rust/commits/$rustc_sha \ + --header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' \ + --header 'content-type: application/json' \ + | jq -r '.sha') + mkdir -p /usr/local/lib/rustc-llvm + wget -q -O - https://ci-artifacts.rust-lang.org/rustc-builds/$rustc_sha/rust-dev-nightly-${{ matrix.target }}.tar.xz | \ + tar -xJ --strip-components 2 -C /usr/local/lib/rustc-llvm + echo /usr/local/lib/rust-llvm >> $GITHUB_PATH + - name: Install prerequisites if: runner.os == 'Linux' # ubuntu-22.04 comes with clang 14[0] which doesn't include support for signed and 64bit @@ -210,11 +242,8 @@ jobs: # [1] https://github.com/llvm/llvm-project/commit/dc1c43d run: | set -euxo pipefail - wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc - echo deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-${{ env.LLVM_VERSION }} main | sudo tee /etc/apt/sources.list.d/llvm.list sudo apt update - sudo apt -y install clang-${{ env.LLVM_VERSION }} gcc-multilib llvm-${{ env.LLVM_VERSION }} locate qemu-system-{arm,x86} - echo /usr/lib/llvm-${{ env.LLVM_VERSION }}/bin >> $GITHUB_PATH + sudo apt -y install gcc-multilib locate qemu-system-{arm,x86} - name: bpf-linker if: runner.os == 'Linux' @@ -227,8 +256,6 @@ jobs: # The tar shipped on macOS doesn't support --wildcards, so we need GNU tar. # # The clang shipped on macOS doesn't support BPF, so we need LLVM from brew. - # - # We also need LLVM for bpf-linker, see comment below. run: | set -euxo pipefail brew update @@ -236,23 +263,16 @@ jobs: find /usr/local/bin -type l -exec sh -c 'readlink -f "$1" \ | grep -q ^/Library/Frameworks/Python.framework/Versions/' _ {} \; -exec rm -v {} \; HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 \ - brew install dpkg findutils gnu-tar llvm pkg-config qemu + brew install dpkg findutils gnu-tar llvm pkg-config qemu echo $(brew --prefix)/opt/findutils/libexec/gnubin >> $GITHUB_PATH echo $(brew --prefix)/opt/gnu-tar/libexec/gnubin >> $GITHUB_PATH echo $(brew --prefix)/opt/llvm/bin >> $GITHUB_PATH - - uses: dtolnay/rust-toolchain@master - with: - toolchain: nightly - components: rust-src - targets: aarch64-unknown-linux-musl,x86_64-unknown-linux-musl - - - uses: Swatinem/rust-cache@v2 - - name: bpf-linker if: runner.os == 'macOS' # NB: rustc doesn't ship libLLVM.so on macOS, so disable proxying (default feature). We also - # --force so that bpf-linker gets always relinked against the latest LLVM installed by brew. + # --force so that bpf-linker gets always relinked against the latest LLVM from the latest + # LLVM downloaded above. run: cargo install --force bpf-linker --git https://github.com/aya-rs/bpf-linker.git --no-default-features - name: Download debian kernels diff --git a/test/integration-ebpf/src/test.rs b/test/integration-ebpf/src/test.rs index 88f01e891..8774f5965 100644 --- a/test/integration-ebpf/src/test.rs +++ b/test/integration-ebpf/src/test.rs @@ -3,8 +3,10 @@ use aya_ebpf::{ bindings::xdp_action, + bpf_printk, macros::{kprobe, kretprobe, tracepoint, uprobe, uretprobe, xdp}, programs::{ProbeContext, RetProbeContext, TracePointContext, XdpContext}, + EbpfContext, }; #[xdp] @@ -30,8 +32,20 @@ pub fn test_kretprobe(_ctx: RetProbeContext) -> u32 { } #[tracepoint] -pub fn test_tracepoint(_ctx: TracePointContext) -> u32 { - 0 +pub fn test_tracepoint(ctx: TracePointContext) -> u32 { + // Some arbitrary work, to make the program running for some time and have + // a real `run_time` in `test_program_info`. + let mut res = ctx.uid().wrapping_add(ctx.pid()); + for _ in 0..10_000 { + res = res.wrapping_mul(123); + res ^= (ctx.pid() << 3) ^ (ctx.uid() << 4); + res = res.rotate_left(2); + res = res.reverse_bits(); + res = res.swap_bytes(); + res = res.count_ones(); + unsafe { bpf_printk!(b"number %u", res) }; + } + res } #[uprobe] diff --git a/test/integration-test/src/tests/info.rs b/test/integration-test/src/tests/info.rs index 7774709cc..70e55a5d1 100644 --- a/test/integration-test/src/tests/info.rs +++ b/test/integration-test/src/tests/info.rs @@ -214,6 +214,12 @@ fn test_prog_stats() { .unwrap(); prog.load().unwrap(); prog.attach("syscalls", "sys_enter_bpf").unwrap(); + + // Executing bpf syscalls to trigger `sys_enter_bpf` + for _ in 0..5 { + let _ = loaded_programs().collect::>(); + } + let test_prog = prog.info().unwrap(); kernel_assert!(