19575ecddSNamhyung Kim#!/bin/sh
29575ecddSNamhyung Kim# perf record sample filtering (by BPF) tests
39575ecddSNamhyung Kim# SPDX-License-Identifier: GPL-2.0
49575ecddSNamhyung Kim
59575ecddSNamhyung Kimset -e
69575ecddSNamhyung Kim
79575ecddSNamhyung Kimerr=0
89575ecddSNamhyung Kimperfdata=$(mktemp /tmp/__perf_test.perf.data.XXXXX)
99575ecddSNamhyung Kim
109575ecddSNamhyung Kimcleanup() {
119575ecddSNamhyung Kim  rm -f "${perfdata}"
129575ecddSNamhyung Kim  rm -f "${perfdata}".old
139575ecddSNamhyung Kim  trap - EXIT TERM INT
149575ecddSNamhyung Kim}
159575ecddSNamhyung Kim
169575ecddSNamhyung Kimtrap_cleanup() {
179575ecddSNamhyung Kim  cleanup
189575ecddSNamhyung Kim  exit 1
199575ecddSNamhyung Kim}
209575ecddSNamhyung Kimtrap trap_cleanup EXIT TERM INT
219575ecddSNamhyung Kim
229575ecddSNamhyung Kimtest_bpf_filter_priv() {
239575ecddSNamhyung Kim  echo "Checking BPF-filter privilege"
249575ecddSNamhyung Kim
259575ecddSNamhyung Kim  if [ "$(id -u)" != 0 ]
269575ecddSNamhyung Kim  then
279575ecddSNamhyung Kim    echo "bpf-filter test [Skipped permission]"
289575ecddSNamhyung Kim    err=2
299575ecddSNamhyung Kim    return
309575ecddSNamhyung Kim  fi
319575ecddSNamhyung Kim  if ! perf record -e task-clock --filter 'period > 1' \
329575ecddSNamhyung Kim	  -o /dev/null --quiet true 2>&1
339575ecddSNamhyung Kim  then
349575ecddSNamhyung Kim    echo "bpf-filter test [Skipped missing BPF support]"
359575ecddSNamhyung Kim    err=2
369575ecddSNamhyung Kim    return
379575ecddSNamhyung Kim  fi
389575ecddSNamhyung Kim}
399575ecddSNamhyung Kim
409575ecddSNamhyung Kimtest_bpf_filter_basic() {
419575ecddSNamhyung Kim  echo "Basic bpf-filter test"
429575ecddSNamhyung Kim
439575ecddSNamhyung Kim  if ! perf record -e task-clock -c 10000 --filter 'ip < 0xffffffff00000000' \
449575ecddSNamhyung Kim	  -o "${perfdata}" true 2> /dev/null
459575ecddSNamhyung Kim  then
469575ecddSNamhyung Kim    echo "Basic bpf-filter test [Failed record]"
479575ecddSNamhyung Kim    err=1
489575ecddSNamhyung Kim    return
499575ecddSNamhyung Kim  fi
509575ecddSNamhyung Kim  if perf script -i "${perfdata}" -F ip | grep 'ffffffff[0-9a-f]*'
519575ecddSNamhyung Kim  then
52*11f5710dSNamhyung Kim    if uname -r | grep -q ^6.2
53*11f5710dSNamhyung Kim    then
54*11f5710dSNamhyung Kim      echo "Basic bpf-filter test [Skipped unsupported kernel]"
55*11f5710dSNamhyung Kim      err=2
56*11f5710dSNamhyung Kim      return
57*11f5710dSNamhyung Kim    fi
589575ecddSNamhyung Kim    echo "Basic bpf-filter test [Failed invalid output]"
599575ecddSNamhyung Kim    err=1
609575ecddSNamhyung Kim    return
619575ecddSNamhyung Kim  fi
629575ecddSNamhyung Kim  echo "Basic bpf-filter test [Success]"
639575ecddSNamhyung Kim}
649575ecddSNamhyung Kim
659575ecddSNamhyung Kimtest_bpf_filter_fail() {
669575ecddSNamhyung Kim  echo "Failing bpf-filter test"
679575ecddSNamhyung Kim
689575ecddSNamhyung Kim  # 'cpu' requires PERF_SAMPLE_CPU flag
699575ecddSNamhyung Kim  if ! perf record -e task-clock --filter 'cpu > 0' \
709575ecddSNamhyung Kim	  -o /dev/null true 2>&1 | grep PERF_SAMPLE_CPU
719575ecddSNamhyung Kim  then
729575ecddSNamhyung Kim    echo "Failing bpf-filter test [Failed forbidden CPU]"
739575ecddSNamhyung Kim    err=1
749575ecddSNamhyung Kim    return
759575ecddSNamhyung Kim  fi
769575ecddSNamhyung Kim
779575ecddSNamhyung Kim  if ! perf record --sample-cpu -e task-clock --filter 'cpu > 0' \
789575ecddSNamhyung Kim	  -o /dev/null true 2>/dev/null
799575ecddSNamhyung Kim  then
809575ecddSNamhyung Kim    echo "Failing bpf-filter test [Failed should succeed]"
819575ecddSNamhyung Kim    err=1
829575ecddSNamhyung Kim    return
839575ecddSNamhyung Kim  fi
849575ecddSNamhyung Kim
859575ecddSNamhyung Kim  echo "Failing bpf-filter test [Success]"
869575ecddSNamhyung Kim}
879575ecddSNamhyung Kim
889575ecddSNamhyung Kimtest_bpf_filter_group() {
899575ecddSNamhyung Kim  echo "Group bpf-filter test"
909575ecddSNamhyung Kim
919575ecddSNamhyung Kim  if ! perf record -e task-clock --filter 'period > 1000 || ip > 0' \
929575ecddSNamhyung Kim	  -o /dev/null true 2>/dev/null
939575ecddSNamhyung Kim  then
949575ecddSNamhyung Kim    echo "Group bpf-filter test [Failed should succeed]"
959575ecddSNamhyung Kim    err=1
969575ecddSNamhyung Kim    return
979575ecddSNamhyung Kim  fi
989575ecddSNamhyung Kim
999575ecddSNamhyung Kim  if ! perf record -e task-clock --filter 'cpu > 0 || ip > 0' \
1009575ecddSNamhyung Kim	  -o /dev/null true 2>&1 | grep PERF_SAMPLE_CPU
1019575ecddSNamhyung Kim  then
1029575ecddSNamhyung Kim    echo "Group bpf-filter test [Failed forbidden CPU]"
1039575ecddSNamhyung Kim    err=1
1049575ecddSNamhyung Kim    return
1059575ecddSNamhyung Kim  fi
1069575ecddSNamhyung Kim
1079575ecddSNamhyung Kim  if ! perf record -e task-clock --filter 'period > 0 || code_pgsz > 4096' \
1089575ecddSNamhyung Kim	  -o /dev/null true 2>&1 | grep PERF_SAMPLE_CODE_PAGE_SIZE
1099575ecddSNamhyung Kim  then
1109575ecddSNamhyung Kim    echo "Group bpf-filter test [Failed forbidden CODE_PAGE_SIZE]"
1119575ecddSNamhyung Kim    err=1
1129575ecddSNamhyung Kim    return
1139575ecddSNamhyung Kim  fi
1149575ecddSNamhyung Kim
1159575ecddSNamhyung Kim  echo "Group bpf-filter test [Success]"
1169575ecddSNamhyung Kim}
1179575ecddSNamhyung Kim
1189575ecddSNamhyung Kim
1199575ecddSNamhyung Kimtest_bpf_filter_priv
1209575ecddSNamhyung Kim
1219575ecddSNamhyung Kimif [ $err = 0 ]; then
1229575ecddSNamhyung Kim  test_bpf_filter_basic
1239575ecddSNamhyung Kimfi
1249575ecddSNamhyung Kim
1259575ecddSNamhyung Kimif [ $err = 0 ]; then
1269575ecddSNamhyung Kim  test_bpf_filter_fail
1279575ecddSNamhyung Kimfi
1289575ecddSNamhyung Kim
1299575ecddSNamhyung Kimif [ $err = 0 ]; then
1309575ecddSNamhyung Kim  test_bpf_filter_group
1319575ecddSNamhyung Kimfi
1329575ecddSNamhyung Kim
1339575ecddSNamhyung Kimcleanup
1349575ecddSNamhyung Kimexit $err
135