#!/bin/sh # perf record sample filtering (by BPF) tests # 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_filter_priv() { echo "Checking BPF-filter privilege" if [ "$(id -u)" != 0 ] then echo "bpf-filter test [Skipped permission]" err=2 return fi if ! perf record -e task-clock --filter 'period > 1' \ -o /dev/null --quiet true 2>&1 then echo "bpf-filter test [Skipped missing BPF support]" err=2 return fi } test_bpf_filter_basic() { echo "Basic bpf-filter test" if ! perf record -e task-clock -c 10000 --filter 'ip < 0xffffffff00000000' \ -o "${perfdata}" true 2> /dev/null then echo "Basic bpf-filter test [Failed record]" err=1 return fi if perf script -i "${perfdata}" -F ip | grep 'ffffffff[0-9a-f]*' then if uname -r | grep -q ^6.2 then echo "Basic bpf-filter test [Skipped unsupported kernel]" err=2 return fi echo "Basic bpf-filter test [Failed invalid output]" err=1 return fi echo "Basic bpf-filter test [Success]" } test_bpf_filter_fail() { echo "Failing bpf-filter test" # 'cpu' requires PERF_SAMPLE_CPU flag if ! perf record -e task-clock --filter 'cpu > 0' \ -o /dev/null true 2>&1 | grep PERF_SAMPLE_CPU then echo "Failing bpf-filter test [Failed forbidden CPU]" err=1 return fi if ! perf record --sample-cpu -e task-clock --filter 'cpu > 0' \ -o /dev/null true 2>/dev/null then echo "Failing bpf-filter test [Failed should succeed]" err=1 return fi echo "Failing bpf-filter test [Success]" } test_bpf_filter_group() { echo "Group bpf-filter test" if ! perf record -e task-clock --filter 'period > 1000 || ip > 0' \ -o /dev/null true 2>/dev/null then echo "Group bpf-filter test [Failed should succeed]" err=1 return fi if ! perf record -e task-clock --filter 'cpu > 0 || ip > 0' \ -o /dev/null true 2>&1 | grep PERF_SAMPLE_CPU then echo "Group bpf-filter test [Failed forbidden CPU]" err=1 return fi if ! perf record -e task-clock --filter 'period > 0 || code_pgsz > 4096' \ -o /dev/null true 2>&1 | grep PERF_SAMPLE_CODE_PAGE_SIZE then echo "Group bpf-filter test [Failed forbidden CODE_PAGE_SIZE]" err=1 return fi echo "Group bpf-filter test [Success]" } test_bpf_filter_priv if [ $err = 0 ]; then test_bpf_filter_basic fi if [ $err = 0 ]; then test_bpf_filter_fail fi if [ $err = 0 ]; then test_bpf_filter_group fi cleanup exit $err