1*2f5d370dSJames Clark#!/bin/bash 2edf2cadfSBlake Jones# SPDX-License-Identifier: GPL-2.0 3edf2cadfSBlake Jones# 4edf2cadfSBlake Jones# BPF metadata collection test. 5edf2cadfSBlake Jones 6edf2cadfSBlake Jonesset -e 7edf2cadfSBlake Jones 8edf2cadfSBlake Joneserr=0 9edf2cadfSBlake Jonesperfdata=$(mktemp /tmp/__perf_test.perf.data.XXXXX) 10edf2cadfSBlake Jones 11edf2cadfSBlake Jonescleanup() { 12edf2cadfSBlake Jones rm -f "${perfdata}" 13edf2cadfSBlake Jones rm -f "${perfdata}".old 14edf2cadfSBlake Jones trap - EXIT TERM INT 15edf2cadfSBlake Jones} 16edf2cadfSBlake Jones 17edf2cadfSBlake Jonestrap_cleanup() { 18edf2cadfSBlake Jones cleanup 19edf2cadfSBlake Jones exit 1 20edf2cadfSBlake Jones} 21edf2cadfSBlake Jonestrap trap_cleanup EXIT TERM INT 22edf2cadfSBlake Jones 23edf2cadfSBlake Jonestest_bpf_metadata() { 24edf2cadfSBlake Jones echo "Checking BPF metadata collection" 25edf2cadfSBlake Jones 26edf2cadfSBlake Jones if ! perf check -q feature libbpf-strings ; then 27edf2cadfSBlake Jones echo "Basic BPF metadata test [skipping - not supported]" 28edf2cadfSBlake Jones err=0 29edf2cadfSBlake Jones return 30edf2cadfSBlake Jones fi 31edf2cadfSBlake Jones 32edf2cadfSBlake Jones # This is a basic invocation of perf record 33edf2cadfSBlake Jones # that invokes the perf_sample_filter BPF program. 34edf2cadfSBlake Jones if ! perf record -e task-clock --filter 'ip > 0' \ 35edf2cadfSBlake Jones -o "${perfdata}" sleep 1 2> /dev/null 36edf2cadfSBlake Jones then 37edf2cadfSBlake Jones echo "Basic BPF metadata test [Failed record]" 38edf2cadfSBlake Jones err=1 39edf2cadfSBlake Jones return 40edf2cadfSBlake Jones fi 41edf2cadfSBlake Jones 42edf2cadfSBlake Jones # The BPF programs that ship with "perf" all have the following 43edf2cadfSBlake Jones # variable defined at compile time: 44edf2cadfSBlake Jones # 45edf2cadfSBlake Jones # const char bpf_metadata_perf_version[] SEC(".rodata") = <...>; 46edf2cadfSBlake Jones # 47edf2cadfSBlake Jones # This invocation looks for a PERF_RECORD_BPF_METADATA event, 48edf2cadfSBlake Jones # and checks that its content contains the string given by 49edf2cadfSBlake Jones # "perf version". 50edf2cadfSBlake Jones VERS=$(perf version | awk '{print $NF}') 51edf2cadfSBlake Jones if ! perf script --show-bpf-events -i "${perfdata}" | awk ' 52edf2cadfSBlake Jones /PERF_RECORD_BPF_METADATA.*perf_sample_filter/ { 53edf2cadfSBlake Jones header = 1; 54edf2cadfSBlake Jones } 55edf2cadfSBlake Jones /^ *entry/ { 56edf2cadfSBlake Jones if (header) { header = 0; entry = 1; } 57edf2cadfSBlake Jones } 58edf2cadfSBlake Jones $0 !~ /^ *entry/ { 59edf2cadfSBlake Jones entry = 0; 60edf2cadfSBlake Jones } 61edf2cadfSBlake Jones /perf_version/ { 62edf2cadfSBlake Jones if (entry) print $NF; 63edf2cadfSBlake Jones } 64edf2cadfSBlake Jones ' | egrep "$VERS" > /dev/null 65edf2cadfSBlake Jones then 66edf2cadfSBlake Jones echo "Basic BPF metadata test [Failed invalid output]" 67edf2cadfSBlake Jones err=1 68edf2cadfSBlake Jones return 69edf2cadfSBlake Jones fi 70edf2cadfSBlake Jones echo "Basic BPF metadata test [Success]" 71edf2cadfSBlake Jones} 72edf2cadfSBlake Jones 73edf2cadfSBlake Jonestest_bpf_metadata 74edf2cadfSBlake Jones 75edf2cadfSBlake Jonescleanup 76edf2cadfSBlake Jonesexit $err 77