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