| #!/bin/bash | |
| # BPF metadata collection test | |
| # | |
| # SPDX-License-Identifier: GPL-2.0 | |
| set -e | |
| err=0 | |
| perfdata=$(mktemp /tmp/__perf_test.perf.data.XXXXX) | |
| cleanup() { | |
| rm -f "${perfdata}" | |
| rm -f "${perfdata}".old | |
| trap - EXIT TERM INT | |
| } | |
| trap_cleanup() { | |
| cleanup | |
| exit 1 | |
| } | |
| trap trap_cleanup EXIT TERM INT | |
| test_bpf_metadata() { | |
| echo "Checking BPF metadata collection" | |
| if ! perf check -q feature libbpf-strings ; then | |
| echo "Basic BPF metadata test [skipping - not supported]" | |
| err=0 | |
| return | |
| fi | |
| # This is a basic invocation of perf record | |
| # that invokes the perf_sample_filter BPF program. | |
| if ! perf record -e task-clock --filter 'ip > 0' \ | |
| -o "${perfdata}" sleep 1 2> /dev/null | |
| then | |
| echo "Basic BPF metadata test [Failed record]" | |
| err=1 | |
| return | |
| fi | |
| # The BPF programs that ship with "perf" all have the following | |
| # variable defined at compile time: | |
| # | |
| # const char bpf_metadata_perf_version[] SEC(".rodata") = <...>; | |
| # | |
| # This invocation looks for a PERF_RECORD_BPF_METADATA event, | |
| # and checks that its content contains the string given by | |
| # "perf version". | |
| VERS=$(perf version | awk '{print $NF}') | |
| if ! perf script --show-bpf-events -i "${perfdata}" | awk ' | |
| /PERF_RECORD_BPF_METADATA.*perf_sample_filter/ { | |
| header = 1; | |
| } | |
| /^ *entry/ { | |
| if (header) { header = 0; entry = 1; } | |
| } | |
| $0 !~ /^ *entry/ { | |
| entry = 0; | |
| } | |
| /perf_version/ { | |
| if (entry) print $NF; | |
| } | |
| ' | grep -qF "$VERS" | |
| then | |
| echo "Basic BPF metadata test [Failed invalid output]" | |
| err=1 | |
| return | |
| fi | |
| echo "Basic BPF metadata test [Success]" | |
| } | |
| test_bpf_metadata | |
| cleanup | |
| exit $err |